声明:
1.纪录自己成长历程,与大家分享
2.由于技术与能力,如有疏漏错误,欢迎指出,高手轻喷
简述:
来尝试PESpin的调试阻碍(Debug Blocker)的保护了,这个保护涉及了双进程保护,按照我的理解就是程序运行后会再创建一个进程来监控自己,如果发现被调试,保护进程会执行相关操作。下面看看怎么来搞定PESpin的双进程保护吧。
[Asm] 纯文本查看 复制代码 0042B0D4 > /EB 01 jmp short Hello_Wo.0042B0D7 ;//程序入口
0042B0D6 |68 60E80000 push 0xE860
0042B0DB 0000 add byte ptr ds:[eax],al
先用常规方法做一下
[Asm] 纯文本查看 复制代码 0042B0D7 60 pushad
0042B0D8 E8 00000000 call Hello_Wo.0042B0DD
0042B0DD 8B1C24 mov ebx,dword ptr ss:[esp] ; kernel32.7C817067 ;//ESP定理法
发现程序跑飞。。。。。此时查看Windows任务管理器发现有两个Hello World.exe的进程,这就是双进程保护。可以用CreateMutexA创建同名互斥体,让程序以为已经创建过进程。
重载程序,删除所有断点。
Ctrl+G 输入CreateMutexA
[Asm] 纯文本查看 复制代码 7C80E9CF > 8BFF mov edi,edi
7C80E9D1 55 push ebp
7C80E9D2 8BEC mov ebp,esp
7C80E9D4 51 push ecx
7C80E9D5 51 push ecx
7C80E9D6 56 push esi
7C80E9D7 33F6 xor esi,esi
7C80E9D9 3975 10 cmp dword ptr ss:[ebp+0x10],esi
7C80E9DC 74 31 je short kernel32.7C80EA0F
7C80E9DE 64:A1 18000000 mov eax,dword ptr fs:[0x18]
7C80E9E4 FF75 10 push dword ptr ss:[ebp+0x10]
7C80E9E7 8DB0 F80B0000 lea esi,dword ptr ds:[eax+0xBF8]
7C80E9ED 8D45 F8 lea eax,dword ptr ss:[ebp-0x8]
7C80E9F0 50 push eax
7C80E9F1 FF15 8C10807C call dword ptr ds:[<&ntdll.RtlInitAnsiSt>; ntdll.RtlInitAnsiString
7C80E9F7 6A 00 push 0x0
7C80E9F9 8D45 F8 lea eax,dword ptr ss:[ebp-0x8]
7C80E9FC 50 push eax
7C80E9FD 56 push esi
7C80E9FE FF15 8810807C call dword ptr ds:[<&ntdll.RtlAnsiString>; ntdll.RtlAnsiStringToUnicodeString
7C80EA04 85C0 test eax,eax
7C80EA06 0F8C B2550300 jl kernel32.7C843FBE
7C80EA0C 8B76 04 mov esi,dword ptr ds:[esi+0x4]
7C80EA0F 56 push esi
7C80EA10 FF75 0C push dword ptr ss:[ebp+0xC]
7C80EA13 FF75 08 push dword ptr ss:[ebp+0x8] ; Hello_Wo.<ModuleEntryPoint>
7C80EA16 E8 2CFFFFFF call kernel32.CreateMutexW
7C80EA1B 5E pop esi ; kernel32.7C817067
7C80EA1C C9 leave
7C80EA1D C2 0C00 retn 0xC ;//F4此处ALT+F9
[Asm] 纯文本查看 复制代码 0042EDD6 8985 C66C4000 mov dword ptr ss:[ebp+0x406CC6],eax ;//接着单步
0042EDDC 8D85 3A271F03 lea eax,dword ptr ss:[ebp+0x31F273A]
0042EDE2 2D FCCEDE02 sub eax,0x2DECEFC
0042EDE7 FF10 call dword ptr ds:[eax]
0042EDE9 BB CA7DB9FE mov ebx,0xFEB97DCA
0042EDEE 81EB 137DB9FE sub ebx,0xFEB97D13
0042EDF4 3BC3 cmp eax,ebx
0042EDF6 9C pushfd ;//到这步时将寄存器窗口中的Z置1
0042EDF7 C12C24 06 shr dword ptr ss:[esp],0x6
0042EDFB F71424 not dword ptr ss:[esp] ; Hello_Wo.0042B51B
0042EDFE 832424 01 and dword ptr ss:[esp],0x1
0042EE02 58 pop eax ; Hello_Wo.0042B51B
0042EE03 2BD2 sub edx,edx ; ntdll.KiFastSystemCallRet
0042EE05 BB BAE74D02 mov ebx,0x24DE7BA
0042EE0A 81EB 86E74D02 sub ebx,0x24DE786
0042EE10 F7E3 mul ebx
0042EE12 81CB FE12F40E or ebx,0xEF412FE
0042EE18 8D8428 A60C91ED lea eax,dword ptr ds:[eax+ebp-0x126EF35A>
0042EE1F 2D 179B50ED sub eax,0xED509B17
0042EE24 - FFE0 jmp eax ;//跳转
跳转后来到此处
[Asm] 纯文本查看 复制代码 0042EE3D F1 int1
0042EE3E E8 1C030000 call Hello_Wo.0042F15F
0042EE43 85C0 test eax,eax ; Hello_Wo.0042EE3D
0042EE45 75 23 jnz short Hello_Wo.0042EE6A
0042EE47 8BC3 mov eax,ebx
0042EE49 35 08001F0E xor eax,0xE1F0008
在堆栈窗口中可以查看到
[Asm] 纯文本查看 复制代码 0012FFA0 0042B51B 返回到 Hello_Wo.0042B51B
0012FFA4 00635EC0
0012FFA8 0012CE70
Ctrl+G 输入0042B51B
[Asm] 纯文本查看 复制代码 0042B51B B8 C1A65D7A mov eax,0x7A5DA6C1 ;//右键此处为新的EIP
0042B520 2BC9 sub ecx,ecx
0042B522 83C9 15 or ecx,0x15
0042B525 0FA3C8 bt eax,ecx
Ctrl+B 搜索二进制字串F1 87 DF找下一处int1
[Asm] 纯文本查看 复制代码 0042F762 /E0 00 loopdne short Hello_Wo.0042F764
0042F764 \83F1 87 xor ecx,-0x79 ;//来到此处
将上一句数值加1
[Asm] 纯文本查看 复制代码 0042F762 /E0 01 loopdne short Hello_Wo.0042F765 ;//Enter查看
0042F764 |83F1 87 xor ecx,-0x79
[Asm] 纯文本查看 复制代码 0042F765 F1 int1 ;//F2下段 SHIFT+F9后取消断点
0042F766 87DF xchg edi,ebx
0042F768 57 push edi ; Hello_Wo.0042FDC6
0042F769 C3 retn
0042F76A 55 push ebp
0042F76B 8BEC mov ebp,esp
这步跟上面类似了,在堆栈窗口中可以查看到
[Asm] 纯文本查看 复制代码 0012FF9C 0042C6AD Hello_Wo.0042C6AD
0012FFA0 0042B51B 返回到 Hello_Wo.0042B51B
0012FFA4 00635EC0
Ctrl+G 输入0042C6AD
[Asm] 纯文本查看 复制代码 0042C6AD /EB 04 jmp short Hello_Wo.0042C6B3 ;//右键此处为新的EIP
0042C6AF |7A EB jpe short Hello_Wo.0042C69C
0042C6B1 |04 9A add al,0x9A
0042C6B3 ^\EB FB jmp short Hello_Wo.0042C6B0
0042C6B5 FFF6 push esi
0042C6B7 8591 6B400001 test dword ptr ds:[ecx+0x100406B],edx ; Hello_Wo.0042F72F
寄存器窗口:
需要要平衡堆栈,我们留心会发现因为入栈操作esp减少了4,修补回去
[Asm] 纯文本查看 复制代码 EAX FFFFFFFF
ECX 00000000
EDX 0042F72F Hello_Wo.0042F72F
EBX B4801F41
ESP 0012FF9C ;修改为0012FFA0
EBP 00027CAE
ESI 00000000
EDI 0217FA48
EIP 0042C6AD Hello_Wo.0042C6AD
单步跟来到OEP(过程可能有弹窗,忽略后继续单步)
[Asm] 纯文本查看 复制代码 004010C0 55 push ebp ;//右键此处为新的EIP
004010C1 8dc0 lea eax,eax ;跳转到此处
004010C3 6A FF push -0x1
004010C5 68 28214200 push Hello_Wo.00422128
004010CA 68 C02F4000 push Hello_Wo.00402FC0
004010CF 64:A1 00000000 mov eax,dword ptr fs:[0]
004010D5 50 push eax
004010D6 64:8925 0000000>mov dword ptr fs:[0],esp
004010DD 83C4 A4 add esp,-0x5C
004010E0 53 push ebx
004010E1 56 push esi
004010E2 57 push edi ; Hello_Wo.0042B51B
004010E3 8965 E8 mov dword ptr ss:[ebp-0x18],esp
004010E6 FF15 63FE4200 call dword ptr ds:[0x42FE63] ; kernel32.GetVersion
然后用LoadPE修正镜像大小,用importREC的高级命令获取API调用后剪切无效指针,修复
这是程序还是跑不起来的,还需要用专门修复工具Nanomites的SpiNano工具修复一下,程序运行成功
|