首页
社区
课程
招聘
[原创]tElock 1.0脱壳 风云防火墙个人版
发表于: 2009-3-24 14:29 4725

[原创]tElock 1.0脱壳 风云防火墙个人版

2009-3-24 14:29
4725
tElock 1.0脱壳 风云防火墙个人版
下载地址:  be6K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0t1I4z5q4)9J5k6h3y4U0i4K6u0r3

【软件简介】:一款不错的ARP防火墙软件
【作者声明】:初学脱壳,只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

【调试环境】:WinXP SP3、Ollydbg1.10、PEiD、LordPE、ImportREC

【Ollydbg调试插件】:HideOD、PlantOm、异常计数器

—————————————————————————————————  
【脱壳过程】:

1. PEID查壳:tElock 1.0 (private) -> tE!
    第一次见到这个壳,参考了看雪论坛精华版FLY大侠tElock 0.98b1 脱壳——AntiyPorts V1.2
的脱壳教程。但不懂之处甚多,大侠们见笑了。

2.OD载入FYFireWall.exe主程序,使用HideOD插件隐藏OD,据说tElock会查找窗口和进程,因此使用PlantOm插件隐藏窗口和进程。

3.OD载入后停在下面的地方:
006B5F81 >^\E9 7AE0FFFF     JMP FYFireWa.006B4000
006B5F86    0000            ADD BYTE PTR DS:[EAX],AL
006B5F88    00FE            ADD DH,BH
006B5F8A    FA              CLI
006B5F8B    D038            SAR BYTE PTR DS:[EAX],1
006B5F8D    C9              LEAVE
006B5F8E    5F              POP EDI

4.忽略除内存访问异常以外所有异常,使用异常计数器插件 第一步:开始计数直到程序完全运行。

5.使用异常计数器插件 第二步:带我到OEP,程序停在下面的地方:
006B5BA3    E8 06000000         CALL FYFireWa.006B5BAE
006B5BA8    8B6424 08             MOV ESP,DWORD PTR SS:[ESP+8]  //SEH异常处理
006B5BAC    EB 1A                     JMP SHORT FYFireWa.006B5BC8   
006B5BAE    64:67:FF36 0000   PUSH DWORD PTR FS:[0]
006B5BB4    64:67:8926 0000   MOV DWORD PTR FS:[0],ESP
006B5BBA    9C                          PUSHFD
006B5BBB    810C24 00010000 OR DWORD PTR SS:[ESP],100
006B5BC2    9D                          POPFD
006B5BC3    F8                          CLC
006B5BC4  ^ 73 DC                   JNB SHORT FYFireWa.006B5BA2    //计数器插件中断在这里
006B5BC6    CD 20                     INT 20
006B5BC8    64:67:8F06 0000   POP DWORD PTR FS:[0]
006B5BCE    58                           POP EAX
006B5BCF    61                           POPAD
006B5BD0    F9                           STC
006B5BD1    72 02                      JB SHORT FYFireWa.006B5BD5

  这个时候看堆栈:
0012FF58   0012FFE0  指向下一个 SEH 记录的指针
0012FF5C   006B5BA8  SE处理程序

在006B5BA8下断点,Shift+F9运行,中断在006B5BA8,取消断点,单步
006B5BC8    64:67:8F06 0000 POP DWORD PTR FS:[0]
006B5BCE    58              POP EAX
006B5BCF    61              POPAD
006B5BD0    F9              STC
006B5BD1    72 02           JB SHORT FYFireWa.006B5BD5
006B5BD3    CD 20           INT 20
006B5BD5    C1E8 BF         SHR EAX,0BF                              ; 移位常量超出 1..31 的范围
006B5BD8    E8 00000000     CALL FYFireWa.006B5BDD
006B5BDD    EB 01           JMP SHORT FYFireWa.006B5BE0

这个跳转过去后应该就是开始代码部分的解密了
单步运行到
006B5C79  ^\EB AF           JMP SHORT FYFireWa.006B5C2A
006B5C7B    59              POP ECX
在006B5C7B处按F4,继续单步,到下面的地方,就完成了外壳部分的解密

006B5B0C    66:AB           STOS WORD PTR ES:[EDI]
006B5B0E    8DBD 00104000   LEA EDI,DWORD PTR SS:[EBP+401000]
006B5B14    85F6            TEST ESI,ESI
006B5B16    75 08           JNZ SHORT FYFireWa.006B5B20
006B5B18    C707 33C040C3   MOV DWORD PTR DS:[EDI],C340C033
006B5B1E    EB 0B           JMP SHORT FYFireWa.006B5B2B
006B5B20    C607 E9         MOV BYTE PTR DS:[EDI],0E9
006B5B23    47              INC EDI
006B5B24    2BDF            SUB EBX,EDI
006B5B26    83EB 04         SUB EBX,4
006B5B29    891F            MOV DWORD PTR DS:[EDI],EBX
006B5B2B    8DBD E32A4000   LEA EDI,DWORD PTR SS:[EBP+402AE3]
006B5B31    B9 2C000000     MOV ECX,2C
006B5B36    F3:AA           REP STOS BYTE PTR ES:[EDI]
006B5B38    66:AB           STOS WORD PTR ES:[EDI]
006B5B3A    EB 02           JMP SHORT FYFireWa.006B5B3E
006B5B3C    CD 20           INT 20
006B5B3E    61              POPAD
006B5B3F    E8 00000000     CALL FYFireWa.006B5B44
006B5B44    5A              POP EDX
006B5B45    81EA 0E000000   SUB EDX,0E
006B5B4B    57              PUSH EDI
006B5B4C    51              PUSH ECX
006B5B4D    33C0            XOR EAX,EAX
006B5B4F    8D3A            LEA EDI,DWORD PTR DS:[EDX]
006B5B51    B9 20000000     MOV ECX,20
006B5B56    F3:AA           REP STOS BYTE PTR ES:[EDI]
006B5B58    66:AB           STOS WORD PTR ES:[EDI]
006B5B5A    59              POP ECX
006B5B5B    5F              POP EDI
006B5B5C    C3              RETN  //返回到OEP

RETN之后就是我们熟悉的 Delphi 入口函数代码了。
00571A08    55              PUSH EBP
00571A09    8BEC            MOV EBP,ESP
00571A0B    83C4 E4         ADD ESP,-1C
00571A0E    53              PUSH EBX
00571A0F    56              PUSH ESI
00571A10    33C0            XOR EAX,EAX
00571A12    8945 E4         MOV DWORD PTR SS:[EBP-1C],EAX
00571A15    8945 EC         MOV DWORD PTR SS:[EBP-14],EAX
00571A18    8945 E8         MOV DWORD PTR SS:[EBP-18],EAX
00571A1B    B8 E0155700     MOV EAX,FYFireWa.005715E0
00571A20    E8 3353E9FF     CALL FYFireWa.00406D58
00571A25    8B35 74625700   MOV ESI,DWORD PTR DS:[576274]            ; FYFireWa.00577BC8
00571A2B    33C0            XOR EAX,EAX
00571A2D    55              PUSH EBP
00571A2E    68 D61B5700     PUSH FYFireWa.00571BD6
00571A33    64:FF30         PUSH DWORD PTR FS:[EAX]
00571A36    64:8920         MOV DWORD PTR FS:[EAX],ESP
00571A39    68 E41B5700     PUSH FYFireWa.00571BE4                   ; ASCII "FireWallAppMain"
00571A3E    6A FF           PUSH -1
00571A40    6A 00           PUSH 0
00571A42    E8 D555E9FF     CALL FYFireWa.0040701C
00571A47    8BD8            MOV EBX,EAX
00571A49    85DB            TEST EBX,EBX
00571A4B    74 1E           JE SHORT FYFireWa.00571A6B
00571A4D    E8 0A57E9FF     CALL FYFireWa.0040715C                   ; JMP 到 ntdll.RtlGetLastWin32Error
00571A52    3D B7000000     CMP EAX,0B7
00571A57    75 12           JNZ SHORT FYFireWa.00571A6B
00571A59    53              PUSH EBX
00571A5A    E8 8555E9FF     CALL FYFireWa.00406FE4                   ; JMP 到 kernel32.CloseHandle
00571A5F    6A 00           PUSH 0
00571A61    E8 0656E9FF     CALL FYFireWa.0040706C                   ; JMP 到 kernel32.ExitProcess

dump: 打开LordPE,选择脱壳进程,修正一下进程大小,然后完整转存。
修复IAT:打开ImportREC,选择脱壳进程,OEP修改为71A08,点IAT AutoSearch,然后Get Imports,可以看到没有无效指针,点Fix dump修复即可。

用PEID查修复好了的壳,为Borland Delphi 6.0 - 7.0,双击正常运行,脱壳完成。

6.第一次写脱壳文章,错误之处望各位大侠不吝赐教。

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回