飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 9175|回复: 10

[原创] 浅谈伪装壳Hide PE v1.1的实现机理

[复制链接]

该用户从未签到

发表于 2008-6-16 10:05:25 | 显示全部楼层 |阅读模式
——

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

Hide PE v1.1 Cracked by Flashback
http://www.unpack.cn/viewthread.php?tid=26234
本地一份: HidePE.zip (936.18 KB, 下载次数: 13)

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

01.GIF

伪装后代码如下:

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:[EDX],EAX
0049400D    83C2 04         ADD EDX,4
00494010    B8 FF6818EE     MOV EAX,EE1868FF
00494015    8902            MOV DWORD PTR DS:[EDX],EAX
00494017    83C2 04         ADD EDX,4
0049401A    B8 45006880     MOV EAX,80680045
0049401F    8902            MOV DWORD PTR DS:[EDX],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

[ASProtect V2.X Registered -> Alexey Solodovnikov   * Sign.By.fly]
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:[EAX],AL
005C3003    0000                   ADD BYTE PTR DS:[EAX],AL
005C3005    0202                   ADD AL,BYTE PTR DS:[EDX]
005C3007    0030                   ADD BYTE PTR DS:[EAX],DH
005C3009    8210 BF                ADC BYTE PTR DS:[EAX],-41
005C300C    06                     PUSH ES
005C300D    092A                   OR DWORD PTR DS:[EDX],EBP
005C300F    8648 86                XCHG BYTE PTR DS:[EAX-7A],CL
005C3012    F7                     ???                                      ; 未知命令
005C3013    0D 010702A0            OR EAX,A0020701
005C3018    8210 B0                ADC BYTE PTR DS:[EAX],-50
005C301B    3082 10AC0201          XOR BYTE PTR DS:[EDX+102AC10],AL
005C3021    0131                   ADD DWORD PTR DS:[ECX],ESI
005C3023    0B30                   OR ESI,DWORD PTR DS:[EAX]
005C3025    0906                   OR DWORD PTR DS:[ESI],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 00
OEP修改如下:

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:[EDX],EAX
004E6F0D      83C2 04              ADD EDX,4
004E6F10      B8 C4F053B8          MOV EAX,B853F0C4
004E6F15      8902                 MOV DWORD PTR DS:[EDX],EAX
004E6F17      83C2 04              ADD EDX,4
004E6F1A      B8 50674E00          MOV EAX,MP3Recor.004E6750
004E6F1F      8902                 MOV DWORD PTR DS:[EDX],EAX
004E6F21      83C2 F8              ADD EDX,-8
004E6F24      FFE2                 JMP EDX  
保存文件后 仍旧无法运行 提示代码段不允许写入 我们修改代码段的属性为可写:

00.GIF

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

只是对程序被伪装后为何有些成功有些失败感兴趣而已 无他 Only Game ~~
PYG19周年生日快乐!

该用户从未签到

发表于 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 编辑 ]
PYG19周年生日快乐!

该用户从未签到

发表于 2008-6-16 11:48:06 | 显示全部楼层
支持LZ写个伪装壳去除工具/:001
PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2020-2-22 19:39
  • 签到天数: 114 天

    [LV.6]常住居民II

    发表于 2008-6-16 14:27:54 | 显示全部楼层
    上班无聊中
    拜读大大的帖子学习伪装技术
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2008-6-16 14:38:25 | 显示全部楼层
    这种技术是没用的 忽悠人还成 要学我们就不伪装 直接写壳 虽然基础还有一定差距 但只要努力 一定可以的
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-6-16 22:25:42 | 显示全部楼层
    学习下,还看不懂呀/:L
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2018-8-23 00:04
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-6-17 12:18:57 | 显示全部楼层
    恩,文章写的不错哦,由可以学东西啦
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-6-17 12:40:21 | 显示全部楼层
    支持LZ写个伪装壳去除教程!!!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-10-30 22:05
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2008-6-17 12:53:14 | 显示全部楼层
    原帖由 Nisy 于 2008-6-16 14:38 发表
    这种技术是没用的 忽悠人还成 要学我们就不伪装 直接写壳 虽然基础还有一定差距 但只要努力 一定可以的

    对,支持老大写个牛壳给我们用!/:good :victory: /:017
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-6-17 14:52:22 | 显示全部楼层
    初学者慢慢咀嚼。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表