美文网首页
脱壳经验2

脱壳经验2

作者: MagicalGuy | 来源:发表于2018-10-10 00:49 被阅读0次
  1. IAT在内存中和在文件中的特征?
    IAT在内存中是一个函数地址数组,在文件是是一个RVA数组
  2. 重定位的原理是什么?
    重定位地址的计算:addr = 映像基地址+VA+OffSet
    重定位地址处的数据:[addr] – 原基地址 + 现基地址
    [addr] + (现基地址–原基地址)
  3. 重定位在内存中的特征是什么?


    image.png

重定位开始的时候 会有VA 一般是分页对齐的值

image.png

脱壳-IAT被加密如何分析

分析方法

  1. 自上而下分析,单步跟踪

从程序开始单步分析,找到填充IAT的代码

  1. 敏感API下断,栈回溯分析

① GetProcAddress

② LoadLibraryA/W, GetModuleHandleA/W

③ VirtualAlloc/VitualAllocEx/HeapAlloc

④ VitrualProtect/ VitrualProtectEx

  1. 敏感数据下断,栈回溯分析

在IAT表加密的地址处下断点,运行之后断下再栈回溯分析

脱壳步骤

1.找OEP

2.Dump内存到文件

3.修复文件

壳中的加密技术

1.IAT加密

2.对IAT加密流程进行混淆(函数名称变hash值,花指令)

3.对OEP入口、IAT调用进行改写

4.反调试

5.反虚拟机

6.代码虚拟化

脱壳06.exe

0.查壳

image.png

1.找OEP

00409486 55 PUSH EBP ; OEP

在OEP处发现IAT加密了,接下来应该解密IAT,常用方法

① 在加密的IAT处下访问断点,重新调试,在断点断下附近分析

②在壳获取IAT的过程中的API下断点

GetProcAddress,GetModuleHandleA/W,LoadLibraryA/W

使用第一种方法,断点未断下,猜测硬件断点被反。

反硬件断点的方法:

①异常回调中可以将调试寄存器清0

②SetThreadContext以及这个函数的下层函数

函数下断未断下,说明是异常回调起的作用

脱壳06.exe去掉插件的脱壳脚本

VAR dwGetAPIAddr
VAR dwWriteIATAddr
VAR dwOEP
VAR dwTmp

MOV dwGetAPIAddr,00438F9F
MOV dwWriteIATAddr,0043918C
MOV dwOEP, 409486

BPHWC // 清除所有的硬件断点

BPHWS dwGetAPIAddr, "x"
BPHWS dwWriteIATAddr, "x"
BPHWS dwOEP, "x"

LOOP1:

RUN

CMP eip, dwGetAPIAddr
JNZ CASE1
MOV dwTmp,eax
JMP LOOP1
CASE1:
CMP eip, dwWriteIATAddr
JNZ CASE2
MOV [edi],dwTmp
JMP LOOP1
CASE2:
CMP eip, dwOEP
JNZ LOOP1

MSG "到达OEP!"

脱壳06.exe中的反断点异常分析

搭建异常触发环境

image.png image.png

分析触发的异常

经过调试,发现异常有很多个。需要排查找出对硬件断点清0的地方

在异常点设置硬件断点,看能不能断下能不能断下,能断下说明当前异常点前面的异常处理函数中没有对硬件断点清0

第一个异常:


image.png

后续异常:


image.png
image.png

经过分析,发现STI特权指令异常回调是清除硬件断点的代码


image.png

可以直接dump内存,在IDA中解析上面代码,解析对应的Context结构。


image.png

动态调试这段,edx的值是一个栈地址,代码中对栈进行了操作,看OD注释,是SEH函数,也就是说,当第二次触发STI特权异常时,异常处理函数就改变了。
所以,需要跳过清除硬件断点的地方,可以将0043AF57以下的代码到0043AF72全部nop

破除清除硬件断点的地方可以对IAT处下断点,找到IAT写入的位置。

image.png

再接着在写入IAT附近寻找,获取原始API的地方。
经过跟踪,找到了获取原始API的地方

image.png

即438F9F 地址处eax的值

总结

当动态调试壳时,IAT加密,我们需要找到获取原始IAT的地方,写入IAT的地方,写一个脚本将原始IAT填入到写入IAT的地方即可。

MOV vOEP,00409486 // OEP地址

MOV vGetAPIAddr,438F9F // 获取API地址

MOV vWriteIATAddr,43918c // 写入IAT地址

MOV vHardwarePointAddr,0043AF51 // 清除硬件断点的地方

MOV vAPIaddr,0

BPHWC// 清除所有硬件断点
BC// 清除所有软件断点

BPHWS vHardwarePointAddr,"x" // 清除硬件断点的地方

BPHWS vOEP,"x" //
BPHWS vGetAPIAddr,"x" //
BPHWS vWriteIATAddr,"x" //

LOOP_1:
RUN

CMP eip,vHardwarePointAddr
JNZ SIGN_1
fill vHardwarePointAddr,22,90//NOP 10h个字节

SIGN_1:
CMP eip,vGetAPIAddr
JNZ SIGN_2
MOV vAPIaddr,eax

SIGN_2:
CMP eip,vWriteIATAddr
JNZ SIGN_3

mov [edi], vAPIaddr

SIGN_3:
cmp eip,vOEP
JE EXIT_1

JMP LOOP_1

EXIT_1:
MSG "修复完毕"

当所有的修复完毕之后,发现IAT不是一个典型的IAT数组。而是被修改过的,每一个地址后面都多了一个0,所以需要在内存中重建输入表。使用工具


image.png

之后再dump,修复文件即可。

脱壳的学习方法

  1. 简单壳
    使用ESP定律,特征定位OEP,然后dump,修复

  2. 加密IAT
    使用ESP定律,特征定位OEP,然后使用单步跟踪、敏感API下断、IAT数组下断分析加密代码,写脚本还原。

  3. 反调试
    去掉调试器的异常捕获、插件的异常跳过,逐步过滤每一个异常,分析异常回调。

  4. 遇到一个没有分析过的壳
    使用peid 查壳发现是 XX壳,老板让分析,所以必须分析
    ① 下载XX壳的加壳软件
    ② 自己写个demo,使用加壳软件加壳
    ③ 想办法脱掉demo
    ④ 脱目标程序

相关文章

  • 脱壳经验2

    IAT在内存中和在文件中的特征?IAT在内存中是一个函数地址数组,在文件是是一个RVA数组 重定位的原理是什么?重...

  • 脱壳经验1

    脱壳-0.upx.exe① 找OEPESP定律 脱壳-0.exe(FSG 2.0)① 找oep单步跟踪跳转到OEP...

  • 【脱壳】软件 - 工具汇总

    【脱壳】软件使用手册 脱壳工具: FDex2_1.1 微脱壳_1.0.0 易开发_1.0.4 Xposed环境: ...

  • 【脱壳】软件 - 工具汇总

    【脱壳】软件使用手册 脱壳工具: FDex2_1.1 微脱壳_1.0.0 易开发_1.0.4 Xposed环境: ...

  • ios脱壳

    什么是脱壳?摘掉壳程序,将未加密的可执行文件还原出来(有些人也称为“砸壳”) 脱壳主要有2种方法:硬脱壳、动态脱壳...

  • ipa重签(iReSign修改版)

    脱壳 1. 下载PP助手越狱版 2. 手动脱壳 otool -l WeChat | grep crypt暂无 安装...

  • 看电影看出漂亮打功

    相信大家都看过《金蝉脱壳1》和《金蝉脱壳2》,不知《金蝉脱壳了-恶魔车站》大家有无看过,同样是西尔维斯...

  • 加壳脱壳

    脱壳存根(stub) 脱壳存根执行了以下三个步骤: (1)将原始程序脱壳到内存中 (2)解析原始可执行文件的所有导...

  • 细节为零的《金蝉脱壳2》

    前几天在某视频站上看了下《金蝉脱壳2》,仔细看了下,发现《金蝉脱壳2》(后面简称《金2》)整部电影细节基本为...

  • iOS app脱壳遇到的问题

    手机:iPhone 5s 10.3.3采用2种方式脱壳 1. Clutch 现在用Clutch脱壳 基本都失败了,...

网友评论

      本文标题:脱壳经验2

      本文链接:https://www.haomeiwen.com/subject/edfdaftx.html