yoda's Protector V1.03.2.02脱壳――yP.exe全过程分析
下载页面: http://yodap.cjb.net/
软件作者: Ashkbiz Danehkar
软件大小: 40K
发布日期: 27.II.2005
软件简介: Polymorphic encryption,Softice detection,Anti Debug API's,Erase PE Header,Anti Dumping,CRC checking,Import Table encryption/destruction,API Redirection
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教
【调试环境】:WinXP、Ollydbg、PEiD、LordPE
―――――――――――――――――――――――――――――――――
【脱壳过程】:
我一向很少F7调试保护壳,上周日单步把yoda's Protector走了几遍,记录了过程。标题所谓的“全过程”其实还是简要分析。感觉yoda's Protector和[MSLRH]相似,除了一些反跟踪手段就没有什么可以看的了。
[yoda's Protector V1.0X -> Ashkbiz Danehkar]
signature = E8 03 00 00 00 EB 01
ep_only = true
设置OllyDbg忽略所有异常选项。用IsDebug插件去掉OllyDbg的调试器标志。
―――――――――――――――――――――――――――――――――
一、热身运动:准备2个校验值
00461549 E8 03000000 call 00461551
//进入Ollydbg后暂停在这
0046154E EB 01 jmp short 00461551
前面几个CC,没什么好说的,看着堆栈走就行了。
00461777 8D85 2F734200 lea eax,dword ptr ss:[ebp+42732F]
//[ebp+42732F]=00461549 ModuleEntryPoint
0046177D B9 E39B4200 mov ecx,429BE3
00461782 81E9 2F734200 sub ecx,42732F
//ECX=429BE3-42732F=000028B4
00461788 51 push ecx
00461789 50 push eax
0046178A E8 3F0E0000 call 004625CE
//计算壳EP处长度28B4代码的校验值=000FC7C5
0046178F 83C4 08 add esp,8
00461792 8985 A8A34200 mov dword ptr ss:[ebp+42A3A8],eax
//校验值000FC7C5保存在[ebp+42A3A8]处 ★ 最后会检测的
00461798 8DB5 98A34200 lea esi,dword ptr ss:[ebp+42A398]
0046179E 8D85 A7754200 lea eax,dword ptr ss:[ebp+4275A7]
004617A4 3E:8946 08 mov dword ptr ds:[esi+8],eax
004617A8 8BFD mov edi,ebp
004617AA 8D85 B69F4200 lea eax,dword ptr ss:[ebp+429FB6]
004617B0 33DB xor ebx,ebx
004617B2 50 push eax
004617B3 64:FF33 push dword ptr fs:[ebx]
004617B6 64:8923 mov dword ptr fs:[ebx],esp
004617B9 66:B8 0400 mov ax,4
004617BD EB 01 jmp short 004617C0
004617BF C3 retn
同样过几个异常,下面一大段是壳获取所使用的API函数部分,没有意思,愿意看就走下去,否则就顺着Jmp翻屏下去
00461EA2 BB C3724200 mov ebx,4272C3
00461EA7 FF541D 00 call dword ptr ss:[ebp+ebx]; kernel32.GetTickCount
//获取自windows启动以来经历的时间长度
00461EAB 8985 BCA04200 mov dword ptr ss:[ebp+42A0BC],eax
//EAX=00C7E130保存在[ebp+42A0BC]处 ★ 最后会检测的
00461EB1 E8 03000000 call 00461EB9
―――――――――――――――――――――――――――――――――
二、获取当前Windows系统的版本
00461EB9 BB C7724200 mov ebx,4272C7
00461EBE FF541D 00 call dword ptr ss:[ebp+ebx]; kernel32.GetVersion
//判断当前运行的Windows版本
00461EC2 A9 00000080 test eax,80000000
00461EC7 74 20 je short 00461EE9
00461EC9 3C 04 cmp al,4
00461ECB 75 0C jnz short 00461ED9
00461ECD C785 48A04200 0>mov dword ptr ss:[ebp+42A048],2
00461ED7 EB 40 jmp short 00461F19
00461ED9 3C 03 cmp al,3
00461EDB 75 3C jnz short 00461F19
00461EDD C785 48A04200 0>mov dword ptr ss:[ebp+42A048],1
00461EE7 EB 30 jmp short 00461F19
00461EE9 3C 03 cmp al,3
//Windows3.X ?
00461EEB 75 0C jnz short 00461EF9
00461EED C785 48A04200 0>mov dword ptr ss:[ebp+42A048],4
00461EF7 EB 20 jmp short 00461F19
00461EF9 3C 04 cmp al,4
//Windows9X、NT4.0 ?
00461EFB 75 0C jnz short 00461F09
//修改标志位使这里不跳转
00461EFD C785 48A04200 0>mov dword ptr ss:[ebp+42A048],8
//[ebp+42A048]置8,壳就以为我的系统不是2K、XP,这样为下面省点Anti
00461F07 EB 10 jmp short 00461F19
00461F09 3C 05 cmp al,5
//Windows2K、XP ?
00461F0B 75 0C jnz short 00461F19
00461F0D C785 48A04200 1>mov dword ptr ss:[ebp+42A048],10
00461F17 EB 00 jmp short 00461F19
―――――――――――――――――――――――――――――――――
三、BlockInput :锁定键盘和鼠标
00461F19 BB EB724200 mov ebx,4272EB
00461F1E FF541D 00 call dword ptr ss:[ebp+ebx]
//User32.GetForegroundWindow 获得前台应用程序的活动窗口
00461F22 8985 4CA04200 mov dword ptr ss:[ebp+42A04C],eax
00461F28 6A 00 push 0
00461F2A 8D85 A9A44200 lea eax,dword ptr ss:[ebp+42A4A9]
//[ebp+42A4A9]=004646C3, (ASCII "Shell_TrayWnd") 任务栏窗口类
00461F30 50 push eax
00461F31 BB EF724200 mov ebx,4272EF
00461F36 FF541D 00 call dword ptr ss:[ebp+ebx]; User32.FindWindowA
00461F3A 8985 50A04200 mov dword ptr ss:[ebp+42A050],eax
00461F40 BB F3724200 mov ebx,4272F3
00461F45 FF541D 00 call dword ptr ss:[ebp+ebx]; User32.GetTopWindow
00461F49 8985 58A04200 mov dword ptr ss:[ebp+42A058],eax
00461F4F E8 03000000 call 00461F57
00461F57 BB 67724200 mov ebx,427267
00461F5C FF541D 00 call dword ptr ss:[ebp+ebx]; kernel32.GetCurrentProcess
00461F60 50 push eax
00461F61 50 push eax
00461F62 BB 97724200 mov ebx,427297
00461F67 FF541D 00 call dword ptr ss:[ebp+ebx]
//kernel32.GetPriorityClass 获取当前进程的优先级别
00461F6B 8985 60A04200 mov dword ptr ss:[ebp+42A060],eax
00461F71 58 pop eax
00461F72 68 80000000 push 80
00461F77 50 push eax
00461F78 BB 93724200 mov ebx,427293
00461F7D FF541D 00 call dword ptr ss:[ebp+ebx]; kernel32.SetPriorityClass
//设置自身进程的优先级别为高
00461F81 F785 48A04200 0>test dword ptr ss:[ebp+42A048],8
00461F8B 75 0B jnz short 00461F98
//如果你使壳“相信”你不是用WinDows 2K/XP,则这里会跳转,否则修改标志位Z=0 ★
00461F8D 6A 01 push 1
//或者修改堆栈里push的1为0
00461F8F BB DF724200 mov ebx,4272DF
00461F94 FF541D 00 call dword ptr ss:[ebp+ebx]
//User32.BlockInput 锁定键盘和鼠标
00461F98 BA 00000000 mov edx,0
00461F9D F785 68A04200 0>test dword ptr ss:[ebp+42A068],1
00461FA7 75 05 jnz short 00461FAE
省略一段调用ADVAPI32.CryptCreateHash、ADVAPI32.CryptHashData、ADVAPI32.CryptDeriveKey创建密钥的过程。
―――――――――――――――――――――――――――――――――
四、父进程检测
如果在第二部分使yoda's Protector以为当前系统平台不是WinDows 2000/XP,则不必担心下面的问题。并且,还是在[ebp+42A048]置8比较省事,后面的检测还有不少。
00462135 F785 A4A34200 0>test dword ptr ss:[ebp+42A3A4],1
0046213F 74 7C je short 004621BD
004621BD E8 03000000 call 004621C5
004621C5 F785 48A04200 0>test dword ptr ss:[ebp+42A048],8
//如果你使壳“相信”你不是用WinDows 2K/XP,则下面不会跳转,否则下面要Anti了 ★
004621CF 74 08 je short 004621D9
004621D9 B9 49000000 mov ecx,49
004621DE 8BD5 mov edx,ebp
004621E0 81C2 EFA44200 add edx,42A4EF
004621E6 33C0 xor eax,eax
004621E8 8D3A lea edi,dword ptr ds:[edx]
004621EA 57 push edi
004621EB F3:AB rep stos dword ptr es:[edi]
004621ED 5F pop edi
004621EE 36:C702 2801000>mov dword ptr ss:[edx],128
004621F5 8BD5 mov edx,ebp
004621F7 81C2 6B724200 add edx,42726B
004621FD FF12 call dword ptr ds:[edx]; kernel32.GetCurrentProcessID
004621FF 6A 00 push 0
00462201 6A 02 push 2
00462203 8BD5 mov edx,ebp
00462205 81C2 E3A44200 add edx,42A4E3
0046220B 8902 mov dword ptr ds:[edx],eax
0046220D 8BD5 mov edx,ebp
0046220F 81C2 63724200 add edx,427263
00462215 FF12 call dword ptr ds:[edx]; kernel32.CreateToolhelp32Snapshot
00462217 8BF0 mov esi,eax
00462219 8BC5 mov eax,ebp
0046221B 05 EFA44200 add eax,42A4EF
00462220 50 push eax
00462221 56 push esi
00462222 8BD5 mov edx,ebp
00462224 81C2 6F724200 add edx,42726F
0046222A FF12 call dword ptr ds:[edx]; kernel32.Process32First
0046222C 85C0 test eax,eax
0046222E 0F84 B3000000 je 004622E7
00462234 8BD5 mov edx,ebp
00462236 81C2 EFA44200 add edx,42A4EF
0046223C 8D0A lea ecx,dword ptr ds:[edx]
0046223E 51 push ecx
0046223F 56 push esi
00462240 8BD5 mov edx,ebp
00462242 81C2 73724200 add edx,427273
00462248 FF12 call dword ptr ds:[edx]; kernel32.Process32Next
0046224A 85C0 test eax,eax
0046224C 0F84 95000000 je 004622E7
00462252 33DB xor ebx,ebx
00462254 EB 03 jmp short 00462259
00462256 3E:8D09 lea ecx,dword ptr ds:[ecx]
00462259 56 push esi
0046225A 8BD5 mov edx,ebp
0046225C 81C2 EFA44200 add edx,42A4EF
00462262 8B42 08 mov eax,dword ptr ds:[edx+8]
00462265 8D72 24 lea esi,dword ptr ds:[edx+24]
00462268 8BFE mov edi,esi
0046226A 56 push esi
0046226B 57 push edi
0046226C E8 320F0000 call 004631A3
00462271 83C4 08 add esp,8
00462274 57 push edi
00462275 56 push esi
00462276 E8 E4100000 call 0046335F
0046227B 83C4 08 add esp,8
0046227E 8BF7 mov esi,edi
00462280 56 push esi
00462281 57 push edi
00462282 8BD5 mov edx,ebp
00462284 81C2 89A44200 add edx,42A489
0046228A 8D3A lea edi,dword ptr ds:[edx]
0046228C B9 0D000000 mov ecx,0D
00462291 33D2 xor edx,edx
00462293 F3:A6 repe cmps byte ptr es:[edi],byte ptr ds:[esi]
//比较是否是EXPLORER.EXE.\\.\SICE.\\.\NTICE.Shell_TrayWnd.OLLYDBG
00462295 75 09 jnz short 004622A0
00462297 83FB 00 cmp ebx,0
0046229A 74 02 je short 0046229E
0046229C EB 02 jmp short 004622A0
0046229E 8BD8 mov ebx,eax
004622A0 5F pop edi
004622A1 5E pop esi
004622A2 52 push edx
004622A3 8BD5 mov edx,ebp
004622A5 81C2 E3A44200 add edx,42A4E3
004622AB 36:3B02 cmp eax,dword ptr ss:[edx]
004622AE 5A pop edx
004622AF 75 17 jnz short 004622C8
004622B1 52 push edx
004622B2 8BD5 mov edx,ebp
004622B4 81C2 EFA44200 add edx,42A4EF
004622BA 8B42 18 mov eax,dword ptr ds:[edx+18]
004622BD 8BD5 mov edx,ebp
004622BF 81C2 3CA04200 add edx,42A03C
004622C5 8902 mov dword ptr ds:[edx],eax
//保存父进程ID
004622C7 5A pop edx
004622C8 5E pop esi
004622C9 8BD5 mov edx,ebp
004622CB 81C2 EFA44200 add edx,42A4EF
004622D1 8D0A lea ecx,dword ptr ds:[edx]
004622D3 51 push ecx
004622D4 56 push esi
004622D5 8BD5 mov edx,ebp
004622D7 81C2 73724200 add edx,427273
004622DD FF12 call dword ptr ds:[edx]; kernel32.Process32Next
004622DF 85C0 test eax,eax
004622E1 0F85 72FFFFFF jnz 00462259
004622E7 8BD5 mov edx,ebp
004622E9 81C2 40A04200 add edx,42A040
004622EF 891A mov dword ptr ds:[edx],ebx
//保存资源浏览器(Explorer.exe)的进程ID
004622F1 56 push esi
004622F2 8BD5 mov edx,ebp
004622F4 81C2 5B724200 add edx,42725B
004622FA FF12 call dword ptr ds:[edx]; kernel32.CloseHandle
004622FC 8BD5 mov edx,ebp
004622FE 81C2 02814200 add edx,428102
00462304 8D02 lea eax,dword ptr ds:[edx]
00462306 50 push eax; 0046231C
00462307 C3 retn
0046231C F785 A4A34200 8>test dword ptr ss:[ebp+42A3A4],80
00462326 75 45 jnz short 0046236D
00462328 8B85 40A04200 mov eax,dword ptr ss:[ebp+42A040]
//资源浏览器(Explorer.exe)的进程ID
0046232E 8B9D 3CA04200 mov ebx,dword ptr ss:[ebp+42A03C]
//当前父进程ID
00462334 3BC3 cmp eax,ebx
//比较
00462336 74 35 je short 0046236D
//不同则不跳
00462338 F785 48A04200 0>test dword ptr ss:[ebp+42A048],8
00462342 74 08 je short 0046234C
004627C4 81C2 B3724200 add edx,4272B3
004627CA FF12 call dword ptr ds:[edx]; kernel32.SuspendThread
//挂起OllyDbg,使得无法调试下去
―――――――――――――――――――――――――――――――――
五、任务栏的沉睡
如果004621CF处不跳,那么继续看yoda's Protector的招数
004621C5 F785 48A04200 0>test dword ptr ss:[ebp+42A048],8
004621CF 74 08 je short 004621D9
004621D1 8D85 02814200 lea eax,dword ptr ss:[ebp+428102]
004621D7 50 push eax; yP.0046231C
004621D8 C3 retn
0046231C F785 A4A34200 8>test dword ptr ss:[ebp+42A3A4],80
00462326 75 45 jnz short 0046236D
00462328 8B85 40A04200 mov eax,dword ptr ss:[ebp+42A040]
0046232E 8B9D 3CA04200 mov ebx,dword ptr ss:[ebp+42A03C]
00462334 3BC3 cmp eax,ebx
//没有进行进程ID的比较,所以这里都是0
00462336 74 35 je short 0046236D
0046236D 6A F0 push -10
0046236F 8B85 50A04200 mov eax,dword ptr ss:[ebp+42A050]
//[ebp+42A050]=00030046 00461F36处获得的任务栏窗口句柄
00462375 50 push eax
00462376 BB E3724200 mov ebx,4272E3
0046237B FF541D 00 call dword ptr ss:[ebp+ebx]; User32.GetWindowLongA
//0012EB00 0046237F /CALL 到 GetWindowLongA 来自 yP.0046237B
//0012EB04 00030046 |hWnd = 00030046 (class='Shell_TrayWnd')
//0012EB08 FFFFFFF0 \Index = GWL_STYLE
0046237F 8985 54A04200 mov dword ptr ss:[ebp+42A054],eax
//[ebp+42A054]=EAX=96000000 以后要恢复的
00462385 0D 00000008 or eax,8000000
0046238A 50 push eax
0046238B 6A F0 push -10
0046238D 8B85 50A04200 mov eax,dword ptr ss:[ebp+42A050]
00462393 50 push eax
00462394 BB E7724200 mov ebx,4272E7
00462399 FF541D 00 call dword ptr ss:[ebp+ebx]; User32.SetWindowLongA
//会导致任务栏失去响应。所以我们可以修改NewValue = 96000000 ★
//0012EAFC 0046239D /CALL 到 SetWindowLongA 来自 yP.00462399
//0012EB00 000200E4 |hWnd = 000200E4 (class='Shell_TrayWnd')
//0012EB04 FFFFFFF0 |Index = GWL_STYLE
//0012EB08 9E000000 \NewValue = 9E000000
0046239D 6A F0 push -10
0046239F 8B85 58A04200 mov eax,dword ptr ss:[ebp+42A058]
//00461F45处没有获取成功,返回0,下面就不必处理了
004623A5 50 push eax
004623A6 BB E3724200 mov ebx,4272E3
004623AB FF541D 00 call dword ptr ss:[ebp+ebx]; User32.GetWindowLongA
004623AF 8985 5CA04200 mov dword ptr ss:[ebp+42A05C],eax
004623B5 0D 00000008 or eax,8000000
004623BA 50 push eax
004623BB 6A F0 push -10
004623BD 8B85 58A04200 mov eax,dword ptr ss:[ebp+42A058]
004623C3 50 push eax
004623C4 BB E7724200 mov ebx,4272E7
004623C9 FF541D 00 call dword ptr ss:[ebp+ebx]; User32.SetWindowLongA
004623CD F785 A4A34200 1>test dword ptr ss:[ebp+42A3A4],10
004623D7 74 3A je short 00462413
004623D9 64:FF35 3000000>push dword ptr fs:[30]
004623E0 58 pop eax
004623E1 85C0 test eax,eax
004623E3 78 0F js short 004623F4
004623E5 8B40 0C mov eax,dword ptr ds:[eax+C]
004623E8 8B40 0C mov eax,dword ptr ds:[eax+C]
004623EB C740 20 0020000>mov dword ptr ds:[eax+20],2000
004623F2 EB 1F jmp short 00462413
―――――――――――――――――――――――――――――――――
六、计算校验值
00462413 F785 48A04200 0>test dword ptr ss:[ebp+42A048],8
0046241D 74 08 je short 00462427
0046241F 8D85 19824200 lea eax,dword ptr ss:[ebp+428219]
00462425 50 push eax; 00462433
00462426 C3 retn
00462433 E8 03000000 call 0046243B
00462438 EB 01 jmp short 0046243B
0046243B 8BBD 34A04200 mov edi,dword ptr ss:[ebp+42A034]
00462441 037F 3C add edi,dword ptr ds:[edi+3C]
00462444 8BB5 34A04200 mov esi,dword ptr ss:[ebp+42A034]
0046244A 8B4F 54 mov ecx,dword ptr ds:[edi+54]
0046244D 8D85 EFA44200 lea eax,dword ptr ss:[ebp+42A4EF]
00462453 50 push eax
00462454 6A 04 push 4
00462456 51 push ecx
00462457 FFB5 34A04200 push dword ptr ss:[ebp+42A034]
0046245D BB 3B724200 mov ebx,42723B
00462462 FF541D 00 call dword ptr ss:[ebp+ebx]; kernel32.VirtualProtect
00462466 F785 A4A34200 0>test dword ptr ss:[ebp+42A3A4],8
00462470 0F84 A3010000 je 00462619
00462476 F785 A4A34200 8>test dword ptr ss:[ebp+42A3A4],80
00462480 75 19 jnz short 0046249B
00462482 68 04010000 push 104
00462487 8DBD EFA44200 lea edi,dword ptr ss:[ebp+42A4EF]
0046248D 57 push edi
0046248E 6A 00 push 0
00462490 BB 43724200 mov ebx,427243
00462495 FF541D 00 call dword ptr ss:[ebp+ebx]; kernel32.GetModuleFileNameA
00462499 EB 1C jmp short 004624B7
004624B7 6A 00 push 0
004624B9 68 80000000 push 80
004624BE 6A 03 push 3
004624C0 6A 00 push 0
004624C2 6A 01 push 1
004624C4 68 00000080 push 80000000
004624C9 57 push edi
004624CA BB 47724200 mov ebx,427247
004624CF FF541D 00 call dword ptr ss:[ebp+ebx]; kernel32.CreateFileA
004624D3 83F8 FF cmp eax,-1
004624D6 75 07 jnz short 004624DF
004624D8 33C0 xor eax,eax
004624DA E9 3A010000 jmp 00462619
004624E1 6A 00 push 0
004624E3 57 push edi
004624E4 BB 57724200 mov ebx,427257
004624E9 FF541D 00 call dword ptr ss:[ebp+ebx]; kernel32.GetFileSize
004624ED 50 push eax
004624EE 57 push edi
004624EF 56 push esi
004624F0 8BBD 34A04200 mov edi,dword ptr ss:[ebp+42A034]
004624F6 037F 3C add edi,dword ptr ds:[edi+3C]
004624F9 8BF7 mov esi,edi
004624FB 83C6 06 add esi,6
004624FE 33C9 xor ecx,ecx
00462500 66:8B0E mov cx,word ptr ds:[esi]
00462503 49 dec ecx
00462504 81C6 F2000000 add esi,0F2
0046250A B8 28000000 mov eax,28
0046250F F7E1 mul ecx
00462511 03F0 add esi,eax
00462513 83C6 10 add esi,10
00462516 8B0E mov ecx,dword ptr ds:[esi]
00462518 5E pop esi
00462519 5F pop edi
0046251A 58 pop eax
0046251B 0385 44A04200 add eax,dword ptr ss:[ebp+42A044]
00462521 2BC1 sub eax,ecx
00462523 96 xchg eax,esi
00462524 56 push esi
00462525 6A 40 push 40
00462527 BB 4B724200 mov ebx,42724B
0046252C FF541D 00 call dword ptr ss:[ebp+ebx]; kernel32.GlobalAlloc
00462530 83F8 00 cmp eax,0
00462533 75 05 jnz short 0046253A
00462535 E9 D3000000 jmp 0046260D
0046253A 93 xchg eax,ebx
0046253B 6A 00 push 0
0046253D 8D85 EFA44200 lea eax,dword ptr ss:[ebp+42A4EF]
00462543 50 push eax
00462544 56 push esi
00462545 53 push ebx
00462546 57 push edi
00462547 BA 53724200 mov edx,427253
0046254C FF5415 00 call dword ptr ss:[ebp+edx]
00462550 8BC3 mov eax,ebx
00462552 8BCE mov ecx,esi
00462554 53 push ebx
00462555 57 push edi
00462556 51 push ecx
00462557 50 push eax
00462558 E8 71000000 call 004625CE
//计算整个文件的校验值
0046255D 83C4 08 add esp,8
00462560 8985 38A04200 mov dword ptr ss:[ebp+42A038],eax
//[ebp+42A038]=00C66266 ★ 保存校验值
―――――――――――――――――――――――――――――――――
七、解码
00462566 5F pop edi
00462567 5B pop ebx
00462568 E8 03000000 call 00462570
00462570 8D85 E8834200 lea eax,dword ptr ss:[ebp+4283E8]
00462576 50 push eax; 00462602
00462577 C3 retn
00462602 53 push ebx
00462603 BB 4F724200 mov ebx,42724F
00462608 FF541D 00 call dword ptr ss:[ebp+ebx]; GlobalFree
0046260C 96 xchg eax,esi
0046260D 50 push eax
0046260E 57 push edi
0046260F BB 5B724200 mov ebx,42725B
00462614 FF541D 00 call dword ptr ss:[ebp+ebx]; CloseHandle
00462618 58 pop eax
00462619 E8 03000000 call 00462621
00462621 E8 5AFFFFFF call 00462580
//解码区段名
//004645CE 2E 74 65 78 74 00 00 00 2E 69 64 61 74 61 00 00 .text....idata..
//004645DE 2E 72 73 72 63 00 00 00 2E 79 50 00 00 00 00 00 .rsrc....yP.....
00462626 E8 03000000 call 0046262E
//调用ADVAPI32.CryptDecrypt解密数据,再逐字节运算解码:xor 4B、rol 0D1、xor 0D5、rol 35、xor 26、dec、xor 11
0046264C E8 03000000 call 00462654
00462680 E8 D3030000 call 00462A58
//循环几次还原数据后再清除区段表中的区段名
//00462A86 rep stos byte ptr es:[edi] 可以先NOP掉这句,等循环完了再恢复
00462685 E8 03000000 call 0046268D
0046268D 8B85 34A04200 mov eax,dword ptr ss:[ebp+42A034]
00462693 8BF8 mov edi,eax
00462695 037F 3C add edi,dword ptr ds:[edi+3C]
00462698 83C7 34 add edi,34
0046269B 8B1F mov ebx,dword ptr ds:[edi]
0046269D 3BC3 cmp eax,ebx
0046269F 74 05 je short 004626A6
004626A6 E8 03000000 call 004626AE
004626AE E8 F9010000 call 004628AC
004626B3 E8 03000000 call 004626BB
004626BB 8D85 9B954200 lea eax,dword ptr ss:[ebp+42959B]
004626C1 50 push eax; 004637B5
004626C2 C3 retn
―――――――――――――――――――――――――――――――――
八、OEP RVA,后面还有埋伏:第1次检验
004637B5 F785 A4A34200 8>test dword ptr ss:[ebp+42A3A4],80
004637BF 75 30 jnz short 004637F1
004637C1 BB 5F724200 mov ebx,42725F
004637C6 FF541D 00 call dword ptr ss:[ebp+ebx]; kernel32.IsDebuggerPresent
//检测IsDebuggerPresent
004637CA 0BC0 or eax,eax
004637CC 74 23 je short 004637F1
//不跳就Over了
004637CE 8B85 3CA04200 mov eax,dword ptr ss:[ebp+42A03C]
004637D4 50 push eax
004637D5 6A 01 push 1
004637D7 68 FF0F1F00 push 1F0FFF
004637DC BB 8B724200 mov ebx,42728B
004637E1 FF541D 00 call dword ptr ss:[ebp+ebx]; kernel32.OpenProcess
004637E5 6A 00 push 0
004637E7 50 push eax
004637E8 BB 8F724200 mov ebx,42728F
004637ED FF541D 00 call dword ptr ss:[ebp+ebx]; kernel32.TerminateProcess
004637F1 E8 03000000 call 004637F9
004637F9 E8 37010000 call 00463935
//检测当前系统平台是否是2000、XP等,是则进行取当前系统进程,比较黑名单
004637FE E8 03000000 call 00463806
00463803 EB 01 jmp short 00463806
00463806 8B85 78A04200 mov eax,dword ptr ss:[ebp+42A078]
0046380C 50 push eax
0046380D BB 23734200 mov ebx,427323
00463812 FF541D 00 call dword ptr ss:[ebp+ebx]; ADVAPI32.CryptDestroyKey
00463816 6A 00 push 0
00463818 8B85 64A04200 mov eax,dword ptr ss:[ebp+42A064]
0046381E 50 push eax
0046381F BB 0F734200 mov ebx,42730F
00463824 FF541D 00 call dword ptr ss:[ebp+ebx]; ADVAPI32.CryptReleaseContext
00463828 F785 A4A34200 8>test dword ptr ss:[ebp+42A3A4],80
00463832 75 27 jnz short 0046385B
00463834 8B9D 34A04200 mov ebx,dword ptr ss:[ebp+42A034]
0046383A 8B85 3F724200 mov eax,dword ptr ss:[ebp+42723F]
00463840 C1C8 10 ror eax,10
//EAX=06E06462 ror 10=646206E0
00463843 35 656E6164 xor eax,64616E65
//EAX=646206E0 xor 64616E65=00036885 ★ OEP RVA
00463848 03D8 add ebx,eax
0046384A C1CB 07 ror ebx,7
//EBX=00436885 ror 7=0A0086D1
0046384D 895C24 10 mov dword ptr ss:[esp+10],ebx
00463851 8D9D 369D4200 lea ebx,dword ptr ss:[ebp+429D36]
00463857 895C24 1C mov dword ptr ss:[esp+1C],ebx
0046385B 8BBD 34A04200 mov edi,dword ptr ss:[ebp+42A034]
00463861 037F 3C add edi,dword ptr ds:[edi+3C]
00463864 8B9F C0000000 mov ebx,dword ptr ds:[edi+C0]
0046386A 83FB 00 cmp ebx,0
0046386D 74 0F je short 0046387E
0046386F 039D 34A04200 add ebx,dword ptr ss:[ebp+42A034]
00463875 8B43 08 mov eax,dword ptr ds:[ebx+8]
00463878 C700 00000000 mov dword ptr ds:[eax],0
0046387E 8B85 38A04200 mov eax,dword ptr ss:[ebp+42A038]
//[ebp+42A038]=00C66266 还记得在00462560处计算的校验值不?
00463884 0BC0 or eax,eax
00463886 74 0D je short 00463895
00463888 3B85 DFA44200 cmp eax,dword ptr ss:[ebp+42A4DF]
//[ebp+42A4DF]=[004646F9]=00C66266 与壳中保存的校验值进行比较 ★
0046388E 74 05 je short 00463895
//不等不跳就Over了。所以如果检验错误的话,则要修改标志位Z=1使这里跳转
00463890 E9 D6030000 jmp 00463C6B
―――――――――――――――――――――――――――――――――
九、完美修复输入表
00463895 8BD5 mov edx,ebp
00463897 81C2 C8A04200 add edx,42A0C8
0046389D 8D32 lea esi,dword ptr ds:[edx]
0046389F 53 push ebx
004638A0 F785 A4A34200 2>test dword ptr ss:[ebp+42A3A4],20
004638AA 74 51 je short 004638FD
004638AC 56 push esi
004638AD 8DBD EFA44200 lea edi,dword ptr ss:[ebp+42A4EF]
004638B3 33C9 xor ecx,ecx
004638B5 3E:837E 04 00 cmp dword ptr ds:[esi+4],0
004638BA 74 1B je short 004638D7
004638BC 3E:8B56 04 mov edx,dword ptr ds:[esi+4]
004638C0 0395 34A04200 add edx,dword ptr ss:[ebp+42A034]
004638C6 3E:833A 00 cmp dword ptr ds:[edx],0
004638CA 74 06 je short 004638D2
004638CC 41 inc ecx
004638CD 83C2 04 add edx,4
004638D0 EB F4 jmp short 004638C6
004638D2 83C6 0C add esi,0C
004638D5 EB DE jmp short 004638B5
//循环计算输入表函数的数量 ECX=000000E9
004638D7 33D2 xor edx,edx
004638D9 B8 05000000 mov eax,5
004638DE F7E1 mul ecx
//EAX=5 * E9=48D 作为申请内存的MemSize
004638E0 50 push eax
004638E1 6A 00 push 0
004638E3 BB 4B724200 mov ebx,42724B
004638E8 FF541D 00 call dword ptr ss:[ebp+ebx]; GlobalAlloc
//申请内存为加密输入表使用
//0012EAC4 004638EC /CALL 到 GlobalAlloc 来自 yP.004638E8
//0012EAC8 00000000 |Flags = GMEM_FIXED
//0012EACC 0000048D \MemSize = 48D (1165.)
004638EC 0BC0 or eax,eax
004638EE 75 05 jnz short 004638F5
004638F5 3E:8907 mov dword ptr ds:[edi],eax
004638F8 3E:8947 04 mov dword ptr ds:[edi+4],eax
004638FC 5E pop esi
004638FD 5B pop ebx
004638FE 3E:837E 04 00 cmp dword ptr ds:[esi+4],0
//[esi+4]处保存的是FirstThunk ★
00463903 0F84 5F030000 je 00463C68
//输入表处理完毕则跳转
00463909 3E:8B1E mov ebx,dword ptr ds:[esi]
//esi=004642E2 取NameRVA ★ 注意[esi]处的表,我们最后要手工修复Import Table ★
0046390C 039D 34A04200 add ebx,dword ptr ss:[ebp+42A034]
00463912 8BC3 mov eax,ebx
00463914 E8 08000000 call 00463921
//解码DLL名
00463919 8D85 1C994200 lea eax,dword ptr ss:[ebp+42991C]
0046391F 50 push eax
00463920 C3 retn
00463B36 53 push ebx
00463B37 BA 2B724200 mov edx,42722B
00463B3C FF5415 00 call dword ptr ss:[ebp+edx]; kernel32.LoadLibraryA
00463B40 85C0 test eax,eax
00463B42 0F84 23010000 je 00463C6B
00463B48 52 push edx
00463B49 50 push eax
00463B4A F785 A4A34200 0>test dword ptr ss:[ebp+42A3A4],4
00463B54 74 0E je short 00463B64
00463B56 8D85 4A994200 lea eax,dword ptr ss:[ebp+42994A]
00463B5C 50 push eax
00463B5D 8BC3 mov eax,ebx
00463B5F E9 5E060000 jmp 004641C2
//跳下去对DLL名清0
00463B64 5B pop ebx
00463B65 5A pop edx
00463B66 3E:8B4E 08 mov ecx,dword ptr ds:[esi+8]
//[esi+8]处保存的是OriginaFirstThunk ★
00463B6A 0BC9 or ecx,ecx
00463B6C 75 04 jnz short 00463B72
00463B6E 3E:8B4E 04 mov ecx,dword ptr ds:[esi+4]
00463B72 038D 34A04200 add ecx,dword ptr ss:[ebp+42A034]
00463B78 3E:8B56 04 mov edx,dword ptr ds:[esi+4]
00463B7C 0395 34A04200 add edx,dword ptr ss:[ebp+42A034]
00463B82 3E:8339 00 cmp dword ptr ds:[ecx],0
00463B86 0F84 D4000000 je 00463C60
00463B8C F701 00000080 test dword ptr ds:[ecx],80000000
00463B92 75 50 jnz short 00463BE4
00463B94 8B01 mov eax,dword ptr ds:[ecx]
00463B96 83C0 02 add eax,2
00463B99 0385 34A04200 add eax,dword ptr ss:[ebp+42A034]
00463B9F 50 push eax
00463BA0 E8 7CFDFFFF call 00463921
//解码出函数名
00463BA5 58 pop eax
00463BA6 8BF8 mov edi,eax
00463BA8 52 push edx
00463BA9 51 push ecx
00463BAA 50 push eax
00463BAB 53 push ebx
00463BAC BA 2F724200 mov edx,42722F
00463BB1 FF5415 00 call dword ptr ss:[ebp+edx]; kernel32.GetProcAddress
00463BB5 0BC0 or eax,eax
00463BB7 75 07 jnz short 00463BC0
00463BB9 59 pop ecx
00463BBA 5A pop edx
00463BBB E9 AB000000 jmp 00463C6B
00463BC0 59 pop ecx
00463BC1 5A pop edx
00463BC2 52 push edx
00463BC3 60 pushad
00463BC4 F785 A4A34200 0>test dword ptr ss:[ebp+42A3A4],4
00463BCE 74 0E je short 00463BDE
00463BD0 8D85 C4994200 lea eax,dword ptr ss:[ebp+4299C4]
00463BD6 50 push eax
00463BD7 8BC7 mov eax,edi
00463BD9 E9 E4050000 jmp 004641C2
//跳下去对函数名清0
00463BDE 61 popad
00463BDF 5A pop edx
00463BE0 8902 mov dword ptr ds:[edx],eax
//修改②: NOP掉 ★
//用GetProcAddress得到的系统函数地址填充IAT
00463BE2 EB 1C jmp short 00463C00
00463BE4 52 push edx
00463BE5 51 push ecx
00463BE6 8B01 mov eax,dword ptr ds:[ecx]
00463BE8 2D 00000080 sub eax,80000000
00463BED 50 push eax
00463BEE 53 push ebx
00463BEF BA 2F724200 mov edx,42722F
00463BF4 FF5415 00 call dword ptr ss:[ebp+edx]
00463BF8 85C0 test eax,eax
00463BFA 74 6F je short 00463C6B
00463BFC 59 pop ecx
00463BFD 5A pop edx
00463BFE 8902 mov dword ptr ds:[edx],eax
00463C00 51 push ecx
00463C01 F785 A4A34200 2>test dword ptr ss:[ebp+42A3A4],20
00463C0B 74 47 je short 00463C54
00463C0D 83BD ACA34200 0>cmp dword ptr ss:[ebp+42A3AC],0
00463C14 74 14 je short 00463C2A
00463C16 81FB 00000070 cmp ebx,70000000
00463C1C 72 08 jb short 00463C26
00463C1E 81FB FFFFFF77 cmp ebx,77FFFFFF
00463C24 76 0E jbe short 00463C34
00463C26 EB 2C jmp short 00463C54
00463C28 EB 0A jmp short 00463C34
00463C2A 81FB 00000080 cmp ebx,80000000
00463C30 73 02 jnb short 00463C34
00463C32 EB 20 jmp short 00463C54
00463C34 57 push edi
00463C35 56 push esi
00463C36 8DBD EFA44200 lea edi,dword ptr ss:[ebp+42A4EF]
00463C3C 3E:8B77 04 mov esi,dword ptr ds:[edi+4]
00463C40 8932 mov dword ptr ds:[edx],esi
//修改③: NOP掉 ★ 填充加密地址
00463C42 2BC6 sub eax,esi
00463C44 83E8 05 sub eax,5
00463C47 C606 E9 mov byte ptr ds:[esi],0E9
00463C4A 8946 01 mov dword ptr ds:[esi+1],eax
00463C4D 3E:8347 04 05 add dword ptr ds:[edi+4],5
00463C52 5E pop esi
00463C53 5F pop edi
00463C54 59 pop ecx
00463C55 83C1 04 add ecx,4
00463C58 83C2 04 add edx,4
00463C5B E9 22FFFFFF jmp 00463B82
00463C60 83C6 0C add esi,0C
00463C63 E9 96FCFFFF jmp 004638FE
//循环处理输入表
00463C68 33C0 xor eax,eax
00463C6A 40 inc eax
00463C6B 83F8 01 cmp eax,1
00463C6E 74 02 je short 00463C72
00463C70 61 popad
00463C71 C3 retn
――――――――――――――――――――――――
00463921 56 push esi
00463922 57 push edi
00463923 8BF0 mov esi,eax
00463925 8BF8 mov edi,eax
00463927 AC lods byte ptr ds:[esi]
00463928 C0C8 04 ror al,4
0046392B AA stos byte ptr es:[edi]
0046392C 3E:803F 00 cmp byte ptr ds:[edi],0
00463930 75 F5 jnz short 00463927
//解码出DLL名、函数名
00463932 5F pop edi
00463933 5E pop esi
00463934 C3 retn
――――――――――――――――――――――――
004641C2 EB 05 jmp short 004641C9
004641C4 3E:C600 00 mov byte ptr ds:[eax],0
//修改①: NOP掉 ★ 对使用过的DLL名和函数名清0
004641C8 40 inc eax
004641C9 3E:8038 00 cmp byte ptr ds:[eax],0
004641CD 75 F5 jnz short 004641C4
004641CF C3 retn
――――――――――――――――――――――――
修改完以上3处后直接F4至00463C68处,运行LordPE修正ImageSize后完全Dump这个进程
如果要使用ImportREC修复输入表,则不需要修改00463BE0处,仅修改00463C40处就行了
下面来手工修复输入表,看看004642E2处保存的表:
004642E2 08 9D 05 00 B0 9C 05 00 AC 96 05 00 54 9D 05 00
004642F2 4C 97 05 00 48 91 05 00 F4 9E 05 00 0C 9A 05 00
00464302 08 94 05 00 22 9F 05 00 14 98 05 00 10 92 05 00
00464312 68 A1 05 00 48 98 05 00 44 92 05 00 FA A5 05 00
00464322 F8 9A 05 00 F4 94 05 00 50 A7 05 00 88 97 05 00
00464332 84 91 05 00 82 A7 05 00 7C 9C 05 00 78 96 05 00
00464342 8E A8 05 00 E0 96 05 00 DC 90 05 00 DE A8 05 00
00464352 BC 9A 05 00 B8 94 05 00 00 00 00 00 00 00 00 00
每3个Dword对应一个DLL,[ESI]=NameRVA、[ESI+4]=FirstThunk、[ESI+8]=OriginaFirstThunk
在dump.eXe中找块空地,005AC50处吧,根据IID数组的结构来重组一下004642E2表中数据
0005AC50 AC 96 05 00 00 00 00 00 00 00 00 00 08 9D 05 00
0005AC60 B0 9C 05 00 48 91 05 00 00 00 00 00 00 00 00 00
0005AC70 54 9D 05 00 4C 97 05 00 08 94 05 00 00 00 00 00
0005AC80 00 00 00 00 F4 9E 05 00 0C 9A 05 00 10 92 05 00
0005AC90 00 00 00 00 00 00 00 00 22 9F 05 00 14 98 05 00
0005ACA0 44 92 05 00 00 00 00 00 00 00 00 00 68 A1 05 00
0005ACB0 48 98 05 00 F4 94 05 00 00 00 00 00 00 00 00 00
0005ACC0 FA A5 05 00 F8 9A 05 00 84 91 05 00 00 00 00 00
0005ACD0 00 00 00 00 50 A7 05 00 88 97 05 00 78 96 05 00
0005ACE0 00 00 00 00 00 00 00 00 82 A7 05 00 7C 9C 05 00
0005ACF0 DC 90 05 00 00 00 00 00 00 00 00 00 8E A8 05 00
0005AD00 E0 96 05 00 B8 94 05 00 00 00 00 00 00 00 00 00
0005AD10 DE A8 05 00 BC 9A 05 00 00 00 00 00 00 00 00 00
―――――――――――――――――――――――――――――――――
十、时间检验
00463C72 F785 A4A34200 0>test dword ptr ss:[ebp+42A3A4],2
00463C7C 74 14 je short 00463C92
00463C7E 8BBD 34A04200 mov edi,dword ptr ss:[ebp+42A034]
00463C84 037F 3C add edi,dword ptr ds:[edi+3C]
00463C87 8B32 mov esi,dword ptr ds:[edx]
00463C89 8B4F 54 mov ecx,dword ptr ds:[edi+54]
00463C8C C606 00 mov byte ptr ds:[esi],0
00463C8F 46 inc esi
00463C90 E2 FA loopd short 00463C8C
00463C92 8D85 629B4200 lea eax,dword ptr ss:[ebp+429B62]
00463C98 50 push eax; 00463D7C
00463C99 C3 retn
00463D7C BA C3724200 mov edx,4272C3
00463D81 FF5415 00 call dword ptr ss:[ebp+edx]; kernel32.GetTickCount
00463D85 8B8D BCA04200 mov ecx,dword ptr ss:[ebp+42A0BC]
//[ebp+42A0BC]=00C7E130 还记得00461EAB取的时间不?
00463D8B 2BC1 sub eax,ecx
//EAX=0209F1AD-00C7E130=0142107D
00463D8D 3D E02E0000 cmp eax,2EE0
00463D92 78 08 js short 00463D9C
//“磨蹭”了这么久肯定超时啦,修改标志位S=1使这里跳转
00463D9C 8D85 809A4200 lea eax,dword ptr ss:[ebp+429A80]
00463DA2 50 push eax; 00463C9A
00463DA3 C3 retn
―――――――――――――――――――――――――――――――――
十一、醒来吧:解锁键盘、鼠标和任务栏
00463C9A F785 48A04200 0>test dword ptr ss:[ebp+42A048],8
//判断是否是Win2K/XP系统平台
00463CA4 75 0B jnz short 00463CB1
00463CA6 6A 00 push 0
00463CA8 BB DF724200 mov ebx,4272DF
00463CAD FF541D 00 call dword ptr ss:[ebp+ebx]; User32.BlockInput
//恢复键盘、鼠标锁定了,输入表处理完了,不能还让别人不动鼠标吧
00463CB1 BB 67724200 mov ebx,427267
00463CB6 FF541D 00 call dword ptr ss:[ebp+ebx]
00463CBA 8B9D 60A04200 mov ebx,dword ptr ss:[ebp+42A060]; kernel32.GetCurrentProcess
00463CC0 53 push ebx
00463CC1 50 push eax
00463CC2 BB 93724200 mov ebx,427293
00463CC7 FF541D 00 call dword ptr ss:[ebp+ebx]; kernel32.SetPriorityClass
//NORMAL_PRIORITY_CLASS 当前进程的优先级别也没必要那么高了
00463CCB F785 A4A34200 8>test dword ptr ss:[ebp+42A3A4],80
00463CD5 75 40 jnz short 00463D17
00463CD7 8B85 40A04200 mov eax,dword ptr ss:[ebp+42A040]
00463CDD 8B9D 3CA04200 mov ebx,dword ptr ss:[ebp+42A03C]
00463CE3 3BC3 cmp eax,ebx
//还比较资源浏览器(Explorer.exe)的进程ID和父进程的ID
00463CE5 74 30 je short 00463D17
00463D17 8B85 54A04200 mov eax,dword ptr ss:[ebp+42A054]
00463D1D 50 push eax
00463D1E 6A F0 push -10
00463D20 8B85 50A04200 mov eax,dword ptr ss:[ebp+42A050]
00463D26 50 push eax
00463D27 BB E7724200 mov ebx,4272E7
00463D2C FF541D 00 call dword ptr ss:[ebp+ebx]; User32.SetWindowLongA
//任务栏也该有反应了,其实我的任务栏一直是正常的
//0012EAC8 00463D30 /CALL 到 SetWindowLongA 来自 yP.00463D2C
//0012EACC 000200E4 |hWnd = 000200E4 (class='Shell_TrayWnd')
//0012EAD0 FFFFFFF0 |Index = GWL_STYLE
//0012EAD4 96000000 \NewValue = 96000000
00463D30 8B85 5CA04200 mov eax,dword ptr ss:[ebp+42A05C]
00463D36 50 push eax
00463D37 6A F0 push -10
00463D39 8B85 58A04200 mov eax,dword ptr ss:[ebp+42A058]
00463D3F 50 push eax
00463D40 BB E7724200 mov ebx,4272E7
00463D45 FF541D 00 call dword ptr ss:[ebp+ebx]; User32.SetWindowLongA
―――――――――――――――――――――――――――――――――
十二、再一再而不可再三再四:再次的检验
现在取消所有断点、恢复以前修改的所有代码,下面还有检验和解码。
00463D49 8D85 2F734200 lea eax,dword ptr ss:[ebp+42732F]
//[ebp+42732F]=00461549 ModuleEntryPoint
00463D4F B9 E39B4200 mov ecx,429BE3
00463D54 81E9 2F734200 sub ecx,42732F
//ECX=429BE3-42732F=000028B4
00463D5A EB 01 jmp short 00463D5D
00463D5D 51 push ecx
00463D5E 50 push eax
00463D5F E8 6AE8FFFF call 004625CE
//计算壳EP处长度28B4代码段的校验值=000FC7C5
00463D64 83C4 08 add esp,8
00463D67 EB 01 jmp short 00463D6A
00463D6A 8B9D A8A34200 mov ebx,dword ptr ss:[ebp+42A3A8]
//[ebp+42A3A8]=[004645C2]=000FC7C5 还记得0046178A取得的检验值不?
00463D70 33C3 xor eax,ebx
//检验 恢复了修改的代码
00463D72 74 30 je short 00463DA4
//不等不跳就Over了。所以如果检验错误的话,则要修改标志位Z=1使这里跳转
―――――――――――――――――――――――――――――――――
十三、解出463DFD处下一步运行的代码
00463DA4 8DBD E39B4200 lea edi,dword ptr ss:[ebp+429BE3]
//[ebp+429BE3]=00463DFD
00463DAA 8BF7 mov esi,edi
00463DAC B9 A39F4200 mov ecx,429FA3
00463DB1 81E9 E39B4200 sub ecx,429BE3
//ECX=429FA3-429BE3=000003C0
00463DB7 EB 04 jmp short 00463DBD
00463DBD AC lods byte ptr ds:[esi]
00463DBE 04 3C add al,3C
00463DC0 EB 01 jmp short 00463DC3
00463DC3 2C 73 sub al,73
00463DC5 FEC8 dec al
00463DC7 EB 01 jmp short 00463DCA
00463DCA EB 01 jmp short 00463DCD
00463DCD 90 nop
00463DCE EB 01 jmp short 00463DD1
00463DD1 EB 01 jmp short 00463DD4
00463DD4 F8 clc
00463DD5 04 D4 add al,0D4
00463DD7 EB 01 jmp short 00463DDA
00463DDA C0C8 3C ror al,3C
00463DDD 02C1 add al,cl
00463DDF EB 01 jmp short 00463DE2
00463DE2 EB 01 jmp short 00463DE5
00463DE5 EB 01 jmp short 00463DE8
00463DE8 FEC8 dec al
00463DEA EB 01 jmp short 00463DED
00463DED F8 clc
00463DEE AA stos byte ptr es:[edi]
//解码00463DFD 长度000003C0
00463DEF E2 CC loopd short 00463DBD
00463DF1 8D85 E39B4200 lea eax,dword ptr ss:[ebp+429BE3]
00463DF7 50 push eax; 00463DFD
00463DF8 C3 retn
―――――――――――――――――――――――――――――――――
十四、清扫战场
00463DFD F785 48A04200 0>test dword ptr ss:[ebp+42A048],8
00463E07 74 08 je short 00463E11
00463E09 8D85 039C4200 lea eax,dword ptr ss:[ebp+429C03]
00463E0F 50 push eax; yP.00463E1D
00463E10 C3 retn
00463E1D F785 A4A34200 8>test dword ptr ss:[ebp+42A3A4],80
00463E27 75 53 jnz short 00463E7C
00463E29 BB 5F724200 mov ebx,42725F
00463E2E FF541D 00 call dword ptr ss:[ebp+ebx]; kernel32.IsDebuggerPresent
00463E32 0BC0 or eax,eax
00463E34 74 23 je short 00463E59
00463E59 8B85 3CA04200 mov eax,dword ptr ss:[ebp+42A03C]
00463E5F 50 push eax
00463E60 6A 01 push 1
00463E62 68 FF0F1F00 push 1F0FFF
00463E67 BB 8B724200 mov ebx,42728B
00463E6C FF541D 00 call dword ptr ss:[ebp+ebx]; kernel32.OpenProcess
00463E70 6A FF push -1
00463E72 50 push eax
00463E73 BB DB724200 mov ebx,4272DB
00463E78 FF541D 00 call dword ptr ss:[ebp+ebx]; User32.WaitForInputIdle
00463E7C F785 A4A34200 8>test dword ptr ss:[ebp+42A3A4],80
00463E86 75 17 jnz short 00463E9F
00463E88 BB 5F724200 mov ebx,42725F
00463E8D FF541D 00 call dword ptr ss:[ebp+ebx]; kernel32.IsDebuggerPresent
00463E93 74 17 je short 00463EAC
00463EAC F785 A4A34200 0>test dword ptr ss:[ebp+42A3A4],1
00463EB6 74 7C je short 00463F34
00463F34 F785 A4A34200 8>test dword ptr ss:[ebp+42A3A4],80
00463F3E 74 08 je short 00463F48
00463F48 8D85 349F4200 lea eax,dword ptr ss:[ebp+429F34]
00463F4E 50 push eax; yP.0046414E
00463F4F C3 retn
0046414E F785 48A04200 0>test dword ptr ss:[ebp+42A048],8
00464158 74 08 je short 00464162
0046415A 8D85 549F4200 lea eax,dword ptr ss:[ebp+429F54]
00464160 50 push eax; yP.0046416E
00464161 C3 retn
0046416E 32C0 xor al,al
00464170 C685 8E734200 C>mov byte ptr ss:[ebp+42738E],0C3
00464177 8DBD 2B724200 lea edi,dword ptr ss:[ebp+42722B]
0046417D B9 2F734200 mov ecx,42732F
00464182 81E9 2B724200 sub ecx,42722B
00464188 F3:AA rep stos byte ptr es:[edi]
//清扫战场 00461445 Size=00000104
0046418A 8DBD E3734200 lea edi,dword ptr ss:[ebp+4273E3]
00464190 B9 369D4200 mov ecx,429D36
00464195 81E9 E3734200 sub ecx,4273E3
0046419B F3:AA rep stos byte ptr es:[edi]
//清扫战场 004615FD Size=00002953
0046419D 8DBD A39F4200 lea edi,dword ptr ss:[ebp+429FA3]
004641A3 B9 BFA44200 mov ecx,42A4BF
004641A8 81E9 A39F4200 sub ecx,429FA3
004641AE F3:AA rep stos byte ptr es:[edi]
//清扫战场 004641BD Size=0000051C
004641B0 61 popad
―――――――――――――――――――――――――――――――――
十五、飞向光明之巅
004641B1 50 push eax
004641B2 33C0 xor eax,eax
004641B4 64:FF30 push dword ptr fs:[eax]
004641B7 64:8920 mov dword ptr fs:[eax],esp
004641BA EB 01 jmp short 004641BD
004641BD 0000 add byte ptr ds:[eax],al
//yC的典型异常,看堆栈
0012EAF0 0012EC70 指针到下一个 SEH 记录
0012EAF4 00463F50 SE 句柄
BP 00463F50 Shift+F9 中断后取消断点
00463F50 55 push ebp
00463F51 8BEC mov ebp,esp
00463F53 57 push edi
00463F54 36:8B45 10 mov eax,dword ptr ss:[ebp+10]
00463F58 3E:8BB8 C400000>mov edi,dword ptr ds:[eax+C4]
00463F5F 3E:FF37 push dword ptr ds:[edi]
00463F62 33FF xor edi,edi
00463F64 64:8F07 pop dword ptr fs:[edi]
00463F67 3E:8380 C400000>add dword ptr ds:[eax+C4],8
00463F6F 3E:8BB8 A400000>mov edi,dword ptr ds:[eax+A4]
00463F76 C1C7 07 rol edi,7
00463F79 3E:89B8 B800000>mov dword ptr ds:[eax+B8],edi
//[eax+B8]=00436885 OEP值
00463F80 B8 00000000 mov eax,0
00463F85 5F pop edi
00463F86 C9 leave
00463F87 C3 retn
BP 00436885 Shift+F9 中断后取消断点
00436885 6A 60 push 60
//OEP
00436887 68 90564100 push 415690
0043688C E8 670D0000 call 004375F8
00436891 BF 94000000 mov edi,94
00436896 8BC7 mov eax,edi
00436898 E8 23430000 call 0043ABC0
―――――――――――――――――――――――――――――――――
十六、终场:如果你是我的传说
用LordPE修正dump.eXe的OEP RVA=00036885和ImportTable RVA=0005AC50就行了,再清除掉壳数据,算是完美脱壳吧。
若要快速脱壳的话,避开文中重点提示的反跟踪、自检验和时间检验,避开输入表加密就搞定了。
幕落,该散场了。
―――――――――――――――――――――――――――――――――
, _/
/| _.-~/ \_ , 青春都一晌
( /~ / \~-._ |\
`\\ _/ \ ~\ ) 忍把浮名
_-~~~-.) )__/;;,. \_ //'
/'_,\ --~ \ ~~~- ,;;\___( (.-~~~-. 换了脱壳轻狂
`~ _( ,_..--\ ( ,;'' / ~-- /._`\
/~~//' /' `~\ ) /--.._, )_ `~
" `~" " `" /~'`\ `\\~~\
" " "~' ""
UnPacked By : fly
2005-05-22 24:00
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)