吉祥天传世外挂 1.0.0.1
首先PEID查壳是Armadillo 3.78 -> Silicon Realms Toolworks,其实是4.X的版本,而且是个双线程的标准壳!
下面具体的步骤就不写了,就写一些重点吧!
我是在2000下操作的,不知道在XP下是不是好搞点,呵呵
忽略所有异常,手动添加C000001E,E06D7363异常。隐藏OD!
一、双变单(使程序把自己当成子进程运行)
bp OpenMutexA
Ctrl+G:00401000
00401000 60 pushad
00401001 9C pushfd
00401002 68 A0FD1200 push 12FDA0 ; ASCII "44C::DA47D45903"
00401007 33C0 xor eax,eax
00401009 50 push eax
0040100A 50 push eax
0040100B E8 E694A677 call KERNEL32.CreateMutexA
00401010 9D popfd
00401011 61 popad
00401012 - E9 8F9FA777 jmp KERNEL32.OpenMutexA
在00401000这里写下这些代码。到底是为何?不用写不行吗??难道种做法是穿山甲壳带专利吗?此种做法是否是为了欺骗壳?
60 9C 68 A0 FD 12 00 33 C0 50 50 E8 71 8D A8 77 9D 61 E9 74 8E A8 77
二、避开Anti
he OutputDebugStringA
中断2次!
选中%s%之类的字符,点右键->二进制->使用00填充
删除此断点!
he OutputDebugStringA这条函数是什么意思呢?有什么作用?怎么知道有anti?为何中断2次?试着来的?
三、Magic Jump,避开IAT加密
PS:很奇怪的就是用he GetModuleHandleA+5,却找不到Magic Jump!
bp GetModuleHandleA/he GetModuleHandleA
77E80B1A KE> 55 push ebp //断下,取消这个断点
77E80B1B 8BEC mov ebp,esp
77E80B1D 837D 08 00 cmp dword ptr ss:[ebp+8],0
77E80B21 75 0E jnz short KERNEL32.77E80B31 //F2下断,Shift+F9,断下!注意堆栈!
77E80B23 64:A1 18000000 mov eax,dword ptr fs:[18]
77E80B29 8B40 30 mov eax,dword ptr ds:[eax+30]
77E80B2C 8B40 08 mov eax,dword ptr ds:[eax+8]
001292A4 /0012EBB0
001292A8 |01066AC2 返回到 01066AC2 来自 KERNEL32.GetModuleHandleA
001292AC |0107BD6C ASCII "kernel32.dll"
001292B0 |0107DDAC ASCII "VirtualAlloc"
001292A4 /0012EBB0
001292A8 |01066ADF 返回到 01066ADF 来自 KERNEL32.GetModuleHandleA
001292AC |0107BD6C ASCII "kernel32.dll"
001292B0 |0107DDA0 ASCII "VirtualFree"
00129008 /001292A8
0012900C |01055A99 返回到 01055A99 来自 KERNEL32.GetModuleHandleA
00129010 |0012915C ASCII "kernel32.dll" //取消断点,返回!
01055A99 8B0D 6C500801 mov ecx,dword ptr ds:[108506C] //返回到这里!
01055A9F 89040E mov dword ptr ds:[esi+ecx],eax
01055AA2 A1 6C500801 mov eax,dword ptr ds:[108506C]
01055AA7 391C06 cmp dword ptr ds:[esi+eax],ebx
01055AAA 75 16 jnz short 01055AC2
01055AAC 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
01055AB2 50 push eax
01055AB3 FF15 B8620701 call dword ptr ds:[10762B8] ; KERNEL32.LoadLibraryA
01055AB9 8B0D 6C500801 mov ecx,dword ptr ds:[108506C]
01055ABF 89040E mov dword ptr ds:[esi+ecx],eax
01055AC2 A1 6C500801 mov eax,dword ptr ds:[108506C]
01055AC7 391C06 cmp dword ptr ds:[esi+eax],ebx
01055ACA 0F84 2F010000 je 01055BFF //Magic Jump,改jmp!
01055AD0 33C9 xor ecx,ecx
01055AD2 8B07 mov eax,dword ptr ds:[edi]
01055AD4 3918 cmp dword ptr ds:[eax],ebx
01055AD6 74 06 je short 01055ADE
01055AD8 41 inc ecx
01055AD9 83C0 0C add eax,0C
往下拉,找如此类似的序列(一个jnz,一个jmp,两个salc/Magic Jump)
也可以这样做:Ctrl+F在当前位置查找命令: salc
01055C0E ^\0F85 49FEFFFF jnz 01055A5D
01055C14 EB 03 jmp short 01055C19 //F2下断,Shift+F9,断下!取消断点!
01055C16 D6 salc
01055C17 D6 salc
重要:断下后,记得要撤消Magic Jump处的修改!
为何要这样做?我发现程序在下面会依据原先的代码进行解码,
以前下 硬件断点 操作没有修改原代码,所以解码正确。
而直接修改Magic Jump后改变了原先的代码,导致解码不正确而异常出错!
现在我们在解码以前恢复原先的代码,因此就不会再出错了!
GetModuleHandleA这条函数又是做什么用?是什么意思呢?
还有判断返回时机。所有加壳程序的返回时机都是这样判断带吗?即:001292B0 |0107DDAC ASCII "VirtualAlloc 001292B0 |0107DDA0 ASCII "VirtualFree"00129010 |0012915C ASCII "kernel32.dll" //取消断点,返回!
还有就是这么知道有对代码进行检测?是否只要和
01055C0E ^\0F85 49FEFFFF jnz 01055A5D
01055C14 EB 03 jmp short 01055C19 //F2下断,Shift+F9,断下!取消断点!
01055C16 D6 salc
01055C17 D6 salc
这个类型相似 2个salc就是吗?那句代码是检测代码完整性带?XOR ECX,EXC这句代码是检查代码完整性带吗?
希望各位大大来解答一下~
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)