这几天新买了一个苹果机,想往里面传点电子书,找到了一个电子书制作软件,epubBuilder。
软件是免费的,但是必须定期强制更新,很烦,打算过掉。
PEID查了一下
Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks
双进程,
看了RegKiller 的穿山甲教程以后 拉开工具就开干。
下面是脱壳过程。
00AABC43 >/$ 55 push ebp
00AABC44 |. 8BEC mov ebp,esp
00AABC46 |. 6A FF push -1
00AABC48 |. 68 904FAD00 push epubBuil.00AD4F90
00AABC4D |. 68 80B9AA00 push epubBuil.00AAB980 ; SE 处理程序安装
00AABC52 |. 64:A1 0000000>mov eax,dword ptr fs:[0]
00AABC58 |. 50 push eax
00AABC59 |. 64:8925 00000>mov dword ptr fs:[0],esp
00AABC60 |. 83EC 58 sub esp,58
00AABC63 |. 53 push ebx
00AABC64 |. 56 push esi
开头是00A 根据某个大佬的意见,等下分离进程的时候要用到
下bp OpenMutexA
断在
7C80EABB > 8BFF mov edi,edi ; ntdll.7C930228
7C80EABD 55 push ebp
7C80EABE 8BEC mov ebp,esp
7C80EAC0 51 push ecx
7C80EAC1 51 push ecx
7C80EAC2 837D 10 00 cmp dword ptr ss:[ebp+10],0
7C80EAC6 56 push esi
7C80EAC7 0F84 A7550300 je kernel32.7C844074
7C80EACD 64:A1 18000000 mov eax,dword ptr fs:[18]
跳到00A01000 记下堆栈里的数据
0012F7A4 0012FDD8 \MutexName = "E8::DA08782BAD"
然后修改
00A01000 60 pushad
00A01001 9C pushfd
00A01002 68 D8FD1200 push 12FDD8 ; ASCII "E8::DA08782BAD"
00A01007 33C0 xor eax,eax
00A01009 50 push eax
00A0100A 50 push eax
00A0100B E8 CFD9E07B call kernel32.CreateMutexA
00A01010 9D popfd
00A01011 61 popad
00A01012 - E9 A4DAE07B jmp kernel32.OpenMutexA
00A01017 90 nop
对PUSHAD 新建EIP
F9
然后删除断点 返回到00A01000
撤销修改
分离父子进程完毕。
然后是魔法跳
下硬断后
多次F9
来到
00129528 01877122 /CALL 到 GetModuleHandleA 来自 0187711C
0012952C 0188BC1C \pModule = "kernel32.dll"
00129530 0188CEB8 ASCII "VirtualFree"
再一次,F9 返回···
01865FDA /75 16 jnz short 01865FF2
01865FDC |8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
01865FE2 |50 push eax
01865FE3 |FF15 BC628801 call dword ptr ds:[18862BC] ; kernel32.LoadLibraryA
01865FE9 |8B0D AC408901 mov ecx,dword ptr ds:[18940AC]
01865FEF |89040E mov dword ptr ds:[esi+ecx],eax
01865FF2 \A1 AC408901 mov eax,dword ptr ds:[18940AC]
01865FF7 391C06 cmp dword ptr ds:[esi+eax],ebx
01865FFA 0F84 2F010000 je 0186612F /////魔法跳 修改成JMP
01866000 33C9 xor ecx,ecx
01866002 8B07 mov eax,dword ptr ds:[edi]
01866004 3918 cmp dword ptr ds:[eax],ebx
01866006 74 06 je short 0186600E
修改后,清除硬件断点
然后就是寻找入口点了,这也是我困惑的地方
首先
bp GetCurrentThreadId
F9
REG的原话是“这里说下我判断返回的经验,我的经验是 00C060E6 跟上面跨段很大。前面都是7开头的,而这个是00C 开始的。”
然后我这边的情况是
堆栈一开始是
00128B4C 73391E46 /CALL 到 GetCurrentThreadId 来自 msvbvm60.73391E40
多次F9后 突然就是
00128DD8 4AF09A8A /CALL 到 GetCurrentThreadId 来自 GdiPlus.4AF09A84
我个人觉得这里跨度也是蛮大的,果断返回,
4AF09A8A 33F0 xor esi,eax
4AF09A8C FF15 F411E94A call dword ptr ds:[<&KERNEL32.GetTickCou>; kernel32.GetTickCount
4AF09A92 33F0 xor esi,eax
4AF09A94 8D45 F0 lea eax,dword ptr ss:[ebp-10]
4AF09A97 50 push eax
4AF09A98 FF15 3C11E94A call dword ptr ds:[<&KERNEL32.QueryPerfo>; kernel32.QueryPerformanceCounter
4AF09A9E 8B45 F4 mov eax,dword ptr ss:[ebp-C]
就到这里了
和REG大大说的
00C060EC 50 PUSH EAX ; 返回到这里。我们F8单步向下下走
00C060ED FF75 FC PUSH DWORD PTR SS:[EBP-4]
00C060F0 E8 05000000 CALL 00C060FA
00C060F5 83C4 0C ADD ESP,0C
00C060F8 C9 LEAVE
00C060F9 C3 RETN
有很大区别,
整个脱壳过程到这里就无法继续下去了,希望对穿山甲有研究的大大们指教一下。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)