Nisy 发表于 2008-6-16 10:05:25

浅谈伪装壳Hide PE v1.1的实现机理

——

    早上到论坛发现cxlrb兄发布了一个伪装壳,下来测试下效果 加了DEL的测试不成功 加VC 6.0测试OK 既然可以加壳成功 那我们来分析一下为什么有些失败呢 我们先来分析下这个伪装壳是如何实现的

Hide PE v1.1 Cracked by Flashback
http://www.unpack.cn/viewthread.php?tid=26234
本地一份:

该伪装壳有有两个选项 我们先来选Asp来实现伪装(试验品为VC写的一程序)



伪装后代码如下:

00433B45 >/$68 01404900   PUSH HideWiza.00494001                   ;(Initial CPU selection)
00433B4A|.E8 01000000   CALL HideWiza.00433B50                   ;F7
00433B4F\.C3            RETN                                     ;这里就可以返回
00433B50   $C3            RETN

返回到这里:

00494001    BA 453B4300   MOV EDX,HideWiza.<模块入口点>             ;将OEP送EDX 准备SMC
00494006    B8 558BEC6A   MOV EAX,6AEC8B55
0049400B    8902            MOV DWORD PTR DS:,EAX
0049400D    83C2 04         ADD EDX,4
00494010    B8 FF6818EE   MOV EAX,EE1868FF
00494015    8902            MOV DWORD PTR DS:,EAX
00494017    83C2 04         ADD EDX,4
0049401A    B8 45006880   MOV EAX,80680045
0049401F    8902            MOV DWORD PTR DS:,EAX
00494021    83C2 F8         ADD EDX,-8
00494024- FFE2            JMP EDX                                  ;OEP 入口点被做了修改 OEP还是很好找到的由于伪装壳壳不对IAT处理 Dump下来也OK只是扰乱了数据 OD中使用ASCII搜索将失效 :lol

我们再仔细分析下程序是如何对OEP的修改 仔细观察地址 就会发现其实是做了一个SMC而已
00433B45 >/$55                   PUSH EBP                                 ;OEP
00433B46|?8BEC               MOV EBP,ESP
00433B48|?6A FF                PUSH -1
00433B4A|.68 18EE4500          PUSH HideWiza.0045EE18                  
00433B4F\.68 808F4300          PUSH HideWiza.00438F80                  

对照上文中的SMC代码

00433B45 >55 8B EC 6A FF 68 18 EE 45 00 68 80            入口点现将SMC函数的入口压栈 然后retn返回到该函数 再函数里实现OEP原始数据的SMC写入 最后JMP EDX(EDX保存原程序的OEP) 原来伪装就是这样来实现的

那程序是再哪里添加了ASP的特征码呢?我们查看一下fly大哥制作的PEsign


signature = 68 01 ?? ?? ?? E8 01 00 00 00 C3 C3
ep_only = true

而这个代码 正是程序被修改后的OEP入口点的代码:00433B45 >/$68 01404900          PUSH HideWiza.00494001                   ;(Initial CPU selection)
00433B4A|.E8 01000000          CALL HideWiza.00433B50                   ;F7
00433B4F\.C3                   RETN                                     ;这里就可以返回
00433B50   $C3                   RETN

正好和ASP的特征码吻合:68 01 40 49 00 E8 01 00 00 00 C3 C3 根据特征码 Hide PE 在生成自己的Patch代码时就有一个局限 即Patch的代码地址要为00XXXX01 即地址低位要为01 或许就是这里导致对某些程序Hide后无法运行吧。

我们再来验证看一下 看一下Del加伪装壳无法运行的问题所在:以MP3音频录音机为例:

004E6D58 > $68 01305C00          PUSH MP3_Audi.005C3001
004E6D5D      E8                   DB E8
004E6D5E      01                   DB 01
004E6D5F      00                   DB 00
004E6D60   .0000C3C3             DD C3C30000

我们按照上方我们分析作者伪装ASP的意图来格式化代码:

004E6D58 > $68 01305C00          PUSH MP3_Audi.005C3001
004E6D5D      E8 01000000          CALL MP3_Audi.004E6D63            ; 问题在这里
004E6D62      C3                   RETN
004E6D63      C3                   RETN

返回到来到这里:

005C3001    1000                   ADC BYTE PTR DS:,AL
005C3003    0000                   ADD BYTE PTR DS:,AL
005C3005    0202                   ADD AL,BYTE PTR DS:
005C3007    0030                   ADD BYTE PTR DS:,DH
005C3009    8210 BF                ADC BYTE PTR DS:,-41
005C300C    06                     PUSH ES
005C300D    092A                   OR DWORD PTR DS:,EBP
005C300F    8648 86                XCHG BYTE PTR DS:,CL
005C3012    F7                     ???                                    ; 未知命令
005C3013    0D 010702A0            OR EAX,A0020701
005C3018    8210 B0                ADC BYTE PTR DS:,-50
005C301B    3082 10AC0201          XOR BYTE PTR DS:,AL
005C3021    0131                   ADD DWORD PTR DS:,ESI
005C3023    0B30                   OR ESI,DWORD PTR DS:
005C3025    0906                   OR DWORD PTR DS:,EAX
005C3027    05 2B0E0302            ADD EAX,2030E2B我们发现 他Patch代码的地址有代码或数据 导致程序运行异常我们既然了解了伪装的机理 那我们就自己来实现一下

先COPY原程序OEP的代码:004E6D58 >55 8B EC 83 C4 F0 53 B8 50 67 4E 00            U嬱兡餝窹gN.瑁?

然后找到一个以地址低位为01的空白区段地址

004E6F01      00                   DB 00OEP修改如下:

004E6D58 >    68 016F4E00          PUSH MP3Recor.004E6F01
004E6D5D      E8 01000000          CALL MP3Recor.004E6D63
004E6D62      C3                   RETN
004E6D63      C3                   RETN

然后我们写SMC数据:

004E6F01      BA 586D4E00          MOV EDX,MP3Recor.<模块入口点>
004E6F06      B8 558BEC83          MOV EAX,83EC8B55
004E6F0B      8902               MOV DWORD PTR DS:,EAX
004E6F0D      83C2 04            ADD EDX,4
004E6F10      B8 C4F053B8          MOV EAX,B853F0C4
004E6F15      8902               MOV DWORD PTR DS:,EAX
004E6F17      83C2 04            ADD EDX,4
004E6F1A      B8 50674E00          MOV EAX,MP3Recor.004E6750
004E6F1F      8902               MOV DWORD PTR DS:,EAX
004E6F21      83C2 F8            ADD EDX,-8
004E6F24      FFE2               JMP EDX保存文件后 仍旧无法运行 提示代码段不允许写入 我们修改代码段的属性为可写:



OK 这下跑起来了 PEiD测壳:ASProtect V2.X Registered -> Alexey Solodovnikov   * Sign.By.fly *

只是对程序被伪装后为何有些成功有些失败感兴趣而已 无他 Only Game ~~

Squn 发表于 2008-6-16 11:15:11

/:018 /:018 /:018

/// HOHO 上班偷懒 拜读老大的作品 /:good /:09

入口点先将SMC函数的入口压栈 然后retn返回到该函数 再函数里实现OEP原始数据的SMC写入 最后JMP EDX(EDX保存原程序的OEP)/:09 /:09 /:good

[ 本帖最后由 Squn 于 2008-6-16 11:21 编辑 ]

壹只老虎 发表于 2008-6-16 11:48:06

支持LZ写个伪装壳去除工具/:001

黑暗次序 发表于 2008-6-16 14:27:54

上班无聊中
拜读大大的帖子学习伪装技术

Nisy 发表于 2008-6-16 14:38:25

这种技术是没用的 忽悠人还成 要学我们就不伪装 直接写壳 虽然基础还有一定差距 但只要努力 一定可以的

lhpm641 发表于 2008-6-16 22:25:42

学习下,还看不懂呀/:L

天下 发表于 2008-6-17 12:18:57

恩,文章写的不错哦,由可以学东西啦

phuke 发表于 2008-6-17 12:40:21

支持LZ写个伪装壳去除教程!!!

iamok 发表于 2008-6-17 12:53:14

原帖由 Nisy 于 2008-6-16 14:38 发表 https://www.chinapyg.com/images/common/back.gif
这种技术是没用的 忽悠人还成 要学我们就不伪装 直接写壳 虽然基础还有一定差距 但只要努力 一定可以的
对,支持老大写个牛壳给我们用!/:good :victory: /:017

estore 发表于 2008-6-17 14:52:22

初学者慢慢咀嚼。
页: [1] 2
查看完整版本: 浅谈伪装壳Hide PE v1.1的实现机理