首页
社区
课程
招聘
[请 教] 如何分析失效函数?
发表于: 2006-8-15 12:30 5224

[请 教] 如何分析失效函数?

2006-8-15 12:30
5224
请大家畅所欲言,如何分析失效函数?求这方面的详尽知识!!!!

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
比如:ImportREC中一个失效函数
rva:0026B0D4 ptr:010D050C

OD中,Ctrl+G 转到 010D050C
010D050C    55                 push ebp
010D050D    8BEC               mov ebp,esp
010D050F    6A FF              push -1
010D0511    68 B023E677        push 77E623B0
010D0516    68 441FEB77        push 77EB1F44  //~= kernel32.dll/02E1/UTUnRegister
010D051B    64:A1 00000000     mov eax,dword ptr fs:[0]
010D0521    50                 push eax
010D0522    64:8925 00000000   mov dword ptr fs:[0],esp
010D0529    51                 push ecx
010D052A    51                 push ecx
010D052B    53                 push ebx
010D052C    56                 push esi
010D052D    57                 push edi
010D052E    68 73F2E777        push 77E7F273 // ~= kernel32.dll/032C/lstrcat
010D0533    C3                 retn

如何确定它指向的函数? 请帮忙讲明原因,而非答案.
2006-8-16 16:31
0
雪    币: 47147
活跃值: (20380)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
有效函数是lstrcat

这段代码前面是垃圾,有效的就是:
010D052E   push 77E7F273 // ~= kernel32.dll/032C/lstrcat
010D0533   retn

会跳到lstrcat函数执行,因此这个就是lstrcat函数
2006-8-16 16:36
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最初由 kanxue 发布
有效函数是lstrcat

这段代码前面是垃圾,有效的就是:
010D052E push 77E7F273 // ~= kernel32.dll/032C/lstrcat
010D0533 retn
........


谢谢坛主的热心,但是我还是不太理解,能不能大致分析一下?

010D0538  55                        push ebp
010D0539  8BEC                      mov ebp,esp
010D053B  6A FF                     push -1
010D053D  68 3024E677               push 77E62430
010D0542  68 441FEB77               push 77EB1F44    // ~= kernel32.dll/02E1/UTUnRegister
010D0547  64:A1 00000000            mov eax,fs:[0]
010D054D  50                        push eax
010D054E  64:8925 00000000          mov fs:[0],esp
010D0555  51                        push ecx
010D0556  51                        push ecx
010D0557  83EC 0C                   sub esp,C
010D055A  53                        push ebx
010D055B  56                        push esi
010D055C  57                        push edi
010D055D  68 4A96E677               push 77E6964A    // ~= kernel32.dll/01F2/LocalLock
010D0562  C3                        retn
这个按坛主的说法,有效函数应该是LocalLock,但是我不明白Why啊.
2006-8-16 16:47
0
雪    币: 47147
活跃值: (20380)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
2楼己给出分析过程中,可能我表达有问题。

010D0538  55                        push ebp
010D0539  8BEC                      mov ebp,esp
010D053B  6A FF                     push -1
010D053D  68 3024E677               push 77E62430
010D0542  68 441FEB77               push 77EB1F44    // ~= kernel32.dll/02E1/UTUnRegister
010D0547  64:A1 00000000            mov eax,fs:[0]
010D054D  50                        push eax
010D054E  64:8925 00000000          mov fs:[0],esp
010D0555  51                        push ecx
010D0556  51                        push ecx
010D0557  83EC 0C                   sub esp,C
010D055A  53                        push ebx
010D055B  56                        push esi
010D055C  57                        push edi
010D055D  68 4A96E677               push 77E6964A    // ~= kernel32.dll/01F2/LocalLock
010D0562  C3                        retn

这一段代码是在外壳中,程序跑这段代码目的是跳到某个函数中去,其中最后2句:

010D055D  68 4A96E677               push 77E6964A    // ~= kernel32.dll/01F2/LocalLock
010D0562  C3                        retn

相当于:
jmp  77E6964A //即jmp kernel32.dll_LocalLock

也就是说,你如果单步跟踪这段代码,会来到LocalLock函数里,所以这个就是LocalLock函数。
(真正有效的是最后两句,其他全是垃圾代码,迷惑你的)
2006-8-16 17:00
0
雪    币: 184
活跃值: (108)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
6
这个是利用了 push api retn的方法来迷惑你的,也就是进一个迷惑代码段,然后用堆栈传递真正的API地址,然后retn到真正的api地址去.

前面的是seh,不用管.
2006-8-16 17:15
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
最初由 kanxue 发布
2楼己给出分析过程中,可能我表达有问题。

010D0538 55 push ebp
010D0539 8BEC mov ebp,esp
010D053B 6A FF push -1
........


谢谢坛主,豁然开然!! 结贴! :)

以下是刚收集到的知识,供像我一样对于为什么一push,一retn 就等于jmp的不懂的人参考参考:

Call的寻址方式与jmp基本相同,但为了从子程序返回,该指令在跳转以前会把紧接着它的下一条指令的地址压进堆栈。如果是段内调用(目标地址是32位偏移量),则压入的也只是一个偏移量。如果是段间调用(目标地址是48位全地址),则也压入下一条指令的完全地址。同样,如果段间转移涉及优先级的变化,则有一系列复杂的保护检查。

与之对应retn/retf指令则从子程序返回。它从堆栈上取得返回地址(是call指令压进去的)并跳到该地址执行。retn取32位偏移量作段内返回,retf取48位全地址作段间返回。retn/f 还可以跟一个立即数作为操作数,该数实际上是从堆栈上传给子程序的参数的个数(以字计)返回后自动把堆栈指针esp加上指定的数*2,从而丢弃堆栈中的参数。
2006-8-16 17:23
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
最初由 hnhuqiong 发布
这个是利用了 push api retn的方法来迷惑你的,也就是进一个迷惑代码段,然后用堆栈传递真正的API地址,然后retn到真正的api地址去.

前面的是seh,不用管.


恩,明白了!
2006-8-16 17:24
0
游客
登录 | 注册 方可回帖
返回
//