bugCrackMe.vm-简单分析
炒个冷饭,看到"太虚伪了"2个小时就搞定这个crackme,忍不住试一下,没想到竟然花了两天时间,才追到码。简单记录一下。一些弯路就不写了。只写有用的。
原crackme的帖子地址:http://bbs.pediy.com/showthread.php?t=46308
1、反调试
运行提示发现调试器。使用bp MessageBoxA找到按钮事件函数。简单跟踪后,发现关键函数,内部为vm。
004019C5 . E8 D6F8FFFF call <vm_engine>
004019CA . 85C0 test eax, eax ; Switch (cases 0..FFFFFFFF)
根据发现调试器程序分支条件(eax=0xfffffffe)反追vm中的代码。
由于vm,不好处理,只好进入vm.找到vm指令读取代码。
跟踪vm指令,发现入口处有两个api调用,一个memset,一个GetStartupInfo。(我是硬跟的,可用apihooker)
怀疑getstartupinfo为反调试.使用attach方法重新运行,发现已绕过反调试。说明是确实是FD_GetStartupInfo().
2、vm(此crackme可不用太多分析vm)
0041141D FF2485 00104100 jmp dword ptr [eax*4+<vcode_table>]
指令不多,简单分析,发现一些vadd,vsub,vjmp,vjnz,vcmp,vret,vtest等重要指令,指令操作数多数靠真实stack传递。每类都有几条。
下面列出几条
vpushad
00411497 > 8B85 00000000 mov eax, dword ptr [ebp] ; rflag
0041149D 8987 10000000 mov dword ptr [edi+10], eax ; rflag
004114A3 81C5 04000000 add ebp, 4
004114A9 8B85 00000000 mov eax, dword ptr [ebp]
004114AF 8987 34000000 mov dword ptr [edi+34], eax ; r?
004114B5 81C5 04000000 add ebp, 4
004114BB 8B85 00000000 mov eax, dword ptr [ebp]
004114C1 8987 28000000 mov dword ptr [edi+28], eax ; redi
004114C7 81C5 04000000 add ebp, 4
004114CD 8B85 00000000 mov eax, dword ptr [ebp]
004114D3 8987 08000000 mov dword ptr [edi+8], eax ; resi
004114D9 81C5 04000000 add ebp, 4
004114DF 8B85 00000000 mov eax, dword ptr [ebp]
004114E5 8987 0C000000 mov dword ptr [edi+C], eax ; redx
004114EB 81C5 04000000 add ebp, 4
004114F1 8B85 00000000 mov eax, dword ptr [ebp]
004114F7 8987 30000000 mov dword ptr [edi+30], eax ; recx
004114FD 81C5 04000000 add ebp, 4
00411503 8B85 00000000 mov eax, dword ptr [ebp]
00411509 8987 1C000000 mov dword ptr [edi+1C], eax ; rebx
0041150F 81C5 04000000 add ebp, 4
00411515 8B85 00000000 mov eax, dword ptr [ebp]
0041151B 8987 14000000 mov dword ptr [edi+14], eax ; reax
00411521 81C5 04000000 add ebp, 4
00411527 81C5 04000000 add ebp, 4
0041152D 89AF 2C000000 mov dword ptr [edi+2C], ebp
00411533 ^ E9 ECFEFFFF jmp <vm_ep>
00411642 > 8B0424 mov eax, dword ptr [esp]
00411645 8B8C24 04000000 mov ecx, dword ptr [esp+4]
0041164C FFB7 10000000 push dword ptr [edi+10] //flag
00411652 9D popfd
00411653 2BC1 sub eax, ecx //关键指令
00411655 9C pushfd
00411656 8F87 10000000 pop dword ptr [edi+10] //flag
0041165C 890424 mov dword ptr [esp], eax
0041165F 898C24 04000000 mov dword ptr [esp+4], ecx
00411666 ^ E9 B9FDFFFF jmp <vm_ep>
.bug:004119E4 mov eax, [esp+0]
.bug:004119E7 mov ecx, [esp+arg_0]
.bug:004119EE push dword ptr [edi+10h]
.bug:004119F4 popf
.bug:004119F5 test ecx, eax//关键指令
.bug:004119F7 pushf
.bug:004119F8 pop dword ptr [edi+10h]
.bug:004119FE mov [esp+0], eax
.bug:00411A01 mov [esp+arg_0], ecx
.bug:00411A08 jmp vm_ep
vxor
.bug:0041169F mov eax, [esp+0]
.bug:004116A2 mov ecx, [esp+arg_0]
.bug:004116A9 push dword ptr [edi+10h]
.bug:004116AF popf
.bug:004116B0 xor eax, ecx//关键指令
.bug:004116B2 pushf
.bug:004116B3 pop dword ptr [edi+10h]
.bug:004116B9 mov [esp+0], eax
.bug:004116BC mov [esp+arg_0], ecx
.bug:004116C3 jmp vm_ep
00411865 > 8B0424 mov eax, dword ptr [esp]
00411868 8B16 mov edx, dword ptr [esi]
0041186A 81ED 04000000 sub ebp, 4
00411870 8995 00000000 mov dword ptr [ebp], edx
00411876 81ED 04000000 sub ebp, 4
0041187C 8B00 mov eax, dword ptr [eax]
0041187E 8985 00000000 mov dword ptr [ebp], eax
00411884 89AF 2C000000 mov dword ptr [edi+2C], ebp
0041188A FFB7 2C000000 push dword ptr [edi+2C];vesp
00411890 FFB7 10000000 push dword ptr [edi+10];vflag
00411896 FFB7 34000000 push dword ptr [edi+34];vebp
0041189C FFB7 28000000 push dword ptr [edi+28];vedi
004118A2 FFB7 08000000 push dword ptr [edi+8];vesi
004118A8 FFB7 0C000000 push dword ptr [edi+C];vedx
004118AE FFB7 30000000 push dword ptr [edi+30];vecx
004118B4 FFB7 1C000000 push dword ptr [edi+1C];vebx
004118BA FFB7 14000000 push dword ptr [edi+14];veax
004118C0 58 pop eax
004118C1 5B pop ebx
004118C2 59 pop ecx
004118C3 5A pop edx
004118C4 5E pop esi
004118C5 5F pop edi
004118C6 5D pop ebp
004118C7 9D popfd
004118C8 5C pop esp
004118C9 C3 retn ; ret1
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)