脱壳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. 自动步入,等待停止

原文地址:https://www.cnblogs.com/ltyandy/p/11279166.html

时间: 2024-11-07 02:46:39

脱壳3的相关文章

安卓逆向之基于Xposed-ZjDroid脱壳

http://bbs.pediy.com/thread-218798.htm 前言 之前介绍了普通常见的反编译模式 但对于使用了 360加固 棒棒 爱加密 等等的加固应用就没办法了. 你会发现反编译出来的dex 只有几个类 逻辑都是调用so 真正的dex会被加载到内存中隐藏起来 加固应用都是多dex这种形式 要想拿到他真正的dex 需要进行脱壳处理  基本原理都是从内存中dump 我一般会先用工具来尝试 不行的话就得上 IDA(反汇编神器)超级强的一个工 具 杀手级别 贯穿移动端 PC端的逆向

android脱壳之DexExtractor原理分析[zhuan]

http://www.cnblogs.com/jiaoxiake/p/6818786.html内容如下 导语: 上一篇我们分析android脱壳使用对dvmDexFileOpenPartial下断点的原理,使用这种方法脱壳的有2个缺点: 1.  需要动态调试 2.  对抗反调试方案 为了提高工作效率, 我们不希望把宝贵的时间浪费去和加固的安全工程师去做对抗.作为一个高效率的逆向分析师, 笔者是忍不了的,所以我今天给大家带来一种的新的脱壳方法——DexExtractor脱壳法. 资源地址: Dex

android脱壳之DexExtractor原理分析

导语: 上一篇我们分析android脱壳使用对dvmDexFileOpenPartial下断点的原理,使用这种方法脱壳的有2个缺点: 1.  需要动态调试 2.  对抗反调试方案 为了提高工作效率, 我们不希望把宝贵的时间浪费去和加固的安全工程师去做对抗.作为一个高效率的逆向分析师, 笔者是忍不了的,所以我今天给大家带来一种的新的脱壳方法--DexExtractor脱壳法. 资源地址: DexExtractor源码:https://github.com/bunnyblue/DexExtracto

简单脱壳教程笔记(9) --- 手脱TELock0.98b1壳

本笔记是针对ximo早期发的脱壳基础视频教程,整理的笔记.本笔记用到的工具下载地址: http://download.csdn.net/detail/obuyiseng/9466056 TELock 操作 1.最后一次异常法 1.选项--->调试设置--->异常------取消所有异常. 在OD插件--StrongOD--Options--Skip Some Exceptions选项取消,重启OD再试试. 2.然后将程序重新载入 3.按shift+f9 ,发现17次shift+f9 就会让程序

简单脱壳教程笔记(10) --- 手脱EXE32PACK壳

本笔记是针对ximo早期发的脱壳基础视频教程,整理的笔记.本笔记用到的工具下载地址: http://download.csdn.net/detail/obuyiseng/9466056 EXE32PACK 1.ESP定律 1.将程序加载到OD中,发现有大段的加密指令,我们先单步走,到达关键指令,push ebp 2.单步运行到cmp eax,eax处,在寄存器窗口的esp处,右键在数据窗口跟随,并在数据窗口中进行设置硬件断点. 3.按运行,并删除硬件断点 4.然后单步,就会到达OEP 2.下断:

IDA分析脱壳后丢失导入表的PE

1. 问题 一些程序经过脱壳后(如用OD的dump插件),一些导入表信息丢失了,导致拖入IDA后看不到API的信息(如右图所示,第一个红圈处实际是GetCurrentProcessId),给分析造成极大影响.   2. 分析 从OD来看,41F480处的值就是API GetCurrentProcessId的地址,也就是壳修改后的导入表的位置,该地址在.rsrc Section内,即程序的资源段内,那么我们需要修复其导入表,以指向资源段内的地址 3. 修复导入表 <加密与解密>第3版的13.4.

使用Dotfuscator加密混淆程序以及如何脱壳反编译

混淆演示 首先介绍如何使用Dotfuscator对.net程序加密码混淆/加壳 C#或vb.net编写的应用程序或DLL. 这里随便创建了一个C#的命令行控制台程序.程序很简单,对当前的时间进行了AES的加解密并输出. 接下来使用Dotfuscator对程序进行混淆. 一,运行dotfuscator.exe 二,添加ConsoleApplication1.exe 三,对混淆选项进行一些配置 四,开始混淆. 五,查看混淆结果. 这里使用ILSPY工具,打开混淆后的程序.如图: 可以发现,代码被混淆

APK脱壳的一点小总结

目前在安全加固与脱壳破解的攻防中,破解者处在了优势的位置,个人认为在虚拟机保护出现之前,也会一直这样. 对于Android DEX文件的脱壳,一般分2种情况: 一种是dex会完整出现在内存当中,大部分免费版加固,某些企业版加固都是这样的,通常IDA调试断在dvmDexFileOpenPartial.dexFileParse等这些函数上面,直接内存dump就可以.但有些加固会有反调试,处理起来比较麻烦,因此直接hook这些函数更为简单,substrate.adbi这些框架可以帮助我们节省开发成本.

手动脱壳—dump与重建输入表

http://blog.csdn.net/ccnyou/article/details/7930817 很久没玩逆向了,今天权当复习,顺便做个笔记 文章中用到的demo下载地址: http://download.csdn.net/detail/ccnyou/4540254 附件中包含demo以及文章word原稿 用到工具: Ollydbg LordPE ImportREC 这些工具请自行下载准备 Dump原理这里也不多做描述,想要了解google it!常见的dump软件有LordPE,Proc

安卓 dex 通用脱壳技术研究(四)

/*     当第一个类执行到此函数时,我们在dvmDefineClass执行之前,也就是第一个类加载之前     注入我们的dump代码:即DumpClass()函数 */ static void Dalvik_dalvik_system_DexFile_defineClassNative(const u4* args,     JValue* pResult) {     StringObject* nameObj = (StringObject*) args[0];     Object*