某个国外的软件,之前的多个版本都是armadillo 3.78 加壳的,毕竟我是业余的,按照公式,基本搞定,但着一次,遇到麻烦了!
查看 信息如下:
<- 11-12-2011 21:29:44 - [2.0] ->
F:\Crack\CrackTest.exe
Protected Armadillo
<-Find Protect
Protection system (Professional)
<Protection Options>
Standard protection or Minimum protection
<Backup Key Options>
Fixed Backup Keys
<Compression Options>
Best/Slowest Compression
<Other Options>
<-Find Version
Version 7.20 09-04-2010
<- Elapsed Time 00h 00m 00s 703ms ->
确实是Armadillo 加密的,感觉加密强度也不大,但我卡在了,返回程序领空的地方了!
用OD加载被调试的程序后:
0056E000 > 60 pushad
0056E001 E8 00000000 call 0056E006
0056E006 5D pop ebp
0056E007 50 push eax
0056E008 51 push ecx
0056E009 0FCA bswap edx
0056E00B F7D2 not edx
0056E00D 9C pushfd
0056E00E F7D2 not edx
0056E010 0FCA bswap edx
0056E012 EB 0F jmp short 0056E023
0056E014 B9 EB0FB8EB mov ecx, EBB80FEB
0056E019 07 pop es
0056E01A B9 EB0F90EB mov ecx, EB900FEB
此时下硬件断点 HE GetModuleHandleA 并且 F9 开始运行
F9后会提示一个MessageBox对话框,“不知如何回避位于地址005775C5 的命令,请尝试更改EIP 或者忽略程序异常”,点击确定。
按 SHIFT+F9 继续
和以前的版本不同,这个版本会弹出两次或三次MessageBox,但消息框上没有信息,或几个乱码,确认后断在:
00128FAC 00D49CBD /CALL 到 GetModuleHandleA 来自 00D49CB7
00128FB0 00DE1C28 \pModule = "kernel32.dll"
00128FB4 00DE374C ASCII "VirtualAlloc"
00128FB8 B2369C52
F9 继续
00128FAC 00D49CDB /CALL 到 GetModuleHandleA 来自 00D49CD5
00128FB0 00DE1C28 \pModule = "kernel32.dll"
00128FB4 00DE3740 ASCII "VirtualFree"
00128FB8 B2369C52
F9 再继续
00128CF8 00D2EAA4 /CALL 到 GetModuleHandleA 来自 00D2EA9E
00128CFC 00128E74 \pModule = "kernel32.dll"
去除硬件断点:
ALT + F9
找到了传说中的Magic Jump
00D2EB04 8D8D C8FEFFFF lea ecx, dword ptr [ebp-138]
00D2EB0A 51 push ecx
00D2EB0B FF15 9800DE00 call dword ptr [DE0098] ; kernel32.LoadLibraryA
00D2EB11 8B55 F4 mov edx, dword ptr [ebp-C]
00D2EB14 8B0D D457E000 mov ecx, dword ptr [E057D4]
00D2EB1A 890491 mov dword ptr [ecx+edx*4], eax
00D2EB1D 8B55 F4 mov edx, dword ptr [ebp-C]
00D2EB20 A1 D457E000 mov eax, dword ptr [E057D4]
00D2EB25 833C90 00 cmp dword ptr [eax+edx*4], 0
00D2EB29 75 05 jnz short 00D2EB30 <====NOP 这个一次
00D2EB2B ^ E9 E9FEFFFF jmp 00D2EA19
00D2EB30 C785 BCFEFFFF 0>mov dword ptr [ebp-144], 0
定位到
00D2EB2B ^ E9 E9FEFFFF jmp 00D2EA19 回车
再如法炮制来到:
00D2EDBC /EB 03 jmp short 00D2EDC1
00D2EDBE |D6 salc
00D2EDBF |D6 salc
00D2EDC0 |8F ??? ; 未知命令
00D2EDC1 \8B15 64B0E000 mov edx, dword ptr [E0B064]
恢复上面的NOP 修改
继续下断点bp CreateThread,F9 运行
7C8106C7 > 8BFF mov edi, edi
7C8106C9 55 push ebp
7C8106CA 8BEC mov ebp, esp
7C8106CC FF75 1C push dword ptr [ebp+1C]
7C8106CF FF75 18 push dword ptr [ebp+18]
7C8106D2 FF75 14 push dword ptr [ebp+14]
7C8106D5 FF75 10 push dword ptr [ebp+10]
7C8106D8 FF75 0C push dword ptr [ebp+C]
7C8106DB FF75 08 push dword ptr [ebp+8]
7C8106DE 6A FF push -1
7C8106E0 E8 D7FDFFFF call CreateRemoteThread
7C8106E5 5D pop ebp
7C8106E6 C2 1800 retn 18
堆栈如下
012CFD9C 77E5DF36 /CALL 到 CreateThread 来自 RPCRT4.77E5DF30
012CFDA0 00000000 |pSecurity = NULL
012CFDA4 00000000 |StackSize = 0
012CFDA8 77E56C7D |ThreadFunction = RPCRT4.77E56C7D
012CFDAC 001735F0 |pThreadParm = 001735F0
012CFDB0 00000000 |CreationFlags = 0
012CFDB4 012CFDC4 \pThreadId = 012CFDC4
这里不同了, CreateThread 并不是来自某个应用程序领空的地址,而是由RPCRT4这个模块来调用,
按照常规的思路 ALT + F9 返回应用程序领空,结果程序死锁了!
OD 没有死,但停在一个ZwReplyWaitReceivePortEx函数中出不来了!
因此不能像以往那样继续找OEP,修复IAT。
有人遇到类似的问题吗? 我该如何继续呢?
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!