zoukankan      html  css  js  c++  java
  • 脱壳3

    1. IAT在内存中和在文件中的特征?

      IAT在内存中是一个函数地址数组,在文件是是一个RVA数组

    2. 重定位的原理是什么?

      重定位地址的计算:

      addr = 映像基地址+VA+OffSet

      重定位地址处的数据:

      [addr] – 原基地址 + 现基地址

      [addr] + (现基地址–原基地址)

    3. 重定位在内存中的特征是什么?

     

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

     

    脱壳­IAT被加密如何分析

    分析方法

    1. 自上而下分析,单步跟踪 从程序开始单步分析,找到填充IAT的代码

    1. 敏感API下断,栈回溯分析 ① GetProcAddress ② LoadLibraryA/W, GetModuleHandleA/W ③ VirtualAlloc/VitualAllocEx/HeapAlloc ④ VitrualProtect/ VitrualProtectEx 3. 敏感数据下断,栈回溯分析 在IAT表加密的地址处下断点,运行之后断下再栈回溯分析

    脱壳步骤

    1.找OEP 2.Dump内存到文件 3.修复文件

    壳中的加密技术

    1.IAT加密

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

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

    4.反调试

    5.反虚拟机

    6.代码虚拟化

    脱壳06.exe

    总结:

    ① 找OEP 难点在于硬件断点有时会失效,解决方法通过特征定位 ② 找到清除硬件断点的异常函数 配置异常环境(尽可能接收所有的异常),通过在异常点设置硬件断点,来判断前一个异常函 数是否有清除代码,可以最终判断出第三个异常(STI 特权指令异常)的异常函数有清除代 码。

    ③ 解密IAT 按照通用方法,在OEP处的GetVersion所在的IAT设置硬件写入断点,展开分析。 首先会找到填充IAT的点,然后再通过跟踪找到获取API的地方,之后写脚本(脚本中需要加 一个分支,nop掉硬件断点清除代码)

    ④ 修复代码段,重建IAT 使用通用导入表修复工具,重建IAT ⑤ dump、修复IAT

    脱壳步骤:

    0.查壳

    程序OD刚打开情况:

    1.看到pushad。用popad下硬件。程序跑起来了。没断下来。

    2.直接断在函数GetVersion。能断到。

    3.F8一直走。程序崩了。

    4.代码段:在异常未解除之前代码段也看不到什么

     

    1.找OEP

     

    1. ESP定律

    2. 特征定位

      ① 二进制特征 在程序运行起来之后,在主模块代码起始地址,使用Ctrl+B搜索特征

    558BEC6AFF68????????68???????? 64A100000000506489250000000083EC585356578965E8

    也可以直接搜索指令。

    ② API调用特征 常见API下断点,当断下之后看其返回地址是否是来自主模块,是的话再去调用上一层

    GetVersion

    GetModuleHandleA

    GetSystemTimeOfFileTime

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

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

    ②在壳获取IAT的过程中的API下断点 GetProcAddress,GetModuleHandleA/W,LoadLibraryA/W

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

    反硬件断点的方法:

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

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

    ③SetUnhandledExceptionFilter 设置顶层异常函数

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

    脱壳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中的反断点异常分析

    搭建环境

           

    分析异常

    经过调试,发现异常有很多个。需要排查找出对硬件断点清0的地方 在异常点设置硬件断点,看能不能断下能不能断下,能断下说明当前异常点前面的异常处理 函数中没有对硬件断点清0

    第一个异常:

    第二个异常:

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

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

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

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

    即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,所以需要在内存中重建输入表。使用工具

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

    脱壳的学习方法

     

    1. 简单壳

      使用ESP定律,特征定位OEP,然后dump,修复

    2. 加密IAT

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

    1. 反调试

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

    1. 遇到一个没有分析过的壳

      使用peid 查壳发现是 XX壳,老板让分析,所以必须分析

      ① 下载XX壳的加壳软件

      ② 自己写个demo,使用加壳软件加壳

      ③ 想办法脱掉demo

      ④ 脱目标程序

      关于RUN跟踪的设置

      1. 打开RUN跟踪

     

    1. 设置条件

       

    1. 自动步入,等待停止

       

  • 相关阅读:
    Java大坑之Integer对象比较相等
    Spark操作算子本质-RDD的容错
    Spark集群搭建(local、standalone、yarn)
    Spark持久化策略
    SparkRDD内核
    Spark初识
    Hadoop集群初始化启动
    centos6.5安装MySQL5.7
    学习笔记-Kuaihu(仿知乎日报)
    Eclipse开发Android程序如何在手机上运行
  • 原文地址:https://www.cnblogs.com/ltyandy/p/11279166.html
Copyright © 2011-2022 走看看