首页
社区
课程
招聘
[求助]第五章API定位
发表于: 2009-4-8 09:12 5258

[求助]第五章API定位

2009-4-8 09:12
5258
; push a pointer to "user32" onto stack
mov bx, 0x3233                 ; rest of ebx is null
push ebx
push 0x72657375
push esp
                       
这几句是干嘛用的没看懂 -_-!

0x3233和0x72657375是什么?

还有这段

find_functions:
pushad                         ; preserve registers
mov eax, [ebp + 0x3c]        ; eax = start of PE header
mov ecx, [ebp + eax + 0x78]        ; ecx = relative offset of export table
add ecx, ebp                 ; ecx = absolute addr of export table
mov ebx, [ecx + 0x20]         ; ebx = relative offset of names table
add ebx, ebp                 ; ebx = absolute addr of names table
xor edi, edi                 ; edi will count through the functions

其中这两句
mov ecx, [ebp + eax + 0x78]        ; ecx = relative offset of export table
add ecx, ebp                 ; ecx = absolute addr of export table
为什么还要加ebp呢,这里的eax是偏移量啊?

谢谢哦

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 237
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
xchg eax, ebp                 ; save current hash
call [edi - 0x8]                 ; LoadLibraryA
xchg eax, ebp                 ; restore current hash, and update ebp
                        ; with base address of user32.dll

call [edi-0x8] 这里面edi-0x8里面是什么啊,里面不是应该是shellcode的内容吗,这个call怎么是LoadLiberary呢
2009-4-8 12:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
人家注释的很明白了哦~~~~·
建议你学习一下 PE文件结构吧~~~
另,给你解释一下这个程序,我个人的理解,不一定准确:

find_functions:
pushad       ; 寄存器压栈
mov eax, [ebp + 0x3c]  ; 这里的EBP是文件的起始位置,eax中存放的是“PE”签名
mov ecx, [ebp + eax + 0x78]  ; 从PE签名处开始偏移第0x78的地方存放的是导出表的偏移,把它放在ECX中
add ecx, ebp     ; ecx = 文件头+输出表的偏移就来到PE的输出表了

下面的都不做注释了,是同一个问题,至于LoadLiberary我感觉,LZ好好学下编程基础吧~~~

莫在浮沙筑高台,希望与LZ共同学习
2009-4-8 14:31
0
雪    币: 237
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢哦,能不能给我解释下 push a pointer to "user32" onto stack  和 LoadLiberary那2处地方啊,实在是搞不明白

汇编我还是能看懂大概的,多谢啊,急着想知道原因呢
2009-4-8 17:08
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
一般的,要使用一个API函数,需要先知道它是从那个DLL库中导出的!
而LoadLibraryA 就是取得这个DLL的模块句柄的函数,它的参数是DLL的名字!

xchg eax, ebp ; save current hash 
call [edi - 0x8] ; LoadLibraryA 
xchg eax, ebp ; restore current hash, and update ebp 
; with base address of user32.dll 
 

上述代码中[edi - 0x8]的值就是LoadLibraryA 函数的首地址,你可以把它理解成一个BYTE类型的数组就成~~~
直接调用这个函数,就可以得到这个模块的句柄了,然后在用GetProcAddress等获取你需要的函数的首地址,然后使用就成~~~

我知道的也就这么多,再不明白,你可以自己百度·~~
2009-4-8 17:20
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这个建议你去把PE格式弄清楚就明白了 就是偏移量的问题 偏移+基址就是虚拟地址了
2009-4-8 22:39
0
雪    币: 237
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢大家啊

mov bx, 0x3233     ; rest of ebx is null
push ebx
push 0x72657375
push esp
这几个是call [edi - 0x8] 的参数是吧,这个0x72657375 是LoadLiberary的地址啊?是固定的啊?所有平台都是这个地址啊?
2009-4-9 17:08
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
[QUOTE=hkai;604122]谢谢大家啊

mov bx, 0x3233     ; rest of ebx is null
push ebx
push 0x72657375
push esp
这几个是call [edi - 0x8] 的参数是吧,这个0x72657375 是LoadLiberary的地址啊?...[/QUOTE]

我的理解:
call [edi -0x8]就是call LoadLibraryA("user32"), 已经找到的LoadLibraryA函数的地址就存在[edi-0x8]
对于函数调用来说,调用之前必须将其参数压栈,这就是上面几个push的作用,具体如下:
#1,先要明白,0x3233,还有0x72657375是user32的ASCII码,先将"user32"这个字符串压到栈里,就是
mov bx, 0x3233
push ebx                 ;压入0x3233  "32"
push 0x72657375   ;压入"user"
#2,此时的esp指向"user32"字符串,所以把esp压栈就相当于把"user32"的地址压栈,即
push esp
#3,此时就可以呼叫LoadLibraryA函数了,即之后调用函数处的
call [edi - 0x8]
2009-4-11 09:45
0
游客
登录 | 注册 方可回帖
返回
//