外壳将部分系统函数的前几个字节放到用自己分配的空间,然后再转到系统函数运行
如:
003D0000 8BFF mov edi, edi
003D0002 55 push ebp
003D0003 8BEC mov ebp, esp
003D0005 837D 08 00 cmp dword ptr [ebp+8], 0
003D0009 53 push ebx
003D000A 56 push esi
003D000B 68 821D807C push 7C801D82
003D0010 C3 retn
7C801D77 > 8BFF mov edi, edi
7C801D79 55 push ebp
7C801D7A 8BEC mov ebp, esp
7C801D7C 837D 08 00 cmp dword ptr [ebp+8], 0
7C801D80 53 push ebx
7C801D81 56 push esi
7C801D82 74 14 je short 7C801D98
以上两段是不是很象呢?第二段是系统函数LoadLibraryA的代码,第一段是外壳分配的空间,并将LoadLibraryA的前10个字节搬了进去,在地址003D000B处push 7C801D82,
Retn后回到系统代码。
怎样找到所有被这样处理过的函数呢?
对VirtualAlloc设断,得到:
返回地址 Address Size 分配地址
VirtualAlloc: 40A537 0 43000 A10000
VirtualAlloc: 40A565 0 43000 A60000
VirtualFree: 40A646 A10000
VirtualAlloc: AA10CA 0 546 3C0000
VirtualFree: AA1101 3C0000
VirtualAlloc: AA1349 0 31400 3C0000
VirtualFree: AA13E5 3C0000
VirtualAlloc: AA1349 0 A00 3C0000
VirtualFree: AA13E5 3C0000
VirtualAlloc: AA1349 0 1000 3C0000
VirtualFree: AA13E5 3C0000
VirtualAlloc: AA1349 0 2600 3C0000
VirtualFree: AA13E5 3C0000
VirtualAlloc: A61404 0 100000 AB0000
VirtualAlloc: A615D6 AB0000 4000 AB0000
VirtualAlloc: A615D6 AB4000 14000 AB4000
VirtualFree: A61657 AC4000
VirtualAlloc: A615D6 AC4000 8000 AC4000
VirtualAlloc: A615D6 ACC000 8000 ACC000
VirtualFree: A61657 AC4000
VirtualAlloc: A615D6 AD4000 8000 AD4000
VirtualFree: A61657 AD0000
VirtualFree: A61657 AC8000
VirtualAlloc: A7E7C2 0 1D 3C0000
VirtualAlloc: A7E7C2 0 15 3D0000
VirtualAlloc: A7E7C2 0 25 3E0000
VirtualAlloc: A7E7C2 0 16 3F0000
VirtualAlloc: A7E7C2 0 16 BB0000
VirtualAlloc: A7E7C2 0 22 BC0000
VirtualAlloc: A7E7C2 0 1E BD0000
VirtualAlloc: A7E7C2 0 17 BE0000
VirtualAlloc: A7E7C2 0 17 BF0000
VirtualAlloc: A7E7C2 0 15 C00000
VirtualAlloc: A7E7C2 0 29 C10000
VirtualAlloc: A7E7C2 0 22 C20000
看看最下面这几行,分配的空间不是很大,很可能是,事实确实这样。你可已找一两个地方看看嘛。。。
随便找一个,比如对3D0000设内存写入断点(要确定它已分配),为此可写个脚本:
var VirtualAllocaddr
checkver:
//check ollyscript’s version
cmp $VERSION,"0.9"
ja start
msg "version bad!"
ret
start:
gpa "VirtualAlloc","kernel32.dll"
mov VirtualAllocaddr,$RESULT
bp VirtualAllocaddr //在VirtualAlloc设断
continue:
run
rtr
cmp eax,003D0000
jne continue
ret
虽然对3D0000设内存写入断点并断下,你不会知道它是哪个函数,只有在下一个VirtualAlloc调用前仔细跟踪。
Olly的run跟踪到调用下一个VirtualAlloc前的代码为:
00A87337 主 cmp &nbs
