他乡_04

ZC: 本讲中,OD中异常的设置 是什么样的?默认的全部忽略?

 

【00:38】PEiD显示:节 vmp0/vmp1/vmp2 证明 这个壳的版本还比较高,有3个VMP段,保护比较强烈

【01:28】die_0[1].64.rar

  【01:38】软件标题:“Detect it Easy 0.64”

    【01:43】这个是Delphi的 (没有显示具体是 哪个版本的Delphi)

    【01:47】这个是 VC (没有显示具体是 哪个版本的VC) 【01:52】VC6.0的 (ZC: 是通过 "LinkerInfo"的信息是"6.0",得出是VC6.0吗?),证明这个 VS

软件 是VC写的

 

【02:12】VMP的高版本,1.6x~1.7x 或者 到1.8x之间的某个版本,但是我们不能确认。

【02:40】打开 exeinfo 查看,VMP的版本 (ZC: 但是录像里面没有显示exeinfo的界面...也不知道视频中使用的是 exeinfo 的那个版本...只知道 exe的名字是 exeinfope.exe) : 1.6x~2.030之间

【02:53】"FileScanner 3",显示 1.704,证明它 这个不准确

【03:00】PEiD显示 有3个VMP段,它和我们之前讲的 VMP1.704 和 VMP1.6x 不一样,它又多了一个VMP段。而且它难度要高很多

 

【03:25】放入OD。现在开始 就要调试猛壳了,要设置好OD

  【03:35】OD-->插件-->PhantOn-->Options -->"Protect DRx"是勾上的 --> SAVE

  【03:43】OD-->插件-->StrongOD-->Options --> 有6个"√","CreateProcess Options" 选择"Normal"--> Save

    ZC: 如下所示:

√ HidePEB         √ !*Kill BadPE Bug
√ !*PatchFloat    □ AdvEnumModule
√ Adv Ctrl+G      √ Anti Anti_Attach
√ *KernelMode     □ Skip Some Exceptions
□ *ShowBar        □ Remove EP one-shot
□ Break On Tls    □ Break On Ldr
□ Load Symbols    □ AitoUpdate

CreateProcess Option
● Normal
○ CreateAsUser    □ SuperMode
○ CreateAsRestrict

  【03:47】OD-->选项-->调试设置-->事件-->"设置第一次暂停于" 选择 "系统断点"--> 确定

【03:50】开始OD调试

  【03:55】F9一下直接,OD提示信息"... ... 您仍要继续分析吗?" 视频中选择的是"是(Y)" (ZC: 选这个有点出乎我意料...)

  【04:05】断下来了 ==> 反汇编窗口 --> 右击 --> 分析 --> 从模块中删除分析 【04:12】从这个情况可以知道,这个大约是 1.6x~1.704之间的版本,VMP全保护吧可能,VMP比较厉害。

  【04:27】用这个断点 VirtualProtect,内存保护断点,对它进行下断 ==> Ctrl+G 输入 "VirtualProtect" --> 在找到的地方 F2 --> F9运行 10次 看到 VirtualProtect的参数Address是VSClient.00596000,运行到这里之后 它就是一个很好的返回时机。【04:55】为什么将这里确认为返回时机呢?我们看一下,9个段 (ZC: 是10个段吧...),最可以的段 就在vmp1里面,vmp2里面 它是SFX 它是 固定代码 输入,∴ 我们选择在00596000这个地方 为返回时机。--> 【05:28】F2取消断点 --> "内存映射"界面,00401000处设置 "在访问上设置断点 F2" --> F9 --> 这样我们就到了 OEP的入口处,但是 此时我们用OD插件来脱壳的话,这样 脱不下来,证明它的IAT需要修复 (ZC: 运行不起来的情况应该不止IAT问题一种,IAT问题 只是比较常见而已。【06:02】显示的是内存错误,没有 直接的证据/更明确的证据 证明这必然就是IAT问题)

    【06:15】IAT被加密了

    【06:25】用LoadPE来脱壳 【06:37】用 irr来修复一下 【07:05】没用,(还是显示 内存错误),证明这个IAT有问题,直接到达OEP脱壳 脱不下来。这个就是 1.6x~1.704之间的版本,1.6x~1.7x之间的版本 (ZC: 所采取的保护措施?)  【07:33】对于IAT,被 VM了,不能脱壳,脱壳之后 也不能运行,这么一个情况

    【07:43】就会想到 用VMP脚本跑,不需要搞这么麻烦。其实 1.704之前的版本 即使跨平台也可以修复(ZC: 这里的"跨平台"是什么意思?不同的 Windows平台版本?)。【07:57】就是用 UIF,今天要讲的这个工具 (软件标题为:“Universal Import Fixer v1.2 (Final) - 32bit”). 【08:05】用UIF修复的话,我们就要设置一下,ImportREC --> 选项 --> "新建输入表"中 √选 “按序号构建输入表”和“创建新的IAT”

    【08:20】打开UIF

    【08:30】由于 IAT被VM加密,我们看一下,Ctrl+B -->输入16进制 "FF 25" --> ZC: 来到一大串 "JMP ???"的地方 --> 在"反汇编窗口"的信息提示框里面 右击 数据窗口中跟随--> (ZC: 上下翻动数据窗口,查看信息) 这个IAT不完整,被抽取/挪移了,VMP加壳就这么一个难点

    【08:50】OD-->文件-->附加--> 看到 现在正在被调试的进程的ID为 0x904 --> UIF 中填入 904,“修复输入表”不要勾选,为了 修复的完整性,我们不要勾选“修复输入表”。【09:10】“修复输入表”勾选之后 跨平台,不过 REC(ZC: 应该值得是ImportREC)修复会存在问题,∴ 不能勾选 (ZC: 此时的UIF界面中,"代码始于"、"代码止于"、"新的IAT VA" 都是"0") --> UIF "开始",报错了... (【09:45】错误!进程ID无效或者是手保护的进程)

    ZC: 上面 他捣鼓了一下,也没发现是什么地方使得 UIF报错,他怀疑是 屏幕录像专家...

    【10:05】重新开了 屏幕录像专家,现在 停在OEP,先用 LoadPE脱壳,打开UIF,OD查看被调试程序进程ID为0x0F4,UIF中输入 0F4 点击"开始"(ZC: 此时的UIF界面中,"代码始于"、"代码止于"、"新的IAT VA" 都有了具体的值) 【10:41】这个有点慢,它要把 虚拟的IAT还原成它本应该的IAT,这么一个过程,很慢 大家等一会 【13:35】所有IAT修复完毕 修复了14470个函数,【13:53】打开REC,手动输入 "OEP"、"RVA"、"大小" 的值,点击"获取输入表","显示无效函数" 没有无效函数,转存修复一下。修复完毕后 可以运行,PEiD看一下 是VC6.0

【15:18】VMP 1.6x~1.7x 之间的,VMP壳就脱掉了。由于有时候IAT有加密的现象,我们就需要用UIF工具 对它进行修复,当然也可以用脚本,但 这个脚本修复的不是很完全,∴ 他一般都用UIF修复,1.6x~1.7x用这个就可以解决

 

【15:56】来看 VMP1.8

【16:05】PEiD查看“VMprotect 1.8.exe”。VMP1.6x的是 vmp0/vmp1,1.704,1.7x的是两个vmp0,vmp1挨着的。这个就是 1.8/1.8x的,upx0,upx1 中间隔着个 tls。我们用PEiD看区段 可以确定它是 VMP1.8的

【16:33】"FileScanner 3"查看“VMprotect 1.8.exe”,显示为 1.704.这个是查不到的,它只认识 1.704,它只有 1.704特征码

【16:45】用 exeinfo看一下,它会显示 1.6x~2.03。

【16:55】通过这么一些东西的比较,我们已经确定它是 1.8 (1.8x)

【17:10】“VMprotect 1.8.exe”载入进OD --> 查找(Ctrl+G) "VirtualProtect"(内存保护) --> 找到之后,设置 硬件执行 断点,∵ 它比1.704版本高,用F2断点 断不下来,就用这个来断 --> F9运行 运行5次,运行到这里 "VirtualProtect"的参数Address的值为"VMProtec.0040A000"

  【17:50】"内存映射"界面,[节".upx0"(00417000) 节".upx1"(0044D000)],00417000到0044D000 之间的数据。0040A000就在这个之间 (ZC: 睁眼说瞎话) 【18:15】0040A000 ".text"节 (ZC: 第一个代码节),返回到 ".text"段。就在 断下来的函数(ZC: 应该就是VirtualProtect)的返回的地方设置F2断点 --> F9运行到断点 --> F2取消断点 --> "内存映射"界面 节".upx0"(00417000)处 下F2断点 --> F9运行 --> 删除"VirtualProtect"的硬件断点 --> "内存映射"界面 节".upx0"(00417000)处 "设置内存访问断点(A)" --> F9运行 --> 运行到这里之后,OD寄存器窗口 ESP 右击 数据窗口中跟随 --> 数据窗口 拉到最底下(ZC: 他是这个意思吗?他是要找 离ESP最近的一个SE处理函数 还是 离ESP最远的一个SE处理函数?),找到 “SEH链尾部”,【19:05】在这里(离“SEH链尾部”第8个DWORD处) 下一个断点(硬件写入 字节),主要是查找内存数据,找到一个可以修复OEP的一个数据,... ...(ZC: 后面讲的很混乱...)

NT_TIB STRUCT
  ExceptionList         dd  ?  ;SEH链入口
  StackBase             dd  ?  ;堆栈基址
  StackLimit            dd  ?  ;堆栈大小
  SubSystemTib          dd  ?
  FiberData             dd  ?
  ArbitraryUserPointer  dd  ?
  Self                  dd  ?  ;本NT_TIB结构自身的线性地址
NT_TIB ENDS

  【20:43】重来(OD重新加载) --> 将原来设置的 普通断点/硬件断点 全部删掉 --> Ctrl+G 搜索"VirtualProtect" -->来到"VirtualProtect"处(kernel32领空)-->"VirtualProtect"函数头部设置 硬件执行 断点-->F9执行 N次,当"VirtualProtect"的参数Address的值为"VMProtec.0040A000"时 不再继续F9 --> "VirtualProtect"函数尾部设置F2断点-->F9运行到"VirtualProtect"函数尾部-->F2取消断点,删掉硬件断点--> "内存映射"界面 节".upx0"(00417000) "设置内存访问断点(A)"-->F9(ZC: 来到这里【21:29】)--> F9(ZC: 还是断在那条指令的地方,只是EAX,EDX的值变化了) --> 寄存器窗口 ESP 右键 数据窗口跟随--> 数据窗口 拉到最底下,找到 “SEH链尾部”,在小8个DWORD的地方设置 断点 硬件写入 字节 (ZC: 这里设置内存断点的地方是 0012FFC0)--> 反汇编窗口 右键 断点 删除内存断点-->F9-->【22:03】"内存映射"界面 节".upx0"(00417000) "设置内存访问断点(A)" --> F9执行 N次 看堆栈的变化,【22:22】现在就到了OEP(ZC: 现在 ESP为"0012FFBC",就在0012FFC0的上面紧挨着)

    ZC: 在数据窗口的0012FFC0处设置硬件写入断点,不明白:为何是选择这里? 个人猜测:最接近堆栈顶端的SE是Windows加载exe时的默认异常处理,kernel32.7C817077 是WIndows加载exe所使用的函数,所以这里是 堆栈平衡的点

  【22:40】ZC: 这里做了一个操作,但是 貌似录像没有录到?我猜 这个操作是:堆栈窗口,ESP指向的地方,右键,反汇编窗口跟随 。ZC: 注意到 此时 ESP-4的数据内容就是 入口点VA。

    【22:45】ZC: 将这里的 汇编指令"PUSH F7930432"复制下来是在干嘛?

  【23:00】由于它是一个C类的程序,我们修复起来比较麻烦,我们直接OD插件脱壳 看能不能运行,没法运行(双击exe后没反应)。不像平常脱壳那么简单

  【23:31】查找 二进制字串,既然OEP被VM 会导致不运行,我们就用一种PATCH的方式  脱壳后再PATCH,不能先PATCH,找到全0的地方(Ctrl+B)。【23:54】找定一个地方,我们来写指令"PUSH ebp"(一般的VC都是这个样子),然后"PUSH 00446662"(ZC: 这里为啥PUSH的是00446662 没听懂...),再"JMP 0040A3D5" --> 相应位置“此处为新 EIP”--> OD插件脱壳 --> 【25:17】exe不能运行,内存错误

 

【25:28】有问题 就重新来过 (ZC: ...) (ZC: 这个重新来过的过程,我在下面没有记录全,以后补充吧)

  【26:18】PAGE_READONLY

  【27:28】ZC: 之前一直是在UPX1节中运行,此时突然跳到text节中运行(也就是设置断点的地方),这样就到达了OEP

  【27:35】要把硬件写入断点删掉,刚才就是∵没有删掉硬件写入断点,才导致脱壳后的exe出现内存错误

  【28:52】OD插件脱壳 (ZC: 注意看,这里 他"重建输入表"前面的"√"去掉了,点了一下 按钮"获取EIP作为OEP")

  【29:06】脱壳后程序,运行成功

 

【29:22】看看,能不能将 脱壳后程序 优化一下 (ZC: 使用的软件 标题为 "CFF Explorer Ⅶ")

  【29:48】程序 内存错误,优化失败

 

【30:11】VMP1.7的时候,到了OEP 可以用 UIF 修复IAT。 1.8的时候,要注意它的 OD的检测相当厉害,就用硬件断点 不要用F2 (ZC: 原来是这个原因...),搞1.8以后的 可以用同样类似的方法进行脱壳

【31:11】VMP1.7 继续弄它,将放到 “第8课 VMP 脱壳脚本编写” 继续弄。以后课程 再讲 VMP脱壳和IAT修复

C

 

posted @ 2016-06-21 09:48  DebugSkill  阅读(606)  评论(0编辑  收藏  举报