开始的复活节 发表于 2017-5-5 00:52

手脱PESpin:Debug Blocker(学习历程)

声明:

       1.纪录自己成长历程,与大家分享
       2.由于技术与能力,如有疏漏错误,欢迎指出,高手轻喷

简述:
      
       来尝试PESpin的调试阻碍(Debug Blocker)的保护了,这个保护涉及了双进程保护,按照我的理解就是程序运行后会再创建一个进程来监控自己,如果发现被调试,保护进程会执行相关操作。下面看看怎么来搞定PESpin的双进程保护吧。

0042B0D4 > /EB 01         jmp short Hello_Wo.0042B0D7                ;//程序入口
0042B0D6   |68 60E80000   push 0xE860
0042B0DB    0000            add byte ptr ds:,al


先用常规方法做一下
0042B0D7    60            pushad
0042B0D8    E8 00000000   call Hello_Wo.0042B0DD
0042B0DD    8B1C24          mov ebx,dword ptr ss:               ; kernel32.7C817067                ;//ESP定理法



发现程序跑飞。。。。。此时查看Windows任务管理器发现有两个Hello World.exe的进程,这就是双进程保护。可以用CreateMutexA创建同名互斥体,让程序以为已经创建过进程。

重载程序,删除所有断点。
Ctrl+G 输入CreateMutexA
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:,esi
7C80E9DC    74 31         je short kernel32.7C80EA0F
7C80E9DE    64:A1 18000000mov eax,dword ptr fs:
7C80E9E4    FF75 10         push dword ptr ss:
7C80E9E7    8DB0 F80B0000   lea esi,dword ptr ds:
7C80E9ED    8D45 F8         lea eax,dword ptr ss:
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:
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:
7C80EA0F    56            push esi
7C80EA10    FF75 0C         push dword ptr ss:
7C80EA13    FF75 08         push dword ptr ss:            ; 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


0042EDD6    8985 C66C4000   mov dword ptr ss:,eax             ;//接着单步
0042EDDC    8D85 3A271F03   lea eax,dword ptr ss:
0042EDE2    2D FCCEDE02   sub eax,0x2DECEFC
0042EDE7    FF10            call dword ptr ds:
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:,0x6
0042EDFB    F71424          not dword ptr ss:                   ; Hello_Wo.0042B51B
0042EDFE    832424 01       and dword ptr ss:,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                                     ;//跳转

跳转后来到此处
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

在堆栈窗口中可以查看到
0012FFA0   0042B51B返回到 Hello_Wo.0042B51B
0012FFA4   00635EC0
0012FFA8   0012CE70

Ctrl+G 输入0042B51B
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
0042F762   /E0 00         loopdne short Hello_Wo.0042F764
0042F764   \83F1 87         xor ecx,-0x79                        ;//来到此处


将上一句数值加1
0042F762   /E0 01         loopdne short Hello_Wo.0042F765 ;//Enter查看
0042F764   |83F1 87         xor ecx,-0x79

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

这步跟上面类似了,在堆栈窗口中可以查看到
0012FF9C   0042C6ADHello_Wo.0042C6AD
0012FFA0   0042B51B返回到 Hello_Wo.0042B51B
0012FFA4   00635EC0

Ctrl+G 输入0042C6AD
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:,edx    ; Hello_Wo.0042F72F


寄存器窗口:
需要要平衡堆栈,我们留心会发现因为入栈操作esp减少了4,修补回去
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(过程可能有弹窗,忽略后继续单步)
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 00000000mov eax,dword ptr fs:
004010D5    50            push eax
004010D6    64:8925 0000000>mov dword ptr fs:,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:,esp
004010E6    FF15 63FE4200   call dword ptr ds:             ; kernel32.GetVersion

然后用LoadPE修正镜像大小,用importREC的高级命令获取API调用后剪切无效指针,修复
这是程序还是跑不起来的,还需要用专门修复工具Nanomites的SpiNano工具修复一下,程序运行成功


178021018 发表于 2017-5-5 08:31

谢谢分享

小村村 发表于 2017-5-5 08:53

谢谢分享

tianhett 发表于 2017-5-5 10:03

6666666666666666666666666666

birk 发表于 2017-5-5 10:44

先收藏了..

chenjingyes 发表于 2017-5-6 00:36

谢谢楼主分享{:1_921:}

love看看020 发表于 2017-5-6 08:02

Hmily 发表于 2017-5-16 18:56

新建EIP那是SEH的原因?没看到到怎么过双进程的?是修改了互斥检测?后面分析细说下好了。

..nOvOn.. 发表于 2017-11-30 14:02

给力.....................

ajie1099 发表于 2017-12-2 22:01

感谢分享,楼主辛苦了。
页: [1]
查看完整版本: 手脱PESpin:Debug Blocker(学习历程)