能力值:
( 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
如何确定它指向的函数? 请帮忙讲明原因,而非答案.
|
能力值:
(RANK:350 )
|
-
-
3 楼
有效函数是lstrcat
这段代码前面是垃圾,有效的就是:
010D052E push 77E7F273 // ~= kernel32.dll/032C/lstrcat
010D0533 retn
会跳到lstrcat函数执行,因此这个就是lstrcat函数
|
能力值:
( 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啊.
|
能力值:
(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函数。
(真正有效的是最后两句,其他全是垃圾代码,迷惑你的)
|
能力值:
( LV9,RANK:410 )
|
-
-
6 楼
这个是利用了 push api retn的方法来迷惑你的,也就是进一个迷惑代码段,然后用堆栈传递真正的API地址,然后retn到真正的api地址去.
前面的是seh,不用管.
|
能力值:
( 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,从而丢弃堆栈中的参数。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
最初由 hnhuqiong 发布 这个是利用了 push api retn的方法来迷惑你的,也就是进一个迷惑代码段,然后用堆栈传递真正的API地址,然后retn到真正的api地址去.
前面的是seh,不用管.
恩,明白了!
|
|
|