********************************************************************************************
脱壳声明:纯属技术交流,请软件作者勿见怪!转载请保证文章的完整性---By wynney
********************************************************************************************
遇到过Armadillo的朋友应该知道,它是有点变态的。。中文意思“穿山甲”,可想而知,是很难脱的。
首先介绍一下Armadillo的一些版本以及保护方式、线程情况吧
A:版本
1.xx--2.xx
3.0a--3.61
3.75
3.78
4.x
B:保护方式
标准方式
非标准方式======>Armadillo CopyMem-ll +Debug-Blocker
C:线程
单线程
双线程
上面三种特征都可以两两组合,或者是三三组合。。变化方式之多,可见一斑!下面我将做下总结!希望
能够起到抛砖引玉的作用!
*******************************************************************************************
我的操作平台是XP SP2,在不同的平台上所看到的代码是不一样的,所以还是请大家自己动手操作一下!
我在SP1系统上也操作过,发现SP1上效果似乎比SP2好一点,至少寻找返回时机要明了一些!还有就是脱
壳后的文件会出现跨平台现象,我只会简单的处理方法,可以尽量的降低跨平台现象出现的几率,努力学
习中!呵呵!
*******************************************************************************************
保护方式判断:如果你用脱标准壳的方法去脱不行的话,那么就很有可能是非标准版啦。
线程的判断:方法1、运行程序,打开系统的任务管理器,看看有几个同名进程咯。
方法2、运行程序,打开LordPE,同样是看看有几个同名进程。一个的话就是单进程,两个就是双进程。
*******************************************************************************************
脱壳前的准备:(*****为了节约时间,我在后面将不做说明了,大家要记住!*****)
1、OD设置忽略所有的异常,用隐藏插件隐藏OD!
2、思想准备:Armadillo对断点的检测非常严格,所以我们在设置断点的时候要尽量去使用“硬件执行”
3、概念准备:使用PEID的Armadillo的版本检测一般没那么准确,我倒是发现fi的版本检测还是要强一些
4、Magic Jump:跳转的跨越段一般比较大!(返回时机一定要对!)
5:返回的时机:1、返回的地址是系统领空 2、F9过程当中,时间缓冲比较大才停下(得自己体会一下)
*******************************************************************************************
!!!!!!!!!为了节约时间,我就不一一去查壳、不看它是单、还是双线程了!!!!!!!!!
++++++++我们先不去管版本,因为保护方式一样的情况下,脱壳的方法一般上,基本一样的。+++++++++
*******************************************************************************************
1、1.xx--2.xx&单线程&标准方式==========》目标程序“XDeskWeather 3.6(桌面天气秀)”
特别声明:偶知道这个软件是密界一位前辈的作品,脱它只是做练习,请前辈不要怪罪
*******************************************************************************************
方法:2次断点法,即是:
bp GetModuleHandleA/he GetModuleHandleA
bp GetCurrentThreadId
*******************************************************************************************
OD,载入。。。。。
004FD379 X>/$ 55 push ebp //程序入口
004FD37A |. 8BEC mov ebp,esp
004FD37C |. 6A FF push -1 下断he GetModuleHandleA,F9运行,注意看堆栈!
7C80B529 k> 8BFF mov edi,edi ;ntdll.7C930738 //停在这里
7C80B52B 55 push ebp
7C80B52C 8BEC mov ebp,esp
7C80B52E 837D 08 00 cmp dword ptr ss:[ebp+8],0
***********************************
每一次F9运行时候,所出现的堆栈情况!
***********************************
0012FF38 004FD441 /CALL 到 GetModuleHandleA 来自 XDeskWea.004FD43B
0012FF3C 00000000 \pModule = NULL
0012FF40 00000000
0012ED48 77F45BB0 /CALL 到 GetModuleHandleA 来自 SHLWAPI.77F45BAA
0012ED4C 77F44FF4 \pModule = "KERNEL32.DLL"
0012ED50 00000001
0012EC88 5D175334 /CALL 到 GetModuleHandleA 来自 COMCTL32.5D17532E
0012EC8C 5D175380 \pModule = "kernel32.dll"
0012EC90 5D1E3AB8 COMCTL32.5D1E3AB8
0012F55C 004F3073 /CALL 到 GetModuleHandleA 来自 XDeskWea.004F306D
0012F560 00000000 \pModule = NULL
0012F564 7C939BA0 返回到 ntdll.7C939BA0 来自 ntdll.7C9399B5
0012C280 00C15331 /CALL 到 GetModuleHandleA 来自 00C1532B //到这一次的时间缓冲有点大
0012C284 0012C3BC \pModule = "kernel32.dll"
0012C288 00000002
此时,取消断点,Alt+F9返回!
00C15331 8B0D 60D8C300 mov ecx,dword ptr ds:[C3D860] //返回到这里
00C15337 89040E mov dword ptr ds:[esi+ecx],eax
00C1533A A1 60D8C300 mov eax,dword ptr ds:[C3D860]
00C1533F 393C06 cmp dword ptr ds:[esi+eax],edi
00C15342 75 16 jnz short 00C1535A
00C15344 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
00C1534A 50 push eax
00C1534B FF15 B850C300 call dword ptr ds:[C350B8] ; kernel32.LoadLibraryA
00C15351 8B0D 60D8C300 mov ecx,dword ptr ds:[C3D860]
00C15357 89040E mov dword ptr ds:[esi+ecx],eax
00C1535A A1 60D8C300 mov eax,dword ptr ds:[C3D860]
00C1535F 393C06 cmp dword ptr ds:[esi+eax],edi
00C15362 0F84 AD000000 je 00C15415 //Magic Jump,改jmp!
00C15368 33C9 xor ecx,ecx
00C1536A 8B03 mov eax,dword ptr ds:[ebx]
00C1536C 3938 cmp dword ptr ds:[eax],edi
00C1536E 74 06 je short 00C15376
此时第一个断点的任务完成!
********************************************************************************************
下断bp GetCurrentThreadId,F9,注意观察堆栈!
7C809737 k> 64:A1 18000000 mov eax,dword ptr fs:[18] //停在这里
7C80973D 8B40 24 mov eax,dword ptr ds:[eax+24]
7C809740 C3 retn
*************
0012BB40 73391E36 /CALL 到 GetCurrentThreadId 来自 73391E30
0012BB44 00000001
0012BB48 73391C1A 返回到 73391C1A 来自 73391DE2
0012BB4C 73391B60 返回到 73391B60 来自 73391B8C
0012BB20 7339353F /CALL 到 GetCurrentThreadId 来自 73393539
0012BB24 00000000
0012BB28 734A0470
0012F5A8 00C2CF2D /CALL 到 GetCurrentThreadId 来自 00C2CF27 //到这一次的时间缓冲有点大
0012F5AC 0012FF2C
0012F5B0 00000000
此时,取消断点,Alt+F9返回!
00C2CF2D A3 F018C400 mov dword ptr ds:[C418F0],eax //返回到了这里!
00C2CF32 E8 2487FEFF call 00C1565B
00C2CF37 6A 00 push 0
00C2CF39 E8 4BD9FEFF call 00C1A889
00C2CF3E 59 pop ecx
00C2CF3F E8 7D39FFFF call 00C208C1
00C2CF44 8BF8 mov edi,eax
00C2CF46 A1 E018C400 mov eax,dword ptr ds:[C418E0]
00C2CF4B 8B48 74 mov ecx,dword ptr ds:[eax+74]
00C2CF4E 3348 5C xor ecx,dword ptr ds:[eax+5C]
00C2CF51 3308 xor ecx,dword ptr ds:[eax]
00C2CF53 03F9 add edi,ecx
00C2CF55 8B0E mov ecx,dword ptr ds:[esi]
00C2CF57 85C9 test ecx,ecx
00C2CF59 75 2E jnz short 00C2CF89
00C2CF5B 8B78 5C mov edi,dword ptr ds:[eax+5C]
00C2CF5E E8 5E39FFFF call 00C208C1
00C2CF63 8B0D E018C400 mov ecx,dword ptr ds:[C418E0] ; XDeskWea.0051F258
00C2CF69 FF76 14 push dword ptr ds:[esi+14]
00C2CF6C 8B51 74 mov edx,dword ptr ds:[ecx+74]
00C2CF6F FF76 10 push dword ptr ds:[esi+10]
00C2CF72 33D7 xor edx,edi
00C2CF74 3311 xor edx,dword ptr ds:[ecx]
00C2CF76 FF76 0C push dword ptr ds:[esi+C]
00C2CF79 03C2 add eax,edx
00C2CF7B 8B51 78 mov edx,dword ptr ds:[ecx+78]
00C2CF7E 3351 14 xor edx,dword ptr ds:[ecx+14]
00C2CF81 33D7 xor edx,edi
00C2CF83 2BC2 sub eax,edx
00C2CF85 FFD0 call eax
00C2CF87 EB 25 jmp short 00C2CFAE
00C2CF89 83F9 01 cmp ecx,1
00C2CF8C 75 22 jnz short 00C2CFB0
00C2CF8E FF76 04 push dword ptr ds:[esi+4]
00C2CF91 FF76 08 push dword ptr ds:[esi+8]
00C2CF94 6A 00 push 0
00C2CF96 E8 2639FFFF call 00C208C1
00C2CF9B 50 push eax
00C2CF9C A1 E018C400 mov eax,dword ptr ds:[C418E0]
00C2CFA1 8B48 78 mov ecx,dword ptr ds:[eax+78]
00C2CFA4 3348 5C xor ecx,dword ptr ds:[eax+5C]
00C2CFA7 3348 14 xor ecx,dword ptr ds:[eax+14]
00C2CFAA 2BF9 sub edi,ecx
00C2CFAC FFD7 call edi //直接到这下“硬件执行”断点,F9,取消断点,F7进入
004D12D4 55 push ebp //到这里了,OEP!LordPE-纠正映像-Dump!
004D12D5 8BEC mov ebp,esp
004D12D7 83C4 F0 add esp,-10
004D12DA B8 0C0E4D00 mov eax,XDeskWea.004D0E0C
004D12DF E8 004EF3FF call XDeskWea.004060E4
004D12E4 A1 B06E4D00 mov eax,dword ptr ds:[4D6EB0]
004D12E9 8B00 mov eax,dword ptr ds:[eax]
004D12EB E8 08C0F9FF call XDeskWea.0046D2F8
004D12F0 E8 D7E5FFFF call XDeskWea.004CF8CC
004D12F5 A1 B06E4D00 mov eax,dword ptr ds:[4D6EB0]
004D12FA 8B00 mov eax,dword ptr ds:[eax]
OD,不要关!打开import--选择进程--OEP输入D12D4--自动搜索IAT--获取输入表--显示无效函数--CUT!
这样就可以了!因为这个软件是半透明界面,大家在录象中可能看不到,那就这样看吧~~
********************************************************************************************
********************************************************************************************
2、Armadillo 3.00a - 3.61&单&标准方式=====》目标程序“查重软件 2.0版(MARC数据相关)”
*******************************************************************************************
方法:2次断点法,即是:
bp GetModuleHandleA/he GetModuleHandleA
bp GetCurrentThreadId
*******************************************************************************************
OD载入。。。。。
00469000 g> 60 pushad //入口
00469001 E8 00000000 call gz_LibIn.00469006
00469006 5D pop ebp he GetModuleHandleA下断,F9,注意堆栈!
7C80B529 k> 8BFF mov edi,edi //入口
7C80B52B 55 push ebp
7C80B52C 8BEC mov ebp,esp
7C80B52E 837D 08 00 cmp dword ptr ss:[ebp+8],0
7C80B532 74 18 je short kernel32.7C80B54C
0046B4A3 F0: prefix lock: //第一次典型异常,Shift+F9过!
0046B4A4 F0:C7 ??? ;未知命令
0046B4A6 C8 6033C9 enter 3360,0C9
0046B4AA 75 02 jnz short gz_LibIn.0046B4AE
0046B4AC EB 15 jmp short gz_LibIn.0046B4C3
0046B4AE EB 33 jmp short gz_LibIn.0046B4E3
0046B4B0 C9 leave
0046B5BC F0: prefix lock: //第二次典型异常,Shift+F9过!
0046B5BD F0:C7 ??? ; 未知命令
0046B5BF C8 64678F enter 6764,8F
0046B5C3 06 push es
0046B5C4 0000 add byte ptr ds:[eax],al
0046B5C6 83C4 04 add esp,4
0046B5C9 8B85 5E3E0000 mov eax,dword ptr ss:[ebp+3E5E]
0046B5CF 60 pushad
7C80B529 k> 8BFF mov edi,edi //硬件中断在这里
7C80B52B 55 push ebp
7C80B52C 8BEC mov ebp,esp
7C80B52E 837D 08 00 cmp dword ptr ss:[ebp+8],0
7C80B532 74 18 je short kernel32.7C80B54C
***********************************
每一次F9运行时候,所出现的堆栈情况!
***********************************
0012C258 00AF5331 /CALL 到 GetModuleHandleA 来自 00AF532B
0012C25C 0012C394 \pModule = "kernel32.dll"
0012C260 00000002
这个只F9一次,Shift+F9两次就可以返回了。。。
此时取消断点!就可以返回了
00AF5331 8B0D 60D8B100 mov ecx,dword ptr ds:[B1D860] //返回到这里
00AF5337 89040E mov dword ptr ds:[esi+ecx],eax
00AF533A A1 60D8B100 mov eax,dword ptr ds:[B1D860]
00AF533F 393C06 cmp dword ptr ds:[esi+eax],edi
00AF5342 75 16 jnz short 00AF535A
00AF5344 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
00AF534A 50 push eax
00AF534B FF15 B850B100 call dword ptr ds:[B150B8] ; kernel32.LoadLibraryA
00AF5351 8B0D 60D8B100 mov ecx,dword ptr ds:[B1D860]
00AF5357 89040E mov dword ptr ds:[esi+ecx],eax
00AF535A A1 60D8B100 mov eax,dword ptr ds:[B1D860]
00AF535F 393C06 cmp dword ptr ds:[esi+eax],edi
00AF5362 0F84 AD000000 je 00AF5415 //Magic Jump!改jmp!跳转很大的。。只是没跳而已
00AF5368 33C9 xor ecx,ecx
00AF536A 8B03 mov eax,dword ptr ds:[ebx]
00AF536C 3938 cmp dword ptr ds:[eax],edi
00AF536E 74 06 je short 00AF5376
此时第一断点的任务就完成了!
********************************************************************************************
下断bp GetCurrentThreadId,F9运行,注意堆栈!
7C809737 k> 64:A1 18000000 mov eax,dword ptr fs:[18] //停在这
7C80973D 8B40 24 mov eax,dword ptr ds:[eax+24]
7C809740 C3 retn
***********************************
每一次F9运行时候,所出现的堆栈情况!
***********************************
0012BB18 73391E36 /CALL 到 GetCurrentThreadId 来自 73391E30
0012BB1C 00000001
0012BB20 73391C1A 返回到 73391C1A 来自 73391DE2
0012BAF8 7339353F /CALL 到 GetCurrentThreadId 来自 73393539
0012BAFC 00000000
0012BB00 734A0470
0012BB04 734A04D8
0012BD54 73DC9AD7 /CALL 到 GetCurrentThreadId 来自 73DC9AD1
0012BD58 00000000
0012BD5C 73E08100
0012BD60 73D30000
0012F580 00B0CF2D /CALL 到 GetCurrentThreadId 来自 00B0CF27 //这一次时间缓冲比较大!
0012F584 0012FF04
0012F588 00000000 取消断点,返回!
00B0CF2D A3 F018B200 mov dword ptr ds:[B218F0],eax //回到这里
00B0CF32 E8 2487FEFF call 00AF565B
00B0CF37 6A 00 push 0
00B0CF39 E8 4BD9FEFF call 00AFA889
00B0CF3E 59 pop ecx
00B0CF3F E8 7D39FFFF call 00B008C1
00B0CF44 8BF8 mov edi,eax
00B0CF46 A1 E018B200 mov eax,dword ptr ds:[B218E0]
00B0CF4B 8B48 74 mov ecx,dword ptr ds:[eax+74]
00B0CF4E 3348 5C xor ecx,dword ptr ds:[eax+5C]
00B0CF51 3308 xor ecx,dword ptr ds:[eax]
00B0CF53 03F9 add edi,ecx
00B0CF55 8B0E mov ecx,dword ptr ds:[esi]
00B0CF57 85C9 test ecx,ecx
00B0CF59 75 2E jnz short 00B0CF89
00B0CF5B 8B78 5C mov edi,dword ptr ds:[eax+5C]
00B0CF5E E8 5E39FFFF call 00B008C1
00B0CF63 8B0D E018B200 mov ecx,dword ptr ds:[B218E0] ;
gz_LibIn.00479258
00B0CF69 FF76 14 push dword ptr ds:[esi+14]
00B0CF6C 8B51 74 mov edx,dword ptr ds:[ecx+74]
00B0CF6F FF76 10 push dword ptr ds:[esi+10]
00B0CF72 33D7 xor edx,edi
00B0CF74 3311 xor edx,dword ptr ds:[ecx]
00B0CF76 FF76 0C push dword ptr ds:[esi+C]
00B0CF79 03C2 add eax,edx
00B0CF7B 8B51 78 mov edx,dword ptr ds:[ecx+78]
00B0CF7E 3351 14 xor edx,dword ptr ds:[ecx+14]
00B0CF81 33D7 xor edx,edi
00B0CF83 2BC2 sub eax,edx
00B0CF85 FFD0 call eax
00B0CF87 EB 25 jmp short 00B0CFAE
00B0CF89 83F9 01 cmp ecx,1
00B0CF8C 75 22 jnz short 00B0CFB0
00B0CF8E FF76 04 push dword ptr ds:[esi+4]
00B0CF91 FF76 08 push dword ptr ds:[esi+8]
00B0CF94 6A 00 push 0
00B0CF96 E8 2639FFFF call 00B008C1
00B0CF9B 50 push eax
00B0CF9C A1 E018B200 mov eax,dword ptr ds:[B218E0]
00B0CFA1 8B48 78 mov ecx,dword ptr ds:[eax+78]
00B0CFA4 3348 5C xor ecx,dword ptr ds:[eax+5C]
00B0CFA7 3348 14 xor ecx,dword ptr ds:[eax+14]
00B0CFAA 2BF9 sub edi,ecx
00B0CFAC FFD7 call edi //直接到这下“硬件执行”断点,F9,取消断点,F7进入
00434A94 55 push ebp //到这里了,OEP!LordPE-纠正映像-Dump!
00434A95 8BEC mov ebp,esp
00434A97 6A FF push -1
00434A99 68 08D84300 push gz_LibIn.0043D808
00434A9E 68 844C4300 push gz_LibIn.00434C84 ; jmp to msvcrt._except_handler3
00434AA3 64:A1 00000000 mov eax,dword ptr fs:[0]
00434AA9 50 push eax
00434AAA 64:8925 00000000 mov dword ptr fs:[0],esp
00434AB1 83EC 68 sub esp,68
00434AB4 53 push ebx
00434AB5 56 push esi
00434AB6 57 push edi
不要关掉OD!打开import--选择进程--OEP输入34A94--自动搜索IAT--获取输入表--显示无效函数--CUT!
这样就可以了!这里查壳还是Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks,和二哥那里出现
一样的现象。。那么我们用FI查下看看~没壳。。至于为什么PEID显示还是有壳~应该是加壳的缘故吧~ *******************************************************************************************
3、Armadillo V3.6&双进程&标准方式=======》目标程序“超级兔子IE专家 5.60企业版-iepro.exe”
*******************************************************************************************
方法:3次断点法,即是:
bp OpenMutexA
bp GetModuleHandleA/he GetModuleHandleA
bp GetCurrentThreadId
*******************************************************************************************
OD载入
00567000 i> 60 pushad //入口
00567001 E8 00000000 call iepro.00567006
00567006 5D pop ebp
00567007 50 push eax BP OpenMutexA,F9,转换成单进程!
0056ADCB F0: prefix lock: //第一次异常,Shift+F9过!
0056ADCC F0:C7 ??? ; 未知命令
0056ADCE C8 6033C9 enter 3360,0C9
0056ADD2 75 02 jnz short iepro.0056ADD6 0056AEE4 F0: prefix lock: //第二次异常,Shift+F9过!
0056AEE5 F0:C7 ??? ; 未知命令
0056AEE7 C8 64678F enter 6764,8F
0056AEEB 06 push es
0056AEEC 0000 add byte ptr ds:[eax],al 7C80EC1B k> 8BFF mov edi,edi //断在这里,看堆栈!
7C80EC1D 55 push ebp
7C80EC1E 8BEC mov ebp,esp
7C80EC20 51 push ecx
7C80EC21 51 push ecx
7C80EC22 837D 10 00 cmp dword ptr ss:[ebp+10],0
7C80EC26 56 push esi ******************
0012F574 0053E141 /CALL 到 OpenMutexA 来自 iepro.0053E13B
0012F578 001F0001 |Access = 1F0001
0012F57C 00000000 |Inheritable = FALSE
0012F580 0012FBB4 \MutexName = "758::DA3A38CB6B" //需要用到
******************
Ctrl+G 00401000 键入以下欺骗代码!
00401000 60 pushad
00401001 9C pushfd
00401002 68 B4FB1200 push 0012FBB4 ★ 堆栈里看到的值
00401007 33C0 xor eax,eax
00401009 50 push eax
0040100A 50 push eax
0040100B E8 B4B2A577 call kernel32.CreateMutexA
00401010 9D popfd
00401011 61 popad
00401012 E9 33F7A577 jmp kernel32.OpenMutexA
二进制代码
60 9C 68 B4 FB 12 00 33 C0 50 50 E8 2F DB 40 7C 9D 61 E9 04 DC 40 7C
在401000处新建起源,F9运行,再次中断在OpenMutexA处,取消断点,再次来到401000,撤消刚才的修改 第一断点的任务完成!!
********************************************************************************************
下断he GetModuleHandleA。注意看堆栈!
7C80B529 k> 8BFF mov edi,edi //停在这里!
7C80B52B 55 push ebp
7C80B52C 8BEC mov ebp,esp
7C80B52E 837D 08 00 cmp dword ptr ss:[ebp+8],0
7C80B532 74 18 je short kernel32.7C80B54C
***********************************
每一次F9运行时候,所出现的堆栈情况!
***********************************
0012EC44 5D175334 /CALL 到 GetModuleHandleA 来自 5D17532E
0012EC48 5D175380 \pModule = "kernel32.dll"
0012EC4C 5D1E3AB8
0012ED04 77F45BB0 /CALL 到 GetModuleHandleA 来自 SHLWAPI.77F45BAA //非返回系统地址~
0012ED08 77F44FF4 \pModule = "KERNEL32.DLL"
0012ED0C 00000001
0012ED10 77F40000 SHLWAPI.77F40000
0012F518 0053D33D /CALL 到 GetModuleHandleA 来自 iepro.0053D337 //非返回系统地址~
0012F51C 00000000 \pModule = NULL
0012F520 0012F52C
0012BEF8 00C2E3B7 /CALL 到 GetModuleHandleA 来自 00C2E3B1
0012BEFC 00C3F700 \pModule = "kernel32.dll"
0012BF00 00C40710 ASCII "VirtualAlloc" //看到这个就慢行了
0012BF04 00000001
0012BEF8 00C2E3D4 /CALL 到 GetModuleHandleA 来自 00C2E3CE
0012BEFC 00C3F700 \pModule = "kernel32.dll"
0012BF00 00C40704 ASCII "VirtualFree" //看到这个就慢行了
0012BF04 00000001 这里我们shift+F9过
0012BC70 00C1912E /CALL 到 GetModuleHandleA 来自 00C19128 //上一次到现在提示有异常,需
要Shift+F9过!
0012BC74 0012BDAC \pModule = "kernel32.dll"
0012BC78 00000000
取消断点,返回!
00C1912E 8B0D 0838C400 mov ecx,dword ptr ds:[C43808] //返回到这
00C19134 89040E mov dword ptr ds:[esi+ecx],eax
00C19137 A1 0838C400 mov eax,dword ptr ds:[C43808]
00C1913C 393C06 cmp dword ptr ds:[esi+eax],edi
00C1913F 75 16 jnz short 00C19157
00C19141 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
00C19147 50 push eax
00C19148 FF15 CCA0C300 call dword ptr ds:[C3A0CC] ; kernel32.LoadLibraryA
00C1914E 8B0D 0838C400 mov ecx,dword ptr ds:[C43808]
00C19154 89040E mov dword ptr ds:[esi+ecx],eax
00C19157 A1 0838C400 mov eax,dword ptr ds:[C43808]
00C1915C 393C06 cmp dword ptr ds:[esi+eax],edi
00C1915F 0F84 AD000000 je 00C19212 //Magic Jump!改jmp!
00C19165 33C9 xor ecx,ecx
第二断点的任务完成!
********************************************************************************************
下断bp GetCurrentThreadId,F9,注意看堆栈!
7C809737 k> 64:A1 18000000 mov eax,dword ptr fs:[18] //停在这里
7C80973D 8B40 24 mov eax,dword ptr ds:[eax+24]
7C809740 C3 retn
***********************************
每一次F9运行时候,所出现的堆栈情况!
***********************************
0012B530 73391E36 /CALL 到 GetCurrentThreadId 来自 73391E30
0012B534 00000001
0012B538 73391C1A 返回到 73391C1A 来自 73391DE2
0012B53C 73391B60 返回到 73391B60 来自 73391B8C
0012B510 7339353F /CALL 到 GetCurrentThreadId 来自 73393539
0012B514 00000000
0012B518 734A0470
0012F56C 00C361D4 /CALL 到 GetCurrentThreadId 来自 00C361CE
0012F570 0012FF04
0012F574 00000000
此时取消断点,返回!
00C361D4 A3 D47CC400 mov dword ptr ds:[C47CD4],eax //返回到这里!
00C361D9 E8 4032FEFF call 00C1941E
00C361DE 6A 00 push 0
00C361E0 E8 8F8AFEFF call 00C1EC74
00C361E5 6A 00 push 0
00C361E7 C705 0CFCC300 7C0>mov dword ptr ds:[C3FC0C],0C4077C ; ASCII "RC"
00C361F1 E8 9D2CFEFF call 00C18E93
00C361F6 59 pop ecx
00C361F7 59 pop ecx
00C361F8 E8 8F10FFFF call 00C2728C
00C361FD 8BF8 mov edi,eax
00C361FF A1 BC7BC400 mov eax,dword ptr ds:[C47BBC]
00C36204 8B48 3C mov ecx,dword ptr ds:[eax+3C]
00C36207 3348 14 xor ecx,dword ptr ds:[eax+14]
00C3620A 3348 10 xor ecx,dword ptr ds:[eax+10]
00C3620D 03F9 add edi,ecx
00C3620F 8B0E mov ecx,dword ptr ds:[esi]
00C36211 85C9 test ecx,ecx
00C36213 75 2F jnz short 00C36244
00C36215 8B78 3C mov edi,dword ptr ds:[eax+3C]
00C36218 E8 6F10FFFF call 00C2728C
00C3621D 8B0D BC7BC400 mov ecx,dword ptr ds:[C47BBC] ;
iepro.00577260
00C36223 FF76 14 push dword ptr ds:[esi+14]
00C36226 8B51 14 mov edx,dword ptr ds:[ecx+14]
00C36229 FF76 10 push dword ptr ds:[esi+10]
00C3622C 3351 10 xor edx,dword ptr ds:[ecx+10]
00C3622F FF76 0C push dword ptr ds:[esi+C]
00C36232 33D7 xor edx,edi
00C36234 03C2 add eax,edx
00C36236 8B51 24 mov edx,dword ptr ds:[ecx+24]
00C36239 3351 1C xor edx,dword ptr ds:[ecx+1C]
00C3623C 33D7 xor edx,edi
00C3623E 2BC2 sub eax,edx
00C36240 FFD0 call eax
00C36242 EB 25 jmp short 00C36269
00C36244 83F9 01 cmp ecx,1
00C36247 75 22 jnz short 00C3626B
00C36249 FF76 04 push dword ptr ds:[esi+4]
00C3624C FF76 08 push dword ptr ds:[esi+8]
00C3624F 6A 00 push 0
00C36251 E8 3610FFFF call 00C2728C
00C36256 50 push eax
00C36257 A1 BC7BC400 mov eax,dword ptr ds:[C47BBC]
00C3625C 8B48 3C mov ecx,dword ptr ds:[eax+3C]
00C3625F 3348 24 xor ecx,dword ptr ds:[eax+24]
00C36262 3348 1C xor ecx,dword ptr ds:[eax+1C]
00C36265 2BF9 sub edi,ecx
00C36267 FFD7 call edi //直接到这下“硬件执行”断点,F9,取消断点,F7进入
一片红色!呵呵!
0040145C 68 24DF4000 push iepro.0040DF24 //到这里了,OEP!LordPE-纠正映像-Dump!
00401461 E8 EEFFFFFF call iepro.00401454
00401466 0000 add byte ptr ds:[eax],al
00401468 48 dec eax
00401469 0000 add byte ptr ds:[eax],al
0040146B 0030 add byte ptr ds:[eax],dh
0040146D 0000 add byte ptr ds:[eax],al
0040146F 0040 00 add byte ptr ds:[eax],al
00401472 0000 add byte ptr ds:[eax],al
00401474 0000 add byte ptr ds:[eax],al
00401476 0000 add byte ptr ds:[eax],al 不要关掉OD!打开import--选择进程--OEP输入145C--自动搜索IAT--获取输入表--显示无效函数--这个没
有无效函数!
********************************************************************************************
4、Armadillo CopyMem-ll +Debug-Blocker=====》目标程序“IDTOOLS(火线ID CLONE程序)”
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
非标准版的就是麻烦
6次断点法!
bp WaitForDebugEvent
bp WriteProcessMemory
he WaitForDebugEvent
bp DebugActiveProcess
BP OpenMutexA
BP GetModuleHandleA+5
******************************************************************************************** OD载入,隐藏。。。
005BF999 I>/$ 55 push ebp
005BF99A |. 8BEC mov ebp,esp
记住入口两个字节55 8B,后面要用到的
*****************************
bp WaitForDebugEvent,F9
0012DAC0 00423D67 /CALL 到 WaitForDebugEvent 来自 Armadill.00423D61
0012DAC4 0012EB84 |pDebugEvent = 0012EB84 //转存中跟随
0012DAC8 000003E8 \Timeout = 1000. ms
0012DACC 0012FF2C
取消断点,继续下一步
*****************************
bp WriteProcessMemory F9
0012EB98 00000000
0012EB9C 004015AC IDTOOLS.004015AC //OEP
0012EBA0 00000002
0012EBA4 00000000
0012EBA8 004015AC IDTOOLS.004015AC
0012EBAC 004015AC IDTOOLS.004015AC *******************************
重新载入程序
he WaitForDebugEvent F9
中断后,删除断点,Alt+F9回到壳的空间
搜索---全部常数---FFFFFFF8
005B03D6 or eax,FFFFFFF8 //双击,来到代码处[第一处]
005B03F1 or edx,FFFFFFF8
.....
一共有8处
005B038A > \83BD D0F5FFFF 0>cmp dword ptr ss:[ebp-A30],0
005B0391 . 0F8C A9020000 jl IDTOOLS.005B0640
005B0397 . 8B8D D0F5FFFF mov ecx,dword ptr ss:[ebp-A30]
005B039D . 3B0D E4055E00 cmp ecx,dword ptr ds:[5E05E4]
005B03A3 . 0F8D 97020000 jge IDTOOLS.005B0640
005B03A9 . 8B95 44F6FFFF mov edx,dword ptr ss:[ebp-9BC]
005B03AF . 81E2 FF000000 and edx,0FF
005B03B5 . 85D2 test edx,edx
005B03B7 . 0F84 AD000000 je IDTOOLS.005B046A
005B03BD . 6A 00 push 0
005B03BF . 8BB5 D0F5FFFF mov esi,dword ptr ss:[ebp-A30]
005B03C5 . C1E6 04 shl esi,4
005B03C8 . 8B85 D0F5FFFF mov eax,dword ptr ss:[ebp-A30]
005B03CE . 25 07000080 and eax,80000007
005B03D3 . 79 05 jns short IDTOOLS.005B03DA
005B03D5 . 48 dec eax
005B03D6 . 83C8 F8 or eax,FFFFFFF8 //向上看 好,下面我们需要做几项记录!
1、在005B038A,硬件执行!
005B038A需要记录
2、Stack ss:[0012EB70]=00000000 //12EB70=[ebp-A30] ====>清0
Jumps from 005B01CD, 005B0383
3、005B039D . 3B0D E4055E00 cmp ecx,dword ptr ds:[5E05E4] //5E05E4需要记录
4、005B0391 . 0F8C A9020000 jl IDTOOLS.005B0640 //005B0640需要记录
接下来我们就需要patch
005B045D . 25 FF000000 and eax,0FF //这里patch!
*********************************************************
0042445D inc dword ptr ds:[*****] //要求记录的。。。
00424463 mov dword ptr ds:[*****+4],1 //要求记录的。。。
0042446D jmp ******* //要求记录的。。。
*********************************************************
去掉所有的断点,到005B0640(仍然是要求记录的。。。)处下断,运行,停住。好,所有代码都强制解
压完成。 //因为Arm对断点的检测很严格,动不动就跑飞了,所以我们还是多使用硬件执行比较保险
运行LordPE,选择第2个进程(有2个同名进程),即可完全dump出来了。
*********************************************************
修复输入表、IAT的寻找(载入之前先修改入口点为OEP)
载入dump.exe
004DDE18 - FF25 20214F00 jmp dword ptr ds:[4F2120]
那么RAV就是4F2120-400000=F2120,SIZE=1000就可以了 **********************************************************
跳过加密,修改Magic Jump
用OD再一次载入未脱壳的程序,bp DebugActiveProcess,F9断下。看堆栈窗口:
0012DAC4 00423BDB /CALL 到 DebugActiveProcess 来自 NOTEPAD.00423BD5
0012DAC8 00000324 \ProcessId = ***<=====子进程句柄 //这个值每调试一次就不一样的
0012DACC 0012FF2C 打开另一个OD附加***这个子进程。然后ALT+F9返回程序:
00433999 N> - EB FE jmp short NOTEPAD.<ModuleEntryPoint><====中断在此处,还原代码
0043399B EC in al,dx
0043399C |. 6A FF push -1
0043399E |. 68 503C4500 push NOTEPAD.00453C50
还原00433999处代码代码,EB FE改为55 8B (这也是我们要求记录。。。在这里用到了~呵呵~)
下面的做法就和标准壳的一样了
***********************************************************
BP OpenMutexA,F9
Ctrl+G 00401000
00401000 60 pushad
00401001 9C pushfd
00401002 68 B4FB1200 push 12FBDC ★ 堆栈里看到的值
00401007 33C0 xor eax,eax
00401009 50 push eax
0040100A 50 push eax
0040100B E8 B4B2A577 call kernel32.CreateMutexA
00401010 9D popfd
00401011 61 popad
00401012 E9 33F7A577 jmp kernel32.OpenMutexA
新建EIP,再次F9,再次中断,取消断点
**********************************
BP GetModuleHandleA+5, F9
***********************************
每一次F9运行时候,所出现的堆栈情况!
***********************************
0012EC68 /0012ECA0
0012EC6C |5D175334 返回到 5D175334 来自 kernel32.GetModuleHandleA
0012EC70 |5D175380 ASCII "kernel32.dll"
**********
0012ED28 /0012ED44
0012ED2C |77F45BB0 返回到 SHLWAPI.77F45BB0 来自 kernel32.GetModuleHandleA
0012ED30 |77F44FF4 ASCII "KERNEL32.DLL"
**********
0012F53C /0012F5A4
0012F540 |005A07ED 返回到 IDTOOLS.005A07ED 来自 kernel32.GetModuleHandleA
0012F544 |00000000
**********
0012BF1C /0012ED70
0012BF20 |00D2C807 返回到 00D2C807 来自 kernel32.GetModuleHandleA
0012BF24 |00D3D6C8 ASCII "kernel32.dll"
0012BF28 |00D3E67C ASCII "VirtualAlloc"
**********
0012BF1C /0012ED70
0012BF20 |00D2C824 返回到 00D2C824 来自 kernel32.GetModuleHandleA
0012BF24 |00D3D6C8 ASCII "kernel32.dll"
0012BF28 |00D3E670 ASCII "VirtualFree"
**********
0012BC94 /0012BF20
0012BC98 |00D1799B 返回到 00D1799B 来自 kernel32.GetModuleHandleA
0012BC9C |0012BDD4 ASCII "kernel32.dll" //此时返回
**********
00D1799B 8B0D E011D400 mov ecx,dword ptr ds:[D411E0] //返回到这
00D179A1 89040E mov dword ptr ds:[esi+ecx],eax
00D179A4 A1 E011D400 mov eax,dword ptr ds:[D411E0]
00D179A9 393C06 cmp dword ptr ds:[esi+eax],edi
00D179AC 75 16 jnz short 00D179C4
00D179AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
00D179B4 50 push eax
00D179B5 FF15 CC80D300 call dword ptr ds:[D380CC] ; kernel32.LoadLibraryA
00D179BB 8B0D E011D400 mov ecx,dword ptr ds:[D411E0]
00D179C1 89040E mov dword ptr ds:[esi+ecx],eax
00D179C4 A1 E011D400 mov eax,dword ptr ds:[D411E0]
00D179C9 393C06 cmp dword ptr ds:[esi+eax],edi
00D179CC 0F84 AD000000 je 00D17A7F //Magic Jump,修改成jmp
00D179D2 33C9 xor ecx,ecx
修改Magic Jump,再直接按F9中断 用Imprec1.6f选择进程4A4,填入OEP地址15AC,填RAV=F2120,SIZE=1000
不要按自动搜索IAT,直接按获取输入表,再按显示无效地址,剪掉修复抓取文件就OK了。
********************************************************************************************
********************************************************************************************
**********************************
5、Armadillo 1.xx - 2.xx&单&标准&IAT修复&跨平台问题的简单处理====>目标程序“沙漠杀手-2005-
0404私服版本”
********************************************************************************************
*****************
方法:2次断点法,即是:
bp GetModuleHandleA/he GetModuleHandleA
bp GetCurrentThreadId
********************************************************************************************
*****************
OD,载入。。。
00991660 S>/$ 55 push ebp //入口
00991661 |. 8BEC mov ebp,esp
00991663 |. 6A FF push -1
00991665 |. 68 90CA9A00 push SFsmss.009ACA90
********************************************************************************************
*****************
下断he GetModuleHandleA,F9!注意看堆栈!
7C80B529 k> 8BFF mov edi,edi ; ntdll.7C930738 //停在这里
7C80B52B 55 push ebp
7C80B52C 8BEC mov ebp,esp
7C80B52E 837D 08 00 cmp dword ptr ss:[ebp+8],0
***********************************
每一次F9运行时候,所出现的堆栈情况!
***********************************
0012FF38 00991728 /CALL 到 GetModuleHandleA 来自 SFsmss.00991722
0012FF3C 00000000 \pModule = NULL
0012FF40 00000000
0012CE70 5D175334 /CALL 到 GetModuleHandleA 来自 5D17532E
0012CE74 5D175380 \pModule = "kernel32.dll"
0012CE78 5D1E3AB8
0012CF30 77F45BB0 /CALL 到 GetModuleHandleA 来自 SHLWAPI.77F45BAA
0012CF34 77F44FF4 \pModule = "KERNEL32.DLL"
0012CF38 00000001
0012D744 0097C5A3 /CALL 到 GetModuleHandleA 来自 SFsmss.0097C59D
0012D748 00000000 \pModule = NULL
0012D74C 0000FFFF
00127CD0 010C0C08 /CALL 到 GetModuleHandleA 来自 010C0C02
00127CD4 010D4D68 \pModule = "kernel32.dll"
00127CD8 010D5F58 ASCII "VirtualAlloc" //看到这个就慢行了
00127CDC 00000001
00127CD0 010C0C25 /CALL 到 GetModuleHandleA 来自 010C0C1F
00127CD4 010D4D68 \pModule = "kernel32.dll"
00127CD8 010D5F4C ASCII "VirtualFree" //看到这个就慢行了
00127CDC 00000001
这里用F9的话,会提示有异常,Shift+F9过!
00127A48 010A9905 /CALL 到 GetModuleHandleA 来自 010A98FF
00127A4C 00127B84 \pModule = "kernel32.dll"
00127A50 00000000
此时取消断点,返回!
010A9905 8B0D 40A10D01 mov ecx,dword ptr ds:[10DA140] //返回到这
010A990B 89040E mov dword ptr ds:[esi+ecx],eax
010A990E A1 40A10D01 mov eax,dword ptr ds:[10DA140]
010A9913 393C06 cmp dword ptr ds:[esi+eax],edi
010A9916 75 16 jnz short 010A992E
010A9918 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
010A991E 50 push eax
010A991F FF15 D4F00C01 call dword ptr ds:[10CF0D4] ;
kernel32.LoadLibraryA
010A9925 8B0D 40A10D01 mov ecx,dword ptr ds:[10DA140]
010A992B 89040E mov dword ptr ds:[esi+ecx],eax
010A992E A1 40A10D01 mov eax,dword ptr ds:[10DA140]
010A9933 393C06 cmp dword ptr ds:[esi+eax],edi
010A9936 0F84 AC000000 je 010A99E8 //Magic Jump!改jmp!跳得很远。。呵呵~
010A993C 33C9 xor ecx,ecx
010A993E 8B03 mov eax,dword ptr ds:[ebx]
010A9940 3938 cmp dword ptr ds:[eax],edi
010A9942 74 06 je short 010A994A
010A9944 41 inc ecx
此时第一断点的任务完成了~
********************************************************************************************
*****************
下断bp GetCurrentThreadId,F9,注意观察堆栈!
7C809737 k> 64:A1 18000000 mov eax,dword ptr fs:[18] //停在这里~
7C80973D 8B40 24 mov eax,dword ptr ds:[eax+24]
7C809740 C3 retn
***********************************
每一次F9运行时候,所出现的堆栈情况!
***********************************
00127308 73391E36 /CALL 到 GetCurrentThreadId 来自 73391E30
0012730C 00000001
00127310 73391C1A 返回到 73391C1A 来自 73391DE2
001272E8 7339353F /CALL 到 GetCurrentThreadId 来自 73393539
001272EC 00000000
001272F0 734A0470
0012754C 76DB3705 /CALL 到 GetCurrentThreadId 来自 76DB36FF
00127550 76DBF014
00127554 FFFFFFFF
0012755C 76685212 /CALL 到 GetCurrentThreadId 来自 WININET.7668520C
00127560 00000000
00127564 76680000 WININET.76680000
0012D798 010C9332 /CALL 到 GetCurrentThreadId 来自 010C932C
0012D79C 0012FF2C
0012D7A0 00000000
此时取消断点,返回!
010C9332 A3 F0E70D01 mov dword ptr ds:[10DE7F0],eax //返回到这里~
010C9337 E8 CA08FEFF call 010A9C06
010C933C 6A 00 push 0
010C933E E8 E164FEFF call 010AF824
010C9343 A1 D8E60D01 mov eax,dword ptr ds:[10DE6D8]
010C9348 59 pop ecx
010C9349 8B88 80000000 mov ecx,dword ptr ds:[eax+80]
010C934F 3348 3C xor ecx,dword ptr ds:[eax+3C]
010C9352 3348 30 xor ecx,dword ptr ds:[eax+30]
010C9355 F6C1 40 test cl,40
010C9358 75 08 jnz short 010C9362
010C935A 6A 01 push 1
010C935C E8 D5D7FDFF call 010A6B36
010C9361 59 pop ecx
010C9362 6A 00 push 0
010C9364 C705 B8520D01 D45>mov dword ptr ds:[10D52B8],10D5FD4 ; ASCII "RC"
010C936E E8 F402FEFF call 010A9667
010C9373 59 pop ecx
010C9374 E8 FCF3FEFF call 010B8775
010C9379 8BF8 mov edi,eax
010C937B A1 D8E60D01 mov eax,dword ptr ds:[10DE6D8]
010C9380 8B48 70 mov ecx,dword ptr ds:[eax+70]
010C9383 3348 48 xor ecx,dword ptr ds:[eax+48]
010C9386 3348 3C xor ecx,dword ptr ds:[eax+3C]
010C9389 03F9 add edi,ecx
010C938B 8B0E mov ecx,dword ptr ds:[esi]
010C938D 85C9 test ecx,ecx
010C938F 75 2F jnz short 010C93C0
010C9391 8B78 3C mov edi,dword ptr ds:[eax+3C]
010C9394 E8 DCF3FEFF call 010B8775
010C9399 8B0D D8E60D01 mov ecx,dword ptr ds:[10DE6D8] ;
SFsmss.009A7310
010C939F FF76 14 push dword ptr ds:[esi+14]
010C93A2 8B51 70 mov edx,dword ptr ds:[ecx+70]
010C93A5 FF76 10 push dword ptr ds:[esi+10]
010C93A8 3351 48 xor edx,dword ptr ds:[ecx+48]
010C93AB FF76 0C push dword ptr ds:[esi+C]
010C93AE 33D7 xor edx,edi
010C93B0 03C2 add eax,edx
010C93B2 8B51 74 mov edx,dword ptr ds:[ecx+74]
010C93B5 3351 10 xor edx,dword ptr ds:[ecx+10]
010C93B8 33D7 xor edx,edi
010C93BA 2BC2 sub eax,edx
010C93BC FFD0 call eax
010C93BE EB 25 jmp short 010C93E5
010C93C0 83F9 01 cmp ecx,1
010C93C3 75 22 jnz short 010C93E7
010C93C5 FF76 04 push dword ptr ds:[esi+4]
010C93C8 FF76 08 push dword ptr ds:[esi+8]
010C93CB 6A 00 push 0
010C93CD E8 A3F3FEFF call 010B8775
010C93D2 50 push eax
010C93D3 A1 D8E60D01 mov eax,dword ptr ds:[10DE6D8]
010C93D8 8B48 74 mov ecx,dword ptr ds:[eax+74]
010C93DB 3348 3C xor ecx,dword ptr ds:[eax+3C]
010C93DE 3348 10 xor ecx,dword ptr ds:[eax+10]
010C93E1 2BF9 sub edi,ecx
010C93E3 FFD7 call edi //直接到这下“硬件执行”断点,F9,取消断点,F7进入
010C93E5 8BD8 mov ebx,eax
004014B0 /EB 10 jmp short SFsmss.004014C2 //到这里了,OEP!LordPE-纠正映像-
Dump!
004014B2 |66:623A bound di,dword ptr ds:[edx]
004014B5 |43 inc ebx
004014B6 |2B2B sub ebp,dword ptr ds:[ebx]
004014B8 |48 dec eax
004014B9 |4F dec edi
004014BA |4F dec edi
004014BB |4B dec ebx
004014BC |90 nop
004014BD -|E9 98A04F00 jmp SFsmss.008FB55A
004014C2 \A1 8BA04F00 mov eax,dword ptr ds:[4FA08B]
004014C7 C1E0 02 shl eax,2
OD,不要关!打开import--选择进程--OEP输入14B0--自动搜索IAT--获取输入表--显示无效函数--CUT!
嘿嘿,这回不行了~运行不了~下面我们就来手动寻找IAT,进行修复吧~
********************************************************************************************
*****************
IAT手动寻找修复!
004014B0 /EB 10 jmp short SFsmss.004014C2 //OEP!我们就单步F8吧~
004014B2 |66:623A bound di,dword ptr ds:[edx]
004014B5 |43 inc ebx
004014B6 |2B2B sub ebp,dword ptr ds:[ebx]
004014B8 |48 dec eax
004014B9 |4F dec edi
004014BA |4F dec edi
004014BB |4B dec ebx
004014BC |90 nop
004014BD -|E9 98A04F00 jmp SFsmss.008FB55A
004014C2 \A1 8BA04F00 mov eax,dword ptr ds:[4FA08B]
004014C7 C1E0 02 shl eax,2
004014CA A3 8FA04F00 mov dword ptr ds:[4FA08F],eax
004014CF 52 push edx
004014D0 6A 00 push 0
004014D2 E8 7B7F0F00 call SFsmss.004F9452 //离OEP的第一个CALL,F7进!
004014D7 8BD0 mov edx,eax
004014D9 E8 4A5A0D00 call SFsmss.004D6F28
004F9452 - FF25 70E39100 jmp dword ptr ds:[91E370] ; kernel32.GetModuleHandleA //
来到这里~向上翻看
004F9458 - FF25 74E39100 jmp dword ptr ds:[91E374] ; kernel32.GetOEMCP
004F945E - FF25 78E39100 jmp dword ptr ds:[91E378] ;
kernel32.GetPrivateProfileStringA
004F9464 - FF25 7CE39100 jmp dword ptr ds:[91E37C] ; kernel32.GetProcAddress
004F946A - FF25 80E39100 jmp dword ptr ds:[91E380] ; kernel32.GetProcessHeap
004F9470 - FF25 84E39100 jmp dword ptr ds:[91E384] ; kernel32.GetStartupInfoA
********************************************************************************************
*****************
004F9358 832D 58B89100 01 sub dword ptr ds:[91B858],1
004F935F C3 retn
004F9360 - FF25 00E19100 jmp dword ptr ds:[91E100] ; ADVAPI32.RegCloseKey //第一
个。。我们要91E100
004F9366 - FF25 04E19100 jmp dword ptr ds:[91E104] ; ADVAPI32.RegOpenKeyExA
004F936C - FF25 08E19100 jmp dword ptr ds:[91E108] ; ADVAPI32.RegQueryValueExA
004F9372 CC int3
004F9373 CC int3
004F9374 - FF25 DCE29100 jmp dword ptr ds:[91E2DC] ; kernel32.CloseHandle
004F937A - FF25 E0E29100 jmp dword ptr ds:[91E2E0] ; kernel32.CompareStringA
把鼠标点一下转存窗口,Ctrl+G,输入91E100
0091E0C8 00 00 00 00 00 00 00 00 ........
0091E0D0 00 00 00 00 1A F0 51 00 ....鹧.
0091E0D8 00 00 00 00 00 00 00 00 ........
0091E0E0 00 00 00 00 00 00 00 00 ........
0091E0E8 00 00 00 00 00 00 00 00 ........
0091E0F0 25 F0 51 00 33 F0 51 00 %鹧.3鹧.
0091E0F8 43 F0 51 00 00 00 00 00 C鹧.....
0091E100 F0 6B DA 77 1B 76 DA 77 痣邝v邝 ==========>在这里,我们向上翻看!
0091E108 83 78 DA 77 49 A9 0A 01 ?邝I?
0091E110 57 F0 51 00 65 F0 51 00 W鹧.e鹧.
0091E118 77 F0 51 00 87 F0 51 00 w鹧.?Q.
0091E120 95 F0 51 00 A7 F0 51 00 ?Q.юQ.
0091E128 B7 F0 51 00 C5 F0 51 00 佛Q.硼Q.
0091E130 DD F0 51 00 EB F0 51 00 蒺Q.腽Q.
0091E138 03 F1 51 00 17 F1 51 00 裱.裱.
0091E140 25 F1 51 00 33 F1 51 00 %裱.3裱.
0091E148 4B F1 51 00 65 F1 51 00 K裱.e裱.
0091E150 71 F1 51 00 83 F1 51 00 q裱.?Q.
0091E158 93 F1 51 00 A5 F1 51 00 ?Q.ヱQ.
0091E160 B3 F1 51 00 C3 F1 51 00 绸Q.民Q.
0091E168 CD F1 51 00 D9 F1 51 00 婉Q.亳Q.
0091E170 EB F1 51 00 01 F2 51 00 腭Q.蜓.
0091E178 17 F2 51 00 29 F2 51 00 蜓.)蜓.
0091E180 3D F2 51 00 55 F2 51 00 =蜓.U蜓.
0091E188 69 F2 51 00 7F F2 51 00 i蜓.蜓.
0091E190 8D F2 51 00 9B F2 51 00 ?Q.?Q.
0091E198 AB F2 51 00 BB F2 51 00 ?Q.或Q.
0091E1A0 CD F2 51 00 E3 F2 51 00 万Q.泸Q.
0091E1A8 F7 F2 51 00 03 F3 51 00 黩Q.笱.
0091E1B0 1F F3 51 00 31 F3 51 00 笱.1笱.
0091E1B8 43 F3 51 00 55 F3 51 00 C笱.U笱.
0091E1C0 65 F3 51 00 77 F3 51 00 e笱.w笱.
0091E1C8 8B F3 51 00 9D F3 51 00 ?Q.?Q.
0091E1D0 B7 F3 51 00 C7 F3 51 00 敷Q.求Q.
0091E1D8 D9 F3 51 00 E9 F3 51 00 袤Q.轶Q.
0091E1E0 03 F4 51 00 19 F4 51 00 粞.粞.
0091E1E8 27 F4 51 00 37 F4 51 00 '粞.7粞.
0091E1F0 49 F4 51 00 57 F4 51 00 I粞.W粞.
0091E1F8 6B F4 51 00 7D F4 51 00 k粞.}粞.
0091E200 8B F4 51 00 9B F4 51 00 ?Q.?Q.
0091E208 A9 F4 51 00 B9 F4 51 00 ?Q.刽Q.
0091E210 C9 F4 51 00 D5 F4 51 00 婶Q.蒸Q.
0091E218 E1 F4 51 00 FD F4 51 00 狒Q.?Q.
0091E220 15 F5 51 00 2D F5 51 00 跹.-跹.
0091E228 3D F5 51 00 4D F5 51 00 =跹.M跹.
0091E230 65 F5 51 00 75 F5 51 00 e跹.u跹.
0091E238 87 F5 51 00 97 F5 51 00 ?Q.?Q.
0091E240 A5 F5 51 00 B1 F5 51 00 ヵQ.滨Q.
0091E248 C1 F5 51 00 CB F5 51 00 刘Q.缩Q.
0091E250 E1 F5 51 00 F3 F5 51 00 狨Q.篚Q.
0091E258 FF F5 51 00 0D F6 51 00 ?Q..鲅. 我们可以看到0091E0F0以上就是00 00
那我们就取0091E0F0作起始地址!
RAV=0091E0F0-00400000(imagbase)=0051E0F0
SIZE我懒得去计算。。。用1000足够了(一般情况下填1000就行了)
好,我们来修复!
OEP=14B0 ,RAV=0051E0F0 ,SIZE=1000
这样修复了之后就OK了
由于这个程序是朋友需要用的~我这样脱掉之后给他~结果他那不能够运行了~呵呵~有跨平台问题~
那我们就来简单的处理一下~把import的设置改下(这是fly大虾介绍的~)
选项---新建输入表的3个选项的勾勾都去掉~~再来修复~~结果拿给朋友~就可以正常运行了~! ********************************************************************************************
*****************
脱壳后记:
关于Armadillo CopyMem-ll 4.X+Debug-Blocker的脱壳方法可以按Armadillo CopyMem-ll 3.X+Debug-
Blocker来脱~
我感觉唯一有点不一样的就是,它对OD的检测更加严格了,我平时使用的两个修改版的OD都无法正常调试
,搞不了2步
OD就提示出错自动退出!幸好我保留了9个不同的修改版,终于找到了2个可以正常调试,不知道大家那里
是不是这样的。。
郁闷~可以告诉我吗~?还有就是跨平台的处理方法那位大虾知道的话~请指点一下~小弟很笨~所以,最好
是有个详细的教程~
谢谢了先!另外大家对付Armadillo CopyMem-ll+Debug-Blocker可以按照jwh51的“Armadillo
COPYMEMEII之DUMP的一个
LOADPE小插件”来脱,过程很简单,有不少的人成功了,而且好像还支持比较高的版本。。。不过,在我
这里却没有成功,
为了测试这个我特地把SP1的系统换成SP2!还是没有成功,郁闷!有个特殊的表现就是在脱的时候LordPE
会死机!大家知道
的请指点一下!谢谢了!
By wynney-2005-6-26
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)