• 标 题:Unpacking forgot's PEQuake
  • 作 者:cyclotron
  • 时 间:004-10-09,11:22
  • 链 接:http://bbs.pediy.com

*** Unpacking forgot's PEQuake ***
*** cyclotron[BCG][DFCG][FCG][OCN] ***

PEQuake, 内部代号 shit
作者 forgot
下载 点击此处下载

简介:这个壳的使用了大量花指令反跟踪,调用CreateThread切换线程并挂起主线程,检查父进程、调试器,输入表重构,修改PEB,IAT没有加密,不过使用了一张跳转表(严重盗版!!!),懒的话可以以壳解壳啦。。。话说回来,这是我有能力脱的为数不多的几个壳之一。。。

话不多说,直奔主题:

忽略所有异常,隐藏Olly,载入后来到这里:

代码:
00422000 >  E8 A5000000     CALL PEQuake.004220AA 004220AA    5D              POP EBP        ;PEQuake.00422005 004220AB    81ED 05000000   SUB EBP,5 004220B1    8D75 3D         LEA ESI,DWORD PTR SS:[EBP+3D] 004220B4    56              PUSH ESI 004220B5    FF55 31         CALL DWORD PTR SS:[EBP+31]    ;GetModuleHandle 004220B8    8DB5 81000000   LEA ESI,DWORD PTR SS:[EBP+81] 004220BE    56              PUSH ESI 004220BF    50              PUSH EAX 004220C0    FF55 2D         CALL DWORD PTR SS:[EBP+2D]    ;GetProcAddress 004220C3    8985 8E000000   MOV DWORD PTR SS:[EBP+8E],EAX 004220C9    6A 04           PUSH 4 004220CB    68 00100000     PUSH 1000 004220D0    68 0F9C0000     PUSH 9C0F 004220D5    6A 00           PUSH 0 004220D7    FF95 8E000000   CALL DWORD PTR SS:[EBP+8E]    ;VirtualAlloc 004220DD    50              PUSH EAX 004220DE    8B9D 7D000000   MOV EBX,DWORD PTR SS:[EBP+7D] 004220E4    03DD            ADD EBX,EBP 004220E6    50              PUSH EAX 004220E7    53              PUSH EBX 004220E8    E8 04000000     CALL PEQuake.004220F1    ;对外壳代码解压 004220ED    5A              POP EDX 004220EE    55              PUSH EBP 004220EF    FFE2            JMP EDX        ;典型的hying入口


接下来有一大段SEH和花指令垃圾,我们下断点:bp CreateThread,直接来到副线程。

代码:
0012FFA8   00344799  /CALL to CreateThread from 00344793 0012FFAC   00000000  |pSecurity = NULL 0012FFB0   00000000  |StackSize = 0 0012FFB4   00344761  |ThreadFunction = 00344761      ;在入口处下断点bp 344761 0012FFB8   77E7CA90  |pThreadParm = kErNeL32.77E7CA90 0012FFBC   00000000  |CreationFlags = 0 0012FFC0   00344824  \pThreadId = 00344824 0012FFC4   77E7CA90  RETURN to kErNeL32.77E7CA90


中断在这里:

代码:
00344761    E8 00000000     CALL 00344766 00344766    5D              POP EBP 00344767    81ED A4184000   SUB EBP,4018A4 0034476D    68 F4010000     PUSH 1F4 00344772    FF95 B1634000   CALL DWORD PTR SS:[EBP+4063B1]  ;Sleep 00344778    8D85 92194000   LEA EAX,DWORD PTR SS:[EBP+401992] 0034477E    FFE0            JMP EAX


Ctrl+F搜索指令 CMP EAX,4C505845,找到:
代码:
00345106    25 5F5F5F5F     AND EAX,5F5F5F5F 0034510B    3D 4558504C     CMP EAX,4C505845 00345110  - 75 FE           JNZ SHORT 00345110      ;如果不是EXPLORER.EXE就在这里挂起


好了,把这个跳转改掉,disable父进程检查。后面的反跟踪都没什么用了。

Alt+M对code段下内存访问断点,直接来到OEP。

接下来修复跳转表,从入口点跟进去:
代码:
00406AFA    8D35 C5C14000   LEA ESI,DWORD PTR DS:[40C1C5]  ;OEP 00406B00    8D3D E0C74000   LEA EDI,DWORD PTR DS:[40C7E0] 00406B06    B9 10000000     MOV ECX,10 00406B0B    F3:A4           REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[> 00406B0D    C705 C4C74000 F>MOV DWORD PTR DS:[40C7C4],-0C 00406B17    C705 D4C74000 0>MOV DWORD PTR DS:[40C7D4],109 00406B21    C605 DBC74000 0>MOV BYTE PTR DS:[40C7DB],1 00406B28    6A 00           PUSH 0 00406B2A    E8 45220000     CALL PEQuake.00408D74    ;这里跟进去 00406B2F    A3 34C54000     MOV DWORD PTR DS:[40C534],EAX 00406B34    6A 00           PUSH 0 00406B36    68 536B4000     PUSH PEQuake.00406B53


好家伙,JMP TABLE全改了:
代码:
00408D56    90              NOP 00408D57    E8 B9FDF3FF     CALL 00348B15 00408D5C    90              NOP 00408D5D    E8 B3FDF3FF     CALL 00348B15 00408D62    90              NOP 00408D63    E8 ADFDF3FF     CALL 00348B15 00408D68    90              NOP 00408D69    E8 A7FDF3FF     CALL 00348B15 00408D6E    90              NOP 00408D6F    E8 A1FDF3FF     CALL 00348B15 00408D74    90              NOP 00408D75    E8 9BFDF3FF     CALL 00348B15 00408D7A    90              NOP 00408D7B    E8 95FDF3FF     CALL 00348B15 00408D80    90              NOP 00408D81    E8 8FFDF3FF     CALL 00348B15 00408D86    90              NOP 00408D87    E8 89FDF3FF     CALL 00348B15 00408D8C    90              NOP 00408D8D    E8 83FDF3FF     CALL 00348B15 00408D92    90              NOP 00408D93    E8 7DFDF3FF     CALL 00348B15 00408D98    90              NOP 00408D99    E8 77FDF3FF     CALL 00348B15 00408D9E    90              NOP 00408D9F    E8 71FDF3FF     CALL 00348B15 00408DA4    90              NOP 00408DA5    E8 6BFDF3FF     CALL 00348B15 00408DAA    90              NOP 00408DAB    E8 65FDF3FF     CALL 00348B15 00408DB0    90              NOP 00408DB1    E8 5FFDF3FF     CALL 00348B15 00408DB6    90              NOP 00408DB7    E8 59FDF3FF     CALL 00348B15 00408DBC    90              NOP 00408DBD    E8 53FDF3FF     CALL 00348B15 00408DC2    90              NOP 00408DC3    E8 4DFDF3FF     CALL 00348B15 00408DC8    90              NOP 00408DC9    E8 47FDF3FF     CALL 00348B15 00408DCE    90              NOP 00408DCF    E8 41FDF3FF     CALL 00348B15 00408DD4    90              NOP 00408DD5    E8 3BFDF3FF     CALL 00348B15 00408DDA    90              NOP 00408DDB    E8 35FDF3FF     CALL 00348B15 00408DE0    90              NOP 00408DE1    E8 2FFDF3FF     CALL 00348B15 00408DE6    90              NOP 00408DE7    E8 29FDF3FF     CALL 00348B15 00408DEC    90              NOP 00408DED    E8 23FDF3FF     CALL 00348B15 00408DF2    90              NOP 00408DF3    E8 1DFDF3FF     CALL 00348B15 00408DF8    90              NOP 00408DF9    E8 17FDF3FF     CALL 00348B15 00408DFE    90              NOP 00408DFF    E8 11FDF3FF     CALL 00348B15 00408E04    90              NOP 00408E05    E8 0BFDF3FF     CALL 00348B15 00408E0A    90              NOP 00408E0B    E8 05FDF3FF     CALL 00348B15 00408E10    90              NOP 00408E11    E8 FFFCF3FF     CALL 00348B15 00408E16    90              NOP 00408E17    E8 F9FCF3FF     CALL 00348B15 00408E1C    90              NOP 00408E1D    E8 F3FCF3FF     CALL 00348B15 00408E22    90              NOP 00408E23    E8 EDFCF3FF     CALL 00348B15 00408E28    90              NOP 00408E29    E8 E7FCF3FF     CALL 00348B15 00408E2E    90              NOP 00408E2F    E8 E1FCF3FF     CALL 00348B15 00408E34    90              NOP 00408E35    E8 DBFCF3FF     CALL 00348B15 00408E3A    90              NOP 00408E3B    E8 D5FCF3FF     CALL 00348B15 00408E40    90              NOP 00408E41    E8 CFFCF3FF     CALL 00348B15 00408E46    90              NOP 00408E47    E8 C9FCF3FF     CALL 00348B15 00408E4C    90              NOP 00408E4D    E8 C3FCF3FF     CALL 00348B15 00408E52    90              NOP 00408E53    E8 BDFCF3FF     CALL 00348B15 00408E58    90              NOP 00408E59    E8 B7FCF3FF     CALL 00348B15


找一个call跟进349B15,走过一段花指令以后,发现解码算法:
代码:
00348DD3    33D2            XOR EDX,EDX 00348DD5    B9 02000000     MOV ECX,2 00348DDA    F7E1            MUL ECX 00348DDC    D1E8            SHR EAX,1        ;把最高位去掉 00348DDE    3BF8            CMP EDI,EAX        ;是否与对应的JMP调用地址相同 00348DE0    0F85 62010000   JNZ 00348F48


这里是按JMP调用地址进行查表,由此得到IAT的对应位置,最后跳转到相应的API入口,用到码表如下,算法很简单,就是去掉最高位:
代码:
00349AA7  86 8D 40 80 3C B0 40 00   00349AAF  AA 8D 40 80 40 B0 40 00   00349AB7  A4 8D 40 80 44 B0 40 00   00349ABF  9E 8D 40 80 48 B0 40 00   00349AC7  98 8D 40 80 4C B0 40 00   00349ACF  92 8D 40 80 50 B0 40 00   00349AD7  8C 8D 40 80 54 B0 40 00   00349ADF  5C 8D 40 80 58 B0 40 00   00349AE7  80 8D 40 80 5C B0 40 00   00349AEF  62 8D 40 80 60 B0 40 00   00349AF7  7A 8D 40 80 64 B0 40 00   00349AFF  74 8D 40 80 68 B0 40 00   00349B07  6E 8D 40 80 6C B0 40 00   00349B0F  68 8D 40 80 70 B0 40 00   00349B17  10 8E 40 80 80 B0 40 00   00349B1F  0A 8E 40 80 84 B0 40 00   00349B27  04 8E 40 80 88 B0 40 00   00349B2F  FE 8D 40 80 8C B0 40 00   00349B37  F8 8D 40 80 90 B0 40 00   00349B3F  F2 8D 40 80 94 B0 40 00   00349B47  EC 8D 40 80 98 B0 40 00   00349B4F  E0 8D 40 80 9C B0 40 00   00349B57  DA 8D 40 80 A0 B0 40 00   00349B5F  D4 8D 40 80 A4 B0 40 00   00349B67  CE 8D 40 80 A8 B0 40 00   00349B6F  C8 8D 40 80 AC B0 40 00   00349B77  C2 8D 40 80 B0 B0 40 00   00349B7F  BC 8D 40 80 B4 B0 40 00   00349B87  B6 8D 40 80 B8 B0 40 00   00349B8F  B0 8D 40 80 BC B0 40 00   00349B97  E6 8D 40 80 C0 B0 40 00   00349B9F  16 8E 40 80 00 B0 40 00  ;这个值最小了   00349BA7  1C 8E 40 80 08 B0 40 00   00349BAF  22 8E 40 80 10 B0 40 00   00349BB7  28 8E 40 80 14 B0 40 00   00349BBF  2E 8E 40 80 18 B0 40 00   00349BC7  34 8E 40 80 1C B0 40 00   00349BCF  3A 8E 40 80 20 B0 40 00   00349BD7  40 8E 40 80 24 B0 40 00   00349BDF  46 8E 40 80 28 B0 40 00   00349BE7  4C 8E 40 80 2C B0 40 00   00349BEF  52 8E 40 80 30 B0 40 00   00349BF7  58 8E 40 80 34 B0 40 00   00349BFF  5E 8E 40 80 78 B0 40 00  


码表右边四列就是IAT的VA了,赶快填入ImportRec,RVA:B000,Size:1000,重建输入表,全部识别完成。填入入口点6AFA,Fixdump,收工。

附:跳转表修复结果如下
代码:
00408D56  - FF25 58B04000   JMP DWORD PTR DS:[40B058]                ; kErNeL32.CloseHandle 00408D5C  - FF25 60B04000   JMP DWORD PTR DS:[40B060]                ; kErNeL32.CopyFileA 00408D62  - FF25 70B04000   JMP DWORD PTR DS:[40B070]                ; kErNeL32.CreateFileA 00408D68  - FF25 6CB04000   JMP DWORD PTR DS:[40B06C]                ; kErNeL32.ExitProcess 00408D6E  - FF25 68B04000   JMP DWORD PTR DS:[40B068]                ; kErNeL32.GetFileSize 00408D74  - FF25 64B04000   JMP DWORD PTR DS:[40B064]                ; kErNeL32.GetModuleHandleA 00408D7A  - FF25 5CB04000   JMP DWORD PTR DS:[40B05C]                ; kErNeL32.GetPrivateProfileIntA 00408D80  - FF25 3CB04000   JMP DWORD PTR DS:[40B03C]                ; kErNeL32.ReadFile 00408D86  - FF25 54B04000   JMP DWORD PTR DS:[40B054]                ; ntdll.RtlZeroMemory 00408D8C  - FF25 50B04000   JMP DWORD PTR DS:[40B050]                ; kErNeL32.SetFilePointer 00408D92  - FF25 4CB04000   JMP DWORD PTR DS:[40B04C]                ; kErNeL32.VirtualAlloc 00408D98  - FF25 48B04000   JMP DWORD PTR DS:[40B048]                ; kErNeL32.VirtualFree 00408D9E  - FF25 44B04000   JMP DWORD PTR DS:[40B044]                ; kErNeL32.WriteFile 00408DA4  - FF25 40B04000   JMP DWORD PTR DS:[40B040]                ; kErNeL32.WritePrivateProfileStringA 00408DAA  - FF25 BCB04000   JMP DWORD PTR DS:[40B0BC]                ; uSeR32.BeginPaint 00408DB0  - FF25 B8B04000   JMP DWORD PTR DS:[40B0B8]                ; uSeR32.CheckDlgButton 00408DB6  - FF25 B4B04000   JMP DWORD PTR DS:[40B0B4]                ; uSeR32.CreateDialogParamA 00408DBC  - FF25 B0B04000   JMP DWORD PTR DS:[40B0B0]                ; uSeR32.DialogBoxParamA 00408DC2  - FF25 ACB04000   JMP DWORD PTR DS:[40B0AC]                ; uSeR32.EnableWindow 00408DC8  - FF25 A8B04000   JMP DWORD PTR DS:[40B0A8]                ; uSeR32.EndPaint 00408DCE  - FF25 A4B04000   JMP DWORD PTR DS:[40B0A4]                ; uSeR32.FillRect 00408DD4  - FF25 A0B04000   JMP DWORD PTR DS:[40B0A0]                ; uSeR32.GetDC 00408DDA  - FF25 9CB04000   JMP DWORD PTR DS:[40B09C]                ; uSeR32.GetDlgItem 00408DE0  - FF25 C0B04000   JMP DWORD PTR DS:[40B0C0]                ; uSeR32.LoadBitmapA 00408DE6  - FF25 98B04000   JMP DWORD PTR DS:[40B098]                ; uSeR32.PostQuitMessage 00408DEC  - FF25 94B04000   JMP DWORD PTR DS:[40B094]                ; uSeR32.ReleaseDC 00408DF2  - FF25 90B04000   JMP DWORD PTR DS:[40B090]                ; uSeR32.SendDlgItemMessageA 00408DF8  - FF25 8CB04000   JMP DWORD PTR DS:[40B08C]                ; uSeR32.SendMessageA 00408DFE  - FF25 88B04000   JMP DWORD PTR DS:[40B088]                ; uSeR32.SetDlgItemTextA 00408E04  - FF25 84B04000   JMP DWORD PTR DS:[40B084]                ; uSeR32.SetTimer 00408E0A  - FF25 80B04000   JMP DWORD PTR DS:[40B080]                ; uSeR32.ShowWindow 00408E10  - FF25 00B04000   JMP DWORD PTR DS:[40B000]                ; comctl32.InitCommonControls 00408E16  - FF25 08B04000   JMP DWORD PTR DS:[40B008]                ; comdlg32.GetOpenFileNameA 00408E1C  - FF25 10B04000   JMP DWORD PTR DS:[40B010]                ; GDI32.BitBlt 00408E22  - FF25 14B04000   JMP DWORD PTR DS:[40B014]                ; GDI32.CreateCompatibleBitmap 00408E28  - FF25 18B04000   JMP DWORD PTR DS:[40B018]                ; GDI32.CreateCompatibleDC 00408E2E  - FF25 1CB04000   JMP DWORD PTR DS:[40B01C]                ; GDI32.CreateFontIndirectA 00408E34  - FF25 20B04000   JMP DWORD PTR DS:[40B020]                ; GDI32.CreateSolidBrush 00408E3A  - FF25 24B04000   JMP DWORD PTR DS:[40B024]                ; GDI32.GetTextExtentPoint32A 00408E40  - FF25 28B04000   JMP DWORD PTR DS:[40B028]                ; GDI32.SelectObject 00408E46  - FF25 2CB04000   JMP DWORD PTR DS:[40B02C]                ; GDI32.SetBkMode 00408E4C  - FF25 30B04000   JMP DWORD PTR DS:[40B030]                ; GDI32.SetTextColor 00408E52  - FF25 34B04000   JMP DWORD PTR DS:[40B034]                ; GDI32.TextOutA 00408E58  - FF25 78B04000   JMP DWORD PTR DS:[40B078]                ; SHELL32.ShellExecuteA


dump 下载
http://bbs.pediy.com/upload/file/2004/10/dPEQuake_.rar_223.rar