首页
社区
课程
招聘
这是最近学习 PE 结构写的 GetProcAddress 汇编版[原创]
发表于: 2005-12-23 19:09 12909

这是最近学习 PE 结构写的 GetProcAddress 汇编版[原创]

dummy 活跃值
23
2005-12-23 19:09
12909

; *****************************************
; GetAPIAddress
; ebx = hModule
; esi = lpszProcName
; eax = api address
; *****************************************
GetAPIAddress                proc
                                        pushad

; *******************************************
; 检查是否是有效的 PE 文件格式                                *
; *******************************************
                                        cmp                word ptr [ebx], 'ZM'
                                        jne                __@@1_GetAPIAddress                ;是不是有效的 PE 文件

                                        mov                eax, [ebx + 3CH]
                                        add                eax, ebx                                ;eax = PE Header
                                        cmp                dword ptr [eax], 00004550H        ;PE\0\0
                                        jne                __@@1_GetAPIAddress
                                               

; *******************************************
; 搜索需要的 API 地址
; *******************************************
;typedef struct _IMAGE_EXPORT_DIRECTORY
;{
;    DWORD   Characteristics;        // +0x00
;    DWORD   TimeDateStamp;          // +0x04
;    WORD    MajorVersion;           // +0x08
;    WORD    MinorVersion;           // +0x0a
;    DWORD   Name;                   // +0x0c Name of the DLL
;    DWORD   Base;                   // +0x10 Starting ordinal number for exports
;    DWORD   NumberOfFunctions;      // +0x14 Number of entries in the EAT
;    DWORD   NumberOfNames;          // +0x18 Number of entries in the ENPT/EOT
;    DWORD   AddressOfFunctions;     // +0x1c RVA from base of image
;    DWORD   AddressOfNames;         // +0x20 RVA from base of image
;    DWORD   AddressOfNameOrdinals;  // +0x24 RVA from base of image
;                                    // +0x28
;} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

                                        mov                edx, [eax + 04H + 14H + 60H]
                                        test        edx, edx
                                        jz                __@@1_GetAPIAddress                        ;没有输出表

                                        add                edx, ebx                                        ;计算输出表位置
                                        ;NumberOfFunctions
                                        mov                ecx, [edx + 18H]
                                        ;AddressOfNames
                                        mov                eax, [edx + 20H]                       
                                        add                eax, ebx
                                        ;AddressOfFunctions
                                        mov                ebp, [edx + 1CH]
                                        add                ebp, ebx
                                        ;AddressOfNameOrdinals
                                        mov                edx, [edx + 24H]
                                        add                edx, ebx

                                        dec                ecx
                                        cld
                                       
                                        push        eax
                                        xor                eax, eax
                __@@2_GetAPIAddress:
                                        inc                eax
                                        cmp                byte ptr [esi + eax], 0
                                        jne                __@@2_GetAPIAddress
                ;                        dec                eax
                                        xchg        eax, [esp]
                                       
                                        push        esi                        ;[esp] = esi
                                                                                ;[esp + 4] = strlen(lpszProcName)
                __@@FindNextExportFunction_GetAPIAddress:
                                        mov                edi, [eax + ecx * 4]
                                        add                edi, ebx                                        ;edi = API NAME
                                       
                                        push        ecx
                                        mov                ecx, [esp + 4 + 4]
                                        repz        cmpsb
                                        jnz                __@@3_GetAPIAddress
                                        test        ecx, ecx
                                        jnz                __@@3_GetAPIAddress
                                        ;找到匹配的字符串
                                        pop                ecx
                                        movzx        ecx, word ptr [edx + ecx * 2]
                                        mov                eax, [ebp + ecx * 4]
                                        add                eax, ebx                                        ;eax = API ADDRESS
                                        mov                [esp + 32 - 4 + 8], eax                                ;返回值
                                        jmp                __@@4_GetAPIAddress
                __@@3_GetAPIAddress:
                                        pop                ecx
                                        mov                esi, [esp]
                                        dec                ecx
                                        jns                __@@FindNextExportFunction_GetAPIAddress
                __@@4_GetAPIAddress:
                                        pop                ebx
                                        pop                ebx
                __@@1_GetAPIAddress:
                                        popad
                                        ret
GetAPIAddress                endp


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

收藏
免费 7
支持
分享
最新回复 (16)
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
支持!大小优化的很好!
2005-12-23 19:21
0
雪    币: 97697
活跃值: (200734)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
3
好文章.
2005-12-23 20:03
0
雪    币: 47147
活跃值: (20380)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
移动脱壳论坛交流。很多外壳都是自己实现GetProcAddress函数的。
2005-12-23 20:04
0
雪    币: 440
活跃值: (692)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
5
支持

好文章
2005-12-23 20:26
0
雪    币: 389
活跃值: (912)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
6
好文支持
2005-12-23 20:59
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
最初由 kanxue 发布
移动脱壳论坛交流。很多外壳都是自己实现GetProcAddress函数的。


不但是GetProcAddress函数,连LoadLibraryA函数都要自己实现.
2005-12-23 21:34
0
雪    币: 234
活跃值: (370)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
8
学习
2005-12-24 05:22
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
9
好文章。
2005-12-24 08:00
0
雪    币: 615
活跃值: (1197)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
; *******************************************
; 检查是否是有效的 PE 文件格式        *
; *******************************************
          cmp    word ptr [ebx], 'ZM'  <- 应该是'MZ'
          jne    __@@1_GetAPIAddress
感觉是e_magic  MZ
2005-12-24 11:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
试着去反汇编下sf的程序或者protect.dll吧,里面已经把get,load还有open什么的都已经像这样改编过了!!!
2005-12-24 12:19
0
雪    币: 272
活跃值: (143)
能力值: ( LV15,RANK:930 )
在线值:
发帖
回帖
粉丝
12
最初由 xzchina 发布
; *******************************************
; 检查是否是有效的 PE 文件格式 *
; *******************************************
cmp word ptr [ebx], 'ZM' <- 应该是'MZ'
jne __@@1_GetAPIAddress
........


在 masm 中必须这样写反过来,有些汇编器可以自动处理,不需要.

这个过程已经测试成功.
2005-12-24 14:44
0
雪    币: 538
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
高手啊..继续学习
2005-12-24 15:07
0
雪    币: 615
活跃值: (1197)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
引用:
____________________________________________________
最初由dummy发布:

;在 masm 中必须这样写反过来,有些汇编器可以自动处理,不需要.
;这个过程已经测试成功.
____________________________________________________
学习!
2005-12-24 17:50
0
雪    币: 234
活跃值: (104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
好文。有空了改成VC版。
2005-12-24 23:15
0
雪    币: 272
活跃值: (143)
能力值: ( LV15,RANK:930 )
在线值:
发帖
回帖
粉丝
16
FARPROC WINAPI MyGetProcAddress(HMODULE hModule, LPCSTR lpProcName)
{
        PIMAGE_DOS_HEADER pDOSHeader;
        PIMAGE_NT_HEADERS pNTHeader;
        PIMAGE_EXPORT_DIRECTORY pExportDir;
        LPCSTR *pFunctionName; /* 指向函数名数组 */
        LPCSTR pszFunName; /* 指向函数名 */
        LPDWORD pFunction;
        LPWORD pIndex;
        DWORD n; /* 以名字输出的函数的个数 */
        FARPROC ret = NULL; /* 返回值 */

        __try
        {
                if ((NULL == hModule) || (NULL == lpProcName)) __leave; /* 快速离开这里 */
               
                pDOSHeader = (PIMAGE_DOS_HEADER)hModule;
                if (IsBadReadPtr(pDOSHeader, sizeof(IMAGE_DOS_HEADER))) __leave;
                if (pDOSHeader->e_magic != IMAGE_DOS_SIGNATURE) __leave; /* 是不是有效的 DOS 文件头标志 */
               
                pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pDOSHeader + (DWORD)pDOSHeader->e_lfanew);
                if (pNTHeader->Signature != IMAGE_NT_SIGNATURE) __leave; /* 不是有效的 PE 文件头标志 */
               
                pExportDir = (PIMAGE_EXPORT_DIRECTORY)((DWORD)pDOSHeader + \
                        (DWORD)pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
                if ((DWORD)pExportDir == (DWORD)pDOSHeader) __leave; /* 没有输出表 */
               
                pFunctionName = (LPCSTR *)((DWORD)pExportDir->AddressOfNames + (DWORD)pDOSHeader);
                pFunction = (LPDWORD)((DWORD)pExportDir->AddressOfFunctions + (DWORD)pDOSHeader);
                pIndex = (LPWORD)((DWORD)pExportDir->AddressOfNameOrdinals + (DWORD)pDOSHeader);
                n = pExportDir->NumberOfNames;
               
                while (n--)
                {
                        pszFunName = (LPCSTR)((DWORD)*pFunctionName + (DWORD)pDOSHeader);
                        if (strcmp(pszFunName, lpProcName) == 0)
                        {
                                ret = (FARPROC)(pFunction[*pIndex] + (DWORD)pDOSHeader);
                                break;
                        }
                        pFunctionName++;
                        pIndex++;
                }
        }
        __finally
        {
                /* 什么也不需要做 */
        }

        return ret;
}
2005-12-25 12:53
0
雪    币: 213
活跃值: (96)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
对付破解看不出来有什么用,
2005-12-26 16:53
0
游客
登录 | 注册 方可回帖
返回
//