脱壳_详细_使用的方法_04

PS: 开始 难度中高级的壳

 

1、第16课

  基础脱壳教程16:脱 ACProtect 1.32 (无Stolen Code)
  1、设置异常,隐藏OD
  2、SE处下内存访问断点
  3、SHIFT+F9,F2,再一次SHIFT+F9,下断,再一次SHIFT+F9
  4、取消所有断点
  5、内存,00401000。F2,SHIFT+F9
  6、直达OEP!!
  7、修复,脱壳成功

 

  【60】【00:20】开始 难度中高级的壳

  【265】【01:27】QQ个性签名查看器.exe,PEiD: "上面也没发现"  "EP区段":".perplex"(看到这个区段,一般是 ACProtect)

    【330】【01:50】运行的现象

  【410】【02:16】OD载入

    OD-->设置-->调试设置-->异常,设置状况如下:

忽略在 KERNEL32 中发生的内存访问异常  √

忽略(传递到程序)以下异常情况
  INT3 中断    √
  单步中断     √
  内存访问异常   ×
  整数除以 0    √
  无效或特权指令  √
  所有 FPU 异常  √

同时忽略一下指定的异常或者异常范围    ×

  【500】【02:45】OD重新载入,隐藏OD(OD-->插件-->OD调试隐藏插件-->隐藏OD),SHIFT+F9 到最后一次异常, Shift+F9 2次 程序跑飞。

    【635】【03:31】OD重新载入-->隐藏OD-->Shift+F9 1次 --> 来到这里 --> 堆栈窗口 --> SE 句柄,右键,数据窗口中跟随 --> 数据窗口,右键,内存访问断点 (∵这个壳 对断点检测的比较厉害,一般的断点可能断不下来,∴我们选择内存访问断点)--> Shift+F9 --> 断在这里,下F2断点--> Shift+F9 --> 断在这里,下F2断点 --> Shift+F9 --> 删掉刚才的 内存访问断点 和 2个F2断点 --> 【915】【05:05】给大家看一下,如果忘记删除 内存访问断点的话,会是什么样子的情况(ZC: 应该是如果有相应的异常的话,就执行到 异常处理函数里面去了[异常处理函数/相关的指令 没有被改掉的话]) --> 【975】【05:25】应该是要F4执行到这里,但是程序直接跑到了上面(ZC: 注意看,断在这里 是∵内存访问,而非 异常处理函数执行到这里) --> 【1025】【05:41】清除内存访问断点 --> F4 来到retn处 --> "内存映射"窗口 00401000处 下F2断点 --> Shift+F9 --> 程序 出现(壳代码里面的)提示信息 --> 来到OEP

  【1130】【06:16】这是一个VB程序,一个push 一个CALL

  【1253】【06:57】OD插件脱壳

    【1280】【07:06】exe 提示 不是有效的Win32应用程序

    【1290】【07:10】ImportREC修复,发现只有一个 dll (ZC: 较大可疑 导入表/IAT 会不对)。修复 OK,exe运行成功

 

2、第17课

  基础脱壳教程17:脱ACProtect (存在Stolen Code)
    常规方法,直达OEP
    修复被偷取的代码
    修复,成功脱掉!
    004254C9 55 push ebp
    004254CA 8BEC mov ebp,esp
    004254CC 83EC 44 sub esp,44

  【210】【01:10】PEiD 显示 壳 UltraProtect 1.x,EP区段:".perplex",其实 这个壳 就是 ACProtect。UltraProtect 是ACProtect 以前的名字

  【320】【01:47】OD载入 notepad98.EXE (Win98记事本 加了壳)

    【337】【01:52】OD异常设置 和上节课一样,隐藏OD(和上节课一样)

    【375】【02:05】Shift+F9 一次,来到最后一次异常 -->... ... --> (ZC: 前面步骤 和上节课一样)F4 来到retn处 --> (ZC: 上节课这里是通过00401000断点来到OEP) 本节课,这里是 修补 Stolen Code 的最佳时机

      【570】【03:10】(到OEP去看一下情况) "内存映射"窗口 00401000处 下F2断点 --> Shift+F9 --> 发现 和我们平时见的VC的OEP不同,入口点 一般都是 0x55(push ebp) (代码被抽取了)(ZC: 如何判断 代码被抽取了?是否是如下的思维过程:(1)、已经不在壳的代码空间了;(2)、OEP的代码 不像任何语言的入口点;(3)、OEP的上面 是否有代码被抽取后 留的空位;(4)、来到 OEP之前的壳的代码中,判断验证是否确实是代码被抽取了)(ZC: 视频 此处 貌似 被偷代码 没有留下空位...)

  【845】【04:41】OD重新加载,再来一遍

    【948】【05:15】F4 来到retn处,寻找 Stolen Code 的最佳时机,如何做呢?:

    【985】【05:28】OD--> 调试 --> 设置条件(我们知道这是一个VC),"√"选"命令是一个",输入"push ebp" --> 点击"确定"

      【1050】【05:50】OD-->调试-->跟踪进入(OD状态显示"跟踪")跟踪速度比较慢,需要点时间 -->【1300】【07:12】OD跟踪到了。【1313】【07:17】这3行代码就是被偷取的(ZC: 如何确定 被偷取的代码 有几行?如何判断 是否还有被偷取的代码没有找到?看exe能不能跑起来?) -->【1380】【07:40】反汇编窗口 右键 二进制 二进制复制 -->去OEP("内存映射"窗口 00401000处 下F2断点,Shift+F9) --> 修补:

        【1480】【08:12】直接将原来的代码NOP掉 【1515】【08:25】反汇编窗口 右键 二进制 二进制粘贴 (ZC: 不怕 NOP和粘贴 代码的地方是有效的代码位置吗?真是这样的话 不就破坏了原来的代码了吗?) --> 反汇编窗口 右键 此处新建EIP(ZC: 貌似LoadPE脱壳的话,这一步不需要...) --> OD插件脱壳 (【1600】【08:52】"重建输入表" 前面的"√"取消)

    【1635】【09:05】程序跑不起来

    【1658】【09:12】ImportREC修复(英文版)。等级1 修复,这里直接 等级3跟踪,ImportREC会死掉

      【1815】【10:03】ImportREC 打开 未脱壳exe的进程,输入我们找到的OEP,自动查找IAT 获取导入表。不要全部一下子 用等级3跟踪,一部分一部分的来

        【2000】【11:05】修补好了一部分,为了避免ImportREC死掉,可以 "Save Tree"

        【2140】【11:52】全部修复成功

    【2165】【12:01】程序运行OK

 

3、第18课

  基础脱壳教程18:ACProtect之寻找丢失的Stolen Code

  关于Stolen Code的简单解释

  1、设置异常(忽略除INT3中断的所有异常),隐藏OD
  2、来到入口点,F9运行
  3、程序中断在这里
  4、看堆栈,找SE句柄,数据窗口跟随,下硬件访问断点,shift+F9 (ZC: 视频中这里下的是内存访问断点)
  5、下断,再次SHIFT+F9,下断,再次SHIFT+F9,取消所有断点,直接F4到RETN处
  6、下d 12ffc0,下硬件断点。SHIFT+F9。
  7、记下Stolen Code 。
  8、找到内存,在00401000处下断,F2,SHIFT+F9。
  9、写入真实的代码!!
  10、OD插件脱壳,注意,修正OEP地址!!
  11、IR修复,用等级3。不能修复的CUT掉。抓取修复。程序还是抱错!
  12、做下处理。来到壳的入口。也就是第一步记下的地址
    CTRL+G,004AC000
  13、写入真的OEP代码。
  14、Lord PE修正入口点
  15、保存,脱壳成功!

 

  我的脱壳的过程:
    A、直接ESP定律法 ==> 失败
    B、需要用最后一次异常法来 过渡一下(不知道是为啥,难道是 异常法 使得我们进入到壳的比较内部的代码?然后再用ESP法就可以...)
     B.1、OD加载程序后,记下ESP定律所需要的堆栈地址
     B.2、OD-->选项-->调试设置:
      "忽略在Kernel32 中的内存访问异常"    √
       "INT3 中断"     不√
       "单步中断"      √
       "非法访问内存"    √
       "整数除以 0"     √
       "无效或特权指令"   √
       "所有FPU异常"    √
      "同时忽略一下指定的异常或范围"      不√
     ZC: 不确定哪种异常能用的情况下,就把"忽略(传递给程序)以下异常"的√ 全部去掉...(或者 一步一步的缩小能用的异常的范围)
     B.3、两次 "Shift+F9",程序跑飞
      B.3.1、一次 "Shift+F9"后,设置 SE断点:
        堆栈窗口-->找到"SE处理程序"那一行(就是ESP+4对应的那一行)-->右击-->数据窗口中跟随
        数据窗口-->刚刚定位到的那个地址-->右击-->断点-->内存访问(我试了一下 "硬件访问"断点断不下来,程序直接跑飞...)
      ZC: 堆栈窗口中的"SE处理程序"其实就是SEH异常处理压入栈中的异常处理回调函数指针,于是我们这里设置内存访问断点的地方就是 异常处理函数 中 代码的前4个字节。
      ZC: 我也尝试了一下,将这里的内存断点设置在堆栈上,是不行的 程序会中断掉...(必须设置在回调函数的里面...不知是只有这个程序不行还是都不行...)
      B.3.2、Shift+F9
     B.3、ESP定律
      来到 被stolen的代码处(也就是 真的OEP的代码,但是 它们被赋值到了壳中)
       从代码的地址可以看到,被stolen的代码是在 节".perplex" 中
  ZC: 这里 被stolen的代码开始处肯定就是现在断下来的地方,如何判断 被stolen的代码 的结束的地方呢?看"NOP"?看下面的"PUSHAD"?看B.4的代码上面有几个空位?
  ZC: 记下被stolen的代码:55 8B EC 6A FF
      删掉 ESP定律的硬件断点
     B.4、前往 真正的程序代码节中
      "内存映射"窗口-->0x00401000处(也就是".text"代码节) F2 --> Shift+F9
      来到 真程序 的代码处,

     B.5、将被偷取的代码 补到B.4的代码上面(这里正好有5个字节的空位)
     B.6、脱壳,importREC修正

    ZC: 真程序OEP:00431F4 / 00431F9
    ZC: 壳OEP:000AC000

  ZC: OD反汇编窗口 中 代码上/下翻动的时候,汇编指令会变化(变乱)(不管是鼠标滚轮滚动 还是 键盘↑/↓[或Ctrl+↑/↓],显示的汇编指令都会变乱),尝试如下操作:
    如果已经分析了代码 --> "从模块中删除分析"
    没有进行代码分析 --> "分析代码(A)"


  我的修正处理:
    程序脱壳,importREC修正,处理完毕之后,还是不能运行...
    视频中说 程序会检测入口点,如果入口点被修改的话,程序就会崩溃...
    我跟了一下,貌似是 msvcrt.dll的函数 调用 ntdll.dll中的函数 才奔溃的,看了下 貌似是异常处理的事情...具体的我现在也看不明白...
    不管了,我也按照视频中的方式,将 被stolen的代码 写到壳的入口点,然后JMP(或push&retn)到 真程序代码相应位置。

   ZC: 我也尝试了另一种方式:将stolen代码填补到00431F4处,然后 壳入口点直接 JMP(或push&retn)到00431F4,也是OK的

 

4、第19课

  基础脱壳教程19:手脱ACProtect V2.0.X
    第一个程序:
    1、下断:bp GetCurrentProcessId,F9
    2、
      7C809940 > 64:A1 18000000 mov eax,dword ptr fs:[18] //断在这
      7C809946 8B40 20 mov eax,dword ptr ds:[eax+20]
      7C809949 C3 retn
    3、用Lord PE查OD的PID。
    4、把2中的代码改为
      7C809940 > B8 3C150000 mov eax,153C (当然,PID号每次都会变)
      7C809945 90 nop
      7C809946 90 nop
      7C809947 90 nop
      7C809948 90 nop
      7C809949 C3 retn
    5、下断,BP GetModuleHandleA,F9
    6、
      7C80B6C1 > 8BFF mov edi,edi //断在这
      7C80B6C3 55 push ebp
      7C80B6C4 8BEC mov ebp,esp
      7C80B6C6 837D 08 00 cmp dword ptr ss:[ebp+8],0
      7C80B6CA 74 18 je short kernel32.7C80B6E4
      7C80B6CC FF75 08 push dword ptr ss:[ebp+8]
      7C80B6CF E8 C0290000 call kernel32.7C80E094
      7C80B6D4 85C0 test eax,eax
      7C80B6D6 74 08 je short kernel32.7C80B6E0
      7C80B6D8 FF70 04 push dword ptr ds:[eax+4]
    7、来到内存,在CODE断下内存访问断点,F9运行,出现NAG窗口,点确定后,来到OEP!!!
      00402150 55 push ebp //OEP!!
      00402151 8BEC mov ebp,esp
      00402153 83C4 F0 add esp,-10
      00402156 53 push ebx
      00402157 B8 10214000 mov eax,ACP_Feed.00402110
      0040215C E8 4FFCFFFF call ACP_Feed.00401DB0
      00402161 68 C4214000 push ACP_Feed.004021C4 ; ASCII "ACProtect Feedback Form"
      00402166 6A 00 push 0
      00402168 6A 00 push 0
    8、脱壳,修复。用等级3!或者手动找MessageBoxA
    9、抓取,脱壳成功!!

    第二个程序:
      1、忽略除内存访问的所有断点,隐藏OD
      2、F9,找SE句柄,数据窗口跟随,下内存访问断点
      3、SHIFT+F9,F2,再SHIFT+F9,F2,再次SHIFT+F9,取消所有断点。
      4、运行到RETN
      5、打开内存,0401000处下F2断点。SHIFT+F9
      6、来到假的OEP。
      7、修正代码
      8、脱壳,修复
      9、OK~!!脱壳完成

  【113】【00:37】PEiD 壳ACProtect V2.0.X (ZC: EP区段 显示 ".text",居然是显示这个)

  【133】【00:43】OD载入

    步骤,和上面2节课一样 【366】【02:01】F4 来到retn处,(去OEP看看) "内存映射"窗口 00401000处 下F2断点-->F9。

    【410】【02:16】跳到这里。很显然,这是一个VB,而且它的OEP是不完整的 (停在 JMP msvbvm60.TrunRTMain)

    【591】【03:16】怎么补 StolenCode,随便生成一个VB程序(ZC: 视频中是 VB6.0中文版)(ZC: 这里 他没有找StolenCode,这样 如果抽取的代码比较多的话,估计就不行了...) "工程1.exe" 【700】【03:52】OD载入"工程1.exe",分析 VB6 程序的一些信息 (call 的函数就是 msvbvm60.TrunRTMain)

    【878】【04:52】首先我们找 PUSH,其实 就在 堆栈窗口 能找到该值 【929】【05:09】直接在 JMP下面修改指令 【1105】【06:07】反汇编窗口 右击 此处新建EIP。LoadPE脱壳。ImportREC修复。程序运行OK

    【1285】【07:07】OD插件(OllyDump)脱壳(不√选 "重建输入表")。ImportREC修复。程序运行OK

 

  【1443】【08:00】OD打开 ACP_Feedback1.exe  壳ACProtect V2.0.X (ZC: EP区段 显示 "CODE")

    还是 老方法,设置好 OD异常 之后,F9 程序直接跑飞

    【1550】【08:36】异常设置改成这样:

忽略在 KERNEL32 中发生的内存访问异常  √

忽略(传递到程序)以下异常情况
  INT3 中断    ×
  单步中断     √
  内存访问异常   √
  整数除以 0    √
  无效或特权指令  √
  所有 FPU 异常  √

同时忽略一下指定的异常或者异常范围    ×

      F9 程序也跑飞

    【1580】【08:47】异常设置改成这样:

忽略在 KERNEL32 中发生的内存访问异常  √

忽略(传递到程序)以下异常情况
  INT3 中断    ×
  单步中断     √
  内存访问异常   ×
  整数除以 0    √
  无效或特权指令  √
  所有 FPU 异常  √

同时忽略一下指定的异常或者异常范围    ×

      F9 程序也跑飞

    【1620】【09:00】异常设置,忽略 所有异常:

忽略在 KERNEL32 中发生的内存访问异常  √

忽略(传递到程序)以下异常情况
  INT3 中断    √
  单步中断     √
  内存访问异常   √
  整数除以 0    √
  无效或特权指令  √
  所有 FPU 异常  √

同时忽略一下指定的异常或者异常范围    ×

    【1655】【09:11】隐藏OD,同样 跑飞

 

    【1695】【09:25】通过下断点 "bp GetCurrentProcessId"、"BP GetModuleHandleA"

      ZC: 该方法 不是 通用的方法,估计可能是 作者搜了网上的文章。

      ZC: 我在找不到下手点的时候,也应该学习这种方式,确定了 壳的 种类&版本 之后,网上看看 有没有解决方式

      【1773】【09:50】LoadPE 查看 OD的PID

      【1875】【10:25】注意16进制数字 字母开头的话前面要加一个数字"0"。 ZC: 这里修改的是 kernel32.dll 中的代码。ZC: 这样改过之后,壳中代码调用GetCurrentProcessId 得到的就始终是OD的PID了...

      【2187】【12:08】LoadPE脱壳。ImportREC(英文版)修复 【2320】【12:53】自己查找 对应函数,很可能就是 MessageBoxA (ZC: 我看到的信息是 user32.dll,RVA:0x50E4,ptr:0x418E4B)(ZC: 我的方法是 Depends打开user32.dll,然后看0x50E4对应的是哪一个导出函数,待验证。貌似哪里不对...数据有点对不上...)。程序 运行OK

      【2462】【13:39】ImportREC(英文版) 等级3 修复。ImportREC(英文版) 打开 需要脱壳的exe,然后再 等级3 修复。程序运行OK

 

  【2755】OD打开 ACP_Feedback1.exe,再用一种方法试试

    【2795】【15:30】类似 2次内存镜像的方法

      【2840】【15:45】ZC: 这里,感觉 好像有别的断点,没有断在 内存镜像上

    【2880】【15:58】大家可以用其他方法尝试一下

    ZC: 我记得 尝试一下。

 

5、

 

转载于:https://www.cnblogs.com/debugskill/p/5583219.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值