今天逆向一个木马的时候有点小心得,希望能对我这样的菜们有所帮助哈~
出现了一段代码,貌似很乱无意义:
00402E28 E8 09000000 CALL t.00402E36
00402E2D 61 POPAD
00402E2E 64:76 61 JBE SHORT t.00402E92
00402E31 70 69 JO SHORT t.00402E9C
00402E33 3332 XOR ESI,DWORD PTR DS:[EDX]
00402E35 00FF ADD BH,BH
00402E37 95 XCHG EAX,EBP
00402E38 21F1 AND ECX,ESI
00402E3A FFFF ???
00402E3C 8985 57FBFFFF MOV DWORD PTR SS:[EBP-4A9],EAX
执行的时候变成:
…………(看不到,向上翻就变回去了。以为是花指令,没管它继续向下执行)
00402E36 FF95 21F1FFFF CALL DWORD PTR SS:[EBP-EDF] ;kernel32.LoadLibraryA
00402E3C 8985 57FBFFFF MOV DWORD PTR SS:[EBP-4A9],EAX
而且居然还能顺利运行,并返回结果advapi32.77DA0000
觉得非常奇怪,为什么没有push参数却能执行呢?
重新执行一遍,观察堆栈。发现call LoadLibraryA之前ESP为:
0012EFB4 00402E2D 返回到 t.00402E2D 来自 t.00402E36
这是没错的,因为前面的call会将其下一句压栈。难道返回地址也能做参数?
……
突然灵光一闪(不是一下子就想出来的,惭愧啊惭愧)
中间那段根本不是代码也不是花指令,而是字符串!
数据与代码的混合使反汇编出现无意义代码。00其实是字符串的结尾。LoadLibrary的参数是指向字符串的指针,而那个返回值就指向字符串的首地址。所有的都解释得通了。
在IDA中修正后的代码(OD中要怎么做?请指导一下……):
DATA:00402E28 call loc_402E36
DATA:00402E28 ; ---------------------------------------------------------------------------
DATA:00402E2D aAdvapi32 db 'advapi32',0
DATA:00402E36 ; ---------------------------------------------------------------------------
DATA:00402E36
DATA:00402E36 loc_402E36: ; CODE XREF: DATA:00402E28 p
DATA:00402E36 call dword ptr [ebp-0EDFh]
DATA:00402E3C mov [ebp-4A9h], eax
这是一种利用call传递参数的方法。终于可以上网搜了(一开始根本无从下手,不知道要搜什么……)。原来在shellcode编写中是常用技巧。
虽然可能是很基本的东西,但在不知道的情况下,能自己分析解决,并学到一些东西,还是小有成就感的。
- 标 题:利用call传递静态参数
- 作 者:trucce
- 时 间:2009-08-18 10:31
- 链 接:http://bbs.pediy.com/showthread.php?t=95985