首页
社区
课程
招聘
[原创]getprocaddress asm版本
发表于: 2009-3-7 17:50 13414

[原创]getprocaddress asm版本

2009-3-7 17:50
13414

近日,钱老师讲DLL导出表,课堂用ASM代码实现GetProcAddr,惜课堂时间太短,难免仓促,我现下把代码补全,算是狗尾续貂了。嘿嘿

  MyGetProcAddr proc hMod:DWORD,ProcName:DWORD
        mov ebx,hMod
        assume ebx:ptr IMAGE_DOS_HEADER
        add ebx,[ebx].e_lfanew
        add ebx,4
        add ebx,sizeof IMAGE_FILE_HEADER
        assume ebx:nothing
        assume ebx:ptr IMAGE_OPTIONAL_HEADER32
        lea ebx,[ebx].DataDirectory
        assume ebx:ptr IMAGE_DATA_DIRECTORY
        mov ebx,[ebx].VirtualAddress
        add ebx,hMod;
        assume ebx:ptr IMAGE_EXPORT_DIRECTORY
        ;如果调用参数为名称。
        .if ProcName > 0ffffh;

                xor edx,edx  ;串指令会修改ECX,这里用EDX做计数器。
                .while edx < [ebx].NumberOfNames
                       
                        mov edi,ProcName         ;获取字串长度是否。
                        xor al,al
                        mov ecx,-1
                        repnz scasb
                        not ecx                  ;ECX为字串长度,包含\0
                       
                        ;字串比较
                        mov edi,ProcName
                        mov esi,[ebx].AddressOfNames
                        add esi,hMod
                        lea esi,[esi+4*edx]
                        mov esi,[esi]
                        add esi,hMod                       
                        repz cmpsb
                        lahf
                        .if ecx == 0
                                .break
                        .endif                               
                        inc edx
                .endw
                .if edx == [ebx].NumberOfNames  ;表示没找到
                        mov eax,0
                        ret
                .endif
                mov eax,[ebx].AddressOfNameOrdinals
                add eax,hMod;
                movzx eax,WORD ptr [eax+2*edx]
               
        ;序号方式调用。
        .else
                mov eax,ProcName
                sub eax,[ebx].nBase         ;从序号到索引               
                .if eax < 0                                        ;判断是序号否在范围内
                        xor eax,eax
                        ret
                .endif               
                mov edx,[ebx].NumberOfFunctions
                .if eax >edx
                         xor eax,eax
                         ret
                .endif               
        .endif
        ;根据序号找寻函数地址       
ORDER:
        mov edx,[ebx].AddressOfFunctions
        add edx,hMod;
        mov eax,[edx+4*eax]
        add eax,hMod
        ret

MyGetProcAddr endp
此段代码关键点在于:
1.不能破坏堆栈环境
2.不能动态调用DLL里的函数
在做溢出的时候是非常有用的,实乃 “居家旅行,杀人灭口”之必备。。


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

收藏
免费 7
支持
分享
最新回复 (5)
雪    币: 1829
活跃值: (1372)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
2
写的不错。但是做溢出的时候,这段代码还要精简一些才好。最好是哈希方式调用。
2009-3-8 16:45
0
雪    币: 86
活跃值: (34)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
3
哈希方式调用,不懂。。。BAIDU去。。。。。
2009-3-8 18:22
0
雪    币: 1829
活跃值: (1372)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
4
关键字:API 哈希
2009-3-8 19:56
0
雪    币: 334
活跃值: (22)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
我现下把代码补全,算是狗尾续貂了。

LZ这话牛X呀
2009-4-7 17:15
0
雪    币: 37
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
先看看再说话!
2009-4-30 00:58
0
游客
登录 | 注册 方可回帖
返回
//