朋友给了我一个名叫“傀儡僵尸VIP1.4”的程序,说这个壳他脱不掉想让我看看,于是,我尝试着把这个壳脱掉了。
加壳信息:
文件名:傀儡僵尸VIP1.4.exe
PEiD:
入口点 :00045100
文件偏移:00016500
EP段 :.rdata
首字节 :60,BE,00,F0
加壳名称:“什么都没找到”
用PEiD查不出是什么壳,用OD打开显示出错,不过用OllyICE可以直接打开。可以用LoadPE先修复pe头。
用OllyICE载入后,入口是PUSHAD,然后找到了POPAD后,在445C6F处看到了一个段大跳,跳向441000这个地址。如下(如何找到POPAD就不用赘述了吧,会手动脱壳的都能找到这里,呵呵
):
00445100 > 60 pushad
00445101 BE 00F04200 mov esi, 0042F000
00445106 8DBE 0020FDFF lea edi, dword ptr [esi+FFFD2000]
0044510C 57 push edi
0044510D 89E5 mov ebp, esp
0044510F 8D9C24 80C1FFFF lea ebx, dword ptr [esp-3E80]
00445116 31C0 xor eax, eax
00445118 50 push eax
00445119 39DC cmp esp, ebx
0044511B ^ 75 FB jnz short 00445118
:
:
:
:
00445C60 58 pop eax
00445C61 61 popad
00445C62 8D4424 80 lea eax, dword ptr [esp-80]
00445C66 6A 00 push 0
00445C68 39C4 cmp esp, eax
00445C6A ^ 75 FA jnz short 00445C66
00445C6C 83EC 80 sub esp, -80
00445C6F ^ E9 8CB3FFFF jmp 00441000
00445C74 0000 add byte ptr [eax], al
到了441000处,往下步过一个call,到达44100D处的一个JMP跳走,如下:
00441000 68 E4274400 push 004427E4
00441005 E8 B8150000 call 004425C2
0044100A 8B6D 00 mov ebp, dword ptr [ebp]
0044100D E9 88160000 jmp 0044269A
00441012 53 push ebx
来到了44269A,往下走到了44269F处有个往回跳的条件转移,如果想跳过去,就会启动程序,显然不能过,只能往回跳,中间又遇到一个往回跳的JMP,只能再往回跳,来到了442510处,从这里慢慢往下走,结果又回到了44269A这里,这样就陷入了442510到44269A的一个循环中,经过查看中间的所有跳转,只有442662处的retn可以离开这个循环,于是,在这里下个断点,如下:
00442510 0FB606 movzx eax, byte ptr [esi]
00442513 66:98 cbw
00442515 98 cwde
00442516 83ED 04 sub ebp, 4
00442519 8945 00 mov dword ptr [ebp], eax
0044251C 46 inc esi
0044251D E9 78010000 jmp 0044269A
00442522 8B55 00 mov edx, dword ptr [ebp]
:
:
:
0044265E 5F pop edi
0044265F 5E pop esi
00442660 5F pop edi
00442661 5A pop edx
00442662 C3 retn
00442663 89E8 mov eax, ebp
00442665 83ED 04 sub ebp, 4
00442668 8945 00 mov dword ptr [ebp], eax
0044266B E9 2A000000 jmp 0044269A
00442670 8B45 00 mov eax, dword ptr [ebp]
00442673 0145 04 add dword ptr [ebp+4], eax
00442676 9C pushfd
00442677 8F45 00 pop dword ptr [ebp]
0044267A ^ E9 62FFFFFF jmp 004425E1
0044267F 8B45 00 mov eax, dword ptr [ebp]
00442682 8B55 04 mov edx, dword ptr [ebp+4]
00442685 8A4D 08 mov cl, byte ptr [ebp+8]
00442688 83C5 02 add ebp, 2
0044268B 0FADD0 shrd eax, edx, cl
0044268E 8945 04 mov dword ptr [ebp+4], eax
00442691 9C pushfd
00442692 8F45 00 pop dword ptr [ebp]
00442695 ^ E9 47FFFFFF jmp 004425E1
0044269A 8D47 50 lea eax, dword ptr [edi+50]
0044269D 39C5 cmp ebp, eax
0044269F ^ 0F87 3CFFFFFF ja 004425E1
004426A5 89E2 mov edx, esp
运行后,断在442662这里,F8从这里跳到了402525,如下:
004024F3 8917 mov dword ptr [edi], edx
004024F5 8E35 61909090 mov seg?, word ptr [90909061] ; 未定义的段寄存器
004024FB 60 pushad
004024FC B8 00104000 mov eax, 00401000
00402501 8130 90CD0E60 xor dword ptr [eax], 600ECD90
00402507 8128 94433B01 sub dword ptr [eax], 13B4394
0040250D 83C0 04 add eax, 4
00402510 3D F8244000 cmp eax, 004024F8
00402515 ^ 7C EA jl short 00402501
00402517 61 popad
00402518 ^ E9 D6FFFFFF jmp 004024F3
0040251D 58 pop eax
0040251E 2D 2F000000 sub eax, 2F
00402523 50 push eax
00402524 C3 retn
00402525 E8 F3FFFFFF call 0040251D
0040252A 0000 add byte ptr [eax], al
过了retn后到达402525这个位置,要F7跟进,到达40251D处,向下走到一个retn处,跳到了4024FB处,这里是个PUSHAD,向下过了POPAD后到达一个JMP,到这里后,上边的4024F3,4024F5处本来是未定义寄存器,现在已经变成了新的Call,并且这个JMP正好跳向4024F3。
特别注意:这里开始,又开始了新的循环,代码变成了和上面同样的格式。要F7跟进,然后经过PUSHAD和POPAD,再次跳向新的Call。不过不是原地循环,地址每次向上移动Hex(2D)个地址,一直这样一点一点的走,中间要走几十个这样的循环,最后一个循环中的JMP就是最终的跳转,直接跳到401D70处!这个位置就是真正的入口点。到401D70处后,使用LoadPE进行Dump,然后用ImportREC修复输入表,执行程序后,可以正常运行。
用PEiD查看,使用VC++6.0编写。
这个壳比较能迷惑人,不知道哪位高手知道这个是什么壳?
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!