首页
社区
课程
招聘
[旧帖] [求助]获取32位程序 ip等地址错误 0.00雪花
发表于: 2012-8-17 15:46 1192

[旧帖] [求助]获取32位程序 ip等地址错误 0.00雪花

2012-8-17 15:46
1192
本程序原本是一个 获取32位程序 ip等地址的程序 我现在改成pe32+
中间取值可能有些问题
不过导出表函数我是找到了。
问题可能是在
        if(strcmp(FunctionName, szFun) == 0)
        {
           WORD Ordinal=ppdwOrdin[i];  
                *pFunOffSet = ((DWORD*)ppdwAddr)[Ordinal];
                return true;
        }

不说了上代码
bool GetProcAddress64( LPCTSTR lpMemFile, char *FunctionName, DWORD *pFunOffSet)
{
        PIMAGE_NT_HEADERS64 pinths64;
        PIMAGE_DOS_HEADER pdih;

        pdih=(PIMAGE_DOS_HEADER)lpMemFile;
        pinths64=(PIMAGE_NT_HEADERS64)(lpMemFile+pdih->e_lfanew);

        if(pinths64->Signature!=0x00004550)
        {
                MessageBox(NULL,"无效的PE文件!","1",NULL);
                return false;
        }
        if(pinths64->OptionalHeader.Magic!=0x20b)
        {
                MessageBox(NULL,"不是PE32+格式的文件!","1",NULL);
                return false;
        }

        PIMAGE_EXPORT_DIRECTORY pied;
        pied=(PIMAGE_EXPORT_DIRECTORY)ImageRvaToVa((PIMAGE_NT_HEADERS)pinths64,pdih,pinths64->OptionalHeader.DataDirectory[0].VirtualAddress,NULL);
        DWORD i = 0;
        DWORD NumberOfNames = pied->NumberOfNames;
        ULONGLONG **ppdwNames = (ULONGLONG **)pied->AddressOfNames;
        ppdwNames = (PULONGLONG*)ImageRvaToVa((PIMAGE_NT_HEADERS)pinths64,pdih,(ULONG)ppdwNames,NULL);
        ULONGLONG **ppdwAddr = (ULONGLONG **)pied->AddressOfFunctions;
        ppdwAddr = (PULONGLONG*)ImageRvaToVa((PIMAGE_NT_HEADERS)pinths64,pdih,(DWORD)ppdwAddr,NULL);
        ULONGLONG *ppdwOrdin=(ULONGLONG*)ImageRvaToVa((PIMAGE_NT_HEADERS)pinths64,pdih,(DWORD)pied->AddressOfNameOrdinals,NULL);
        char* szFun=(PSTR)ImageRvaToVa((PIMAGE_NT_HEADERS)pinths64,pdih,(ULONG)*ppdwNames,NULL);

        for(i=0; i<NumberOfNames; i++)
        {
                printf("%0.4x\t%0.8x\t%s\n",i+1,*ppdwAddr,szFun);

                if(strcmp(FunctionName, szFun) == 0)
                {
            WORD Ordinal=ppdwOrdin[i];  
                        *pFunOffSet = ((DWORD*)ppdwAddr)[Ordinal];

                        return true;
                }

                szFun=szFun + strlen(szFun)+1;
        }

        return false;
}

bool GetConfigInfo()
{
        HANDLE hFile;
        HANDLE hFileMapping;
        LPVOID lpFileBase;

        hFile = CreateFile(FilePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
                        NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
        if(hFile == INVALID_HANDLE_VALUE)
        {
                return false;
        }

        hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
        if(hFileMapping == 0)
        {
                CloseHandle(hFile);
                return false;
        }

        lpFileBase = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
        if(lpFileBase == 0)
        {
                CloseHandle(hFileMapping);
                CloseHandle(hFile);
                return false;
        }

        ///////////
        char *pFun_szIP, *pFun_dllName;
        int *pFun_Port;
        BOOL *pFun_AutoDel;
        DWORD szIPoffset, Portoffset, AutoDeloffset, dllNameoffset;

        if(!GetProcAddress64((LPCTSTR)lpFileBase, "Port", &Portoffset))
        {
                sprintf(Temp, "选择的文件不正确。");
                goto error;
        }
        pFun_Port = (int*)((BYTE*)lpFileBase + Portoffset);
        sprintf(Temp, "%s", *pFun_Port);
        MessageBox(NULL,Temp,"Port",NULL);

        if(!GetProcAddress64((LPCTSTR)lpFileBase, "szIP", &szIPoffset))
        {
                sprintf(Temp, "选择的文件不正确。");
                goto error;
        }

        if(!GetProcAddress64((LPCTSTR)lpFileBase, "AutoDel", &AutoDeloffset))
        {
                sprintf(Temp, "选择的文件不正确。");
                goto error;
        }

        if(!GetProcAddress64((LPCTSTR)lpFileBase, "dllName", &dllNameoffset))
        {
                sprintf(Temp, "选择的文件不正确。");
                goto error;
        }

        pFun_szIP = (char*)((BYTE*)lpFileBase + szIPoffset);
        pFun_dllName = (char*)((BYTE*)lpFileBase + dllNameoffset);
        pFun_Port = (int*)((BYTE*)lpFileBase + Portoffset);
        pFun_AutoDel = (BOOL*)((BYTE*)lpFileBase + AutoDeloffset);

        SetDlgItemText(Main.hWnd, IDC_PORT, Temp);

        DoXOR(0x1985, Temp, 99);

        SetDlgItemText(Main.hWnd, IDC_URL, Temp);

        sprintf(Temp, "%s", DelSpace(pFun_dllName));

        SetDlgItemText(Main.hWnd, IDC_DLLNAME, Temp);

        while((BST_CHECKED == IsDlgButtonChecked(Main.hWnd, IDC_AUTODEL)) != (*pFun_AutoDel!=0))
        {
                SendDlgItemMessage(Main.hWnd, IDC_AUTODEL, BM_CLICK, 0, 0);
        }

        UnmapViewOfFile(lpFileBase);
        CloseHandle(hFileMapping);
        CloseHandle(hFile);
        return true;
error:
        UnmapViewOfFile(lpFileBase);
        CloseHandle(hFileMapping);
        CloseHandle(hFile);
        return false;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//