逆向分析技术
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逆向分析技术相关的知识,希望对你有一定的参考价值。
1.启动函数
功能:检索新进程命令指针,环境指针,全局变量初始化,内存堆栈初始化
比如:
GetCommandLineA 命令指针
GetStartupInfoA 启动信息
GetModuleHandleA 执行文件基地址
编译器自动加入的代码:
00401020 >/$ 55 push ebp
00401021 |. 8BEC mov ebp, esp
00401023 |. 6A FF push -1
00401025 |. 68 A0504000 push 004050A0
0040102A |. 68 7C1C4000 push 00401C7C ; SE 处理程序安装
0040102F |. 64:A1 0000000>mov eax, dword ptr fs:[0]
00401035 |. 50 push eax
00401036 |. 64:8925 00000>mov dword ptr fs:[0], esp
0040103D |. 83EC 10 sub esp, 10
00401040 |. 53 push ebx
00401041 |. 56 push esi
2.函数及其参数
反编译分析时,将注意力集中在函数的识别以及参数的传递上
函数多以call(保存函数返回信息)地址为跳转 也有动态计算或者寄存器传地址
函数的参数传递方式有三种:
堆栈方式
寄存器方式
全局变量
3.函数的返回值
1. return操作符返回值
od遇到了一个bug 就是不是每个指令都会下到int3断点 从而debug时F8单步有一些代码是一起执行的。(这让想起了原子操作)
一般的返回值时存放在eax寄存器中,如果超过了容量则会放到edx寄存器中。
2.通过参数按照传引用的方式返回
注意ds和ss的区别 然后一般通过引用来传值需要使用变量的地址,在调用某个函数时再把变量的地址传给函数。
3.通过全局变量返回
4.数据结构
逆向算法和数据结构
1.局部变量
1.堆栈分配局部变量
在堆栈中进行分配,分配完在释放。或者直接存放在寄存器中。
分配[ebp-xxx]
访问[ebp+xxx]
初始化局部变量的两种方法:
mov [ebp-xxx],5
push 5
2.利用寄存器存放局部变量
堆栈占用两个寄存器,编译器会利用剩下的6个通用寄存器尽可能的有效存放局部变量。寄存器不够时才会使用堆栈,且局部变量的生命周期比较短,需要确定时那个寄存器存放的那个变量。
2.全局变量
全局变量存放在内存区,静态pe的.data的可读写区域的固定地址上。访问时即访问硬编码的特定地址即可。
(静态变量 static 作用范围有限)
如果是常量 则在只可读区域内。
3.数组
数组保存在.data段中 使用基地址+偏移来寻址
4.虚函数
虚函数实在运行时刻定义的函数,地址无法在编译时确定(在即将调用时确定)
对所有虚函数的引用常放在一个专用的数组虚函数表VTBL里,
这里使用4050A0存放着虚表(虚表里有两个方法的地址 利用两次间接寻址找到虚函数的正确地址)
每太搞懂右边的流程,为什么有个失败的流程 xor esi,esi
还有为什么每次任然需要新建一个this指针( mov ecx,esi )ecx来传递参数给成员函数
(更好奇的是如何复原ida里面的函数流程)
5.控制语句
1.if-then-else的循环控制语句
整数比较实用cmp 浮点数使用fcom fcomp
不太懂这个初始化的时候的值。书上说是指向局部变量空间
这里使用test替换cmp指令 如果为0则zf=1 不跳转继续执行
2.Switch-case语句
未优化前的代码都含有printf函数
编译优化后使用dec eax 来代替cmp指令 指令更短执行更快速
使用调转表
cmp 和ja 无符号大于则跳转 jmp table
3.转移指令的机器码的计算
短转:无条件和条件转移的机器码都是两个字节
长转:无条件转移是5个字节 条件转移是6个字节
子程序调用:call
以上是关于逆向分析技术的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段
20155201 李卓雯 《网络对抗技术》实验一 逆向及Bof基础
Android 逆向类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )(代码片段
Android 逆向Android 逆向通用工具开发 ( Android 平台运行的 cmd 程序类型 | Android 平台运行的 cmd 程序编译选项 | 编译 cmd 可执行程序 )(代码片段