首页
社区
课程
招聘
[求助]动态获取API函数地址(WIN32汇编)
发表于: 2008-11-2 19:04 6342

[求助]动态获取API函数地址(WIN32汇编)

2008-11-2 19:04
6342
mov        edi,[esp]
and        edi,0ffff0000h       /这是对齐页起始地址
.while        TRUE
    .if        word ptr [edi] == IMAGE_DOS_SIGNATURE
        mov        esi,edi
        add        esi,[esi+003ch]
        .if word ptr [esi] == IMAGE_NT_SIGNATURE
            mov        @dwReturn,edi
            .break
        .endif
    .endif
        sub        edi,010000h
        .break        .if edi < 070000000h
.endw

我想问下,为什么是 and      edi,0ffff0000h,我知道一页好像是4K,那么页的起始地址应该是0fffff000。我感觉它这里的一页好像是64k。
其次就是,.break   .if edi <070000000h   这句有什么用?据我所知DLL文件的优先装入地址是010000000h 那么很可能一开始edi就小于070000000h了。

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 230
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
windows 下进程加载 Dll 的起始地址都是按 64k 边界对齐的
2008-11-3 19:16
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
3
DLL的实际装入地址不在01000000
这一段严格来说,应该是找kernel32.dll的基址,因为程序在入口点处的[esp]值,在kernel32.dll中。
找到了kernel32.dll的基址之后,通过查找其输出表,就可以找到LoadLibraryA和GetProcAddress这两个关键API的地址,然后再利用这两个函数得到其他API的地址(或者仍然通过查找输出表得到)。
以上就是动态获取API函数地址的主要步骤,壳和shellcode中的相应代码在原理上基本都是这样的
2008-11-3 22:41
0
游客
登录 | 注册 方可回帖
返回