Exeinfope(查壳软件):
可以查看exe、dll程序的编译信息,开发语言,是否加壳,壳的种类以及入口地址等信息。
1、集成exeinfope到右键菜单
打开exeinfope后选择右侧一栏的(长得很像)设置的按钮,选择外壳整合,即可集成到右键菜单
2、打开exeinfope
将文件放置在桌面,右键点击要查壳的文件,点击显示更多选项,找到Exe Info PE scan,即可查壳
3、具体使用步骤:exeinfo pe的使用(基本)-CSDN博客
检查是否加壳:
如果软件未加壳(Not packed),则会直接显示开发的编程语言
如果软件加了壳,则可以识别出加的哪种壳(EP Section会显示壳类型)
IDA pro
IDA Pro就是一款递归下降反汇编器
反汇编器使用的算法包括:线性扫描反汇编算法、递归下降反汇编算法
适用于静态调试和动态调试
IDA详细使用教程,适合逆向新手的实验报告-CSDN博客
IDA基本使用_ida修改exe并保存-CSDN博客
1)导航条IDA
主界面中存在一项颜色各异的导航条。通过导航条可了解分析可执行文件各部分数据分布情况,各种颜色代表含义如下:
蓝色:表示常规的指令函数,绝大部分为用户编写的代码,上图中绝大部分数据属于蓝色数据。
黑色:表示间隙部分内容,可执行文件中包含多个节段,相邻节段之间存在空隙,红色表示空隙部分。
银白色:表示数据项部分内容,可执行文件中会包含大量数据,银白色表示数据项部分内容。
粉色:表示外部导入符号,通常可执行文件会导入外部的库函数。
暗黄色:表示IDA未识别的内容,需要用户根据需求自行分析。
2)反汇编窗口
反汇编窗口属于“IDA View-A”标签项内容。反汇编窗口可分为两种模式,分别为:默认模式和图形模式。
汇编窗口中可以根据地址的颜色分辨某个位置的数据类型:
黑色——被标注为代码的位置
灰色——被标注为数据的位置
黄色——未定义数据类型的位置
3)输出窗口
显示运行过程中IDA日志,也可以在下方的输入框中输入命令并执行
4)其他辅助分析窗口
十六进制窗口可支持用户查看可执行文件对应相对偏移的二进制机器码数据,十六进制查看窗口对应“Hex View-1”选项内容。
按F2可以对数据库中的数据进行修改,修改后再次按F2即可应用修改
十六进制查看窗口总共分为三部分,三部分内容分别位于上图左、中、右,三处含义分别为:
左边数据:表示十六进制数据对应的内存相对偏移。
中间数据:表示内存中数据的具体内容。
右边数据:表示内存数据的字符串显示,该功能可辅助读者快速识别字符串内容。
函数窗口:
IDA在数据库中识别的每一个函数,双击一个函数,会跳转到反汇编窗口这个函数所在的位置
5)IDA分析可执行文件
IDA会对可识别的文件进行代码反编译,反编译过程依据文件大小而定。IDA软件会利用回归方式递进分析可执行文件反汇编代码。判断IDA分析完毕的三种方法分别为:
1)图中IDA的“Output Window”窗口输出“The initial autoanalysis has been finished”日志时,则说明IDA已分析完毕。
2)如图所示进度条处黄色向上箭头消失时,则表明IDA分析完毕。
3)图中IDA界面左下角AU处于”idle”状态时,也表明IDA分析完毕。
6)快捷键
空格键:反汇编窗口切换文本跟图形
Tab:汇编语言转入高级语言
Shift +F5:打开签名窗口
shift+F12:自动分析出参考字符串
shift+E:提取数据(提取选中东西的数值)
ALT+T:搜索字符串(文本搜索)
ALT+L:标记(Lable)
ALT+M:设置标签(mark)
ALT+G:转换局部变量为结构体
ALT+Enter:跳转到新的窗口
Alt+B:快捷键用于搜索十六进制字节序列,通常在分析过程中可以用来搜索opcode
Ctrl+“+”/Ctrl+鼠标滚轮:可以实现界面的缩放
CTRL+M:列举出当前已经添加的标签
Ctrl+F:左栏搜索函数
F9:动态调试程序(其实IDA主要用作静态分析用的)
F5:将一个函数逆向出来(生成c伪代码)
**X(ctrl+X)**:交叉引用,类似于OD中的栈回溯操作
N:对符号重命名
**:&;(冒号&分号)**:光标所在位置添加常规注释和可重复注释
T:解析结构体偏移
M:转换为枚举类型常量
H:转换16进制
R:将数字转化为ASCII码
数据类型操作
A:将选择的信息转换成ASCII(转换成可读性跟强的字符串),将数据转换为字符串
*键:将此处定义为一个数组
O:将此处定义为一个地址偏移
C:光标所在地址处的内容解析成代码,即让某一个位置变为指令,在定义为指令后,IDA会自动以此为起始位置进行递归下降反汇编。
D:光标所在地址处的内容解析成数据,一直按D键,这个位置的数据类型将会以1,2,4,8字节循环。
U:光标所在地址处的内容解析成未定义内容,即取消一个地方已有的数据类型定义。
函数操作
删除函数:在函数窗口选中函数,按Delete键
定义函数:在反汇编窗口中选中对应行后,按P键
修改函数参数:在函数窗口中选中并按Ctrl+E,或在反汇编窗口的函数内部按Alt+P
导航操作
ESC:回退到上一位置
Ctrl+Enter:前进到下一位置
G:跳转到指定地址,按下G键后可以输入地址/已经定义的名称
CTRL+S:跳转到某一区段,按下快捷键后选择区段
类型操作
Y键:自由定义各种数据类型(函数声明、变量声明、结构体声明)。选中变量、函数后按Y键,输入正确的C语言类型,IDA自动解析应用这个类型
7)交叉引用
文件中存储的一些数据,我们知道计算机是存储程序式结构,代码部分会对数据进行操作,使用IDA的交叉引用可以查看对于一个地址处的数据被哪些地方的代码进行了引用,我们就可以根据一个数据进行跟踪
概念
交叉引用是一个地址引用一个地址
根据图论的知识,可以把地址看成节点,把交叉引用看成边
分为代码交叉引用和数据交叉引用
代码交叉引用(函数调用,顺序执行和跳转)
三种基本的流:普通流,跳转流,调用流
普通流:就是顺序执行,默认执行流,执行紧跟在后面的指令
跳转流:无条件分支和条件分支分配到一跳转流,注释中出现j后缀
调用流:调用一个函数使用调用流,使用后缀p
数据数据交叉引用
读取交叉引用:访问某个内存位置
写入交叉引用:写入内内存
偏移量交叉引用:引用某个位置的地址
8)Patch
Patch就是打补丁,即修改汇编代码
选中汇编代码
Chang bytes可以修改汇编语言对应的机器码
Assemble instruction可以修改汇编指令
修改exe文件并保存运行
按照上述操作进行修改之后,我们修改的信息存在了数据库中
exe文件是不会修改的,若我们想得到修改后的一个exe文件 ,进行下面的操作
9)Re基础总结:
1、更改scanf,printf并F5刷新
2、查看函数退出F5刷新会补充/消去参数
3、不需要return的时候可以更改函数返回值类型或者直接移除return
4、交叉引用
5、显示指令的地址(勾1)显示指令的硬编码(改2,一般8个就可以)
6、“ \ “将隐藏强制类型转换
7、“ / ”进行注释
8、动态调试:
下断点>>在上面一行“no debugger”处选择“local windows debugger”>>按下绿色箭头开始调试
按F7表示进入函数,在某处再下一个断点,按F8会跳过该函数
10)找main函数
[逆向]寻找PE文件的main与winmain - 肖洋肖恩、 - 博客园 (cnblogs.com)
1、VC的入口点(IDA中的start函数–export窗口可查看)会直接调用main( )函数,在start( )函数中被调用的函数参数有3个(汇编代码指令中出现3个push,1个call),并且返回值被传入exit( )函数的要重点查看
[原创]逆向技术之寻找Main入口点-软件逆向-看雪-安全社区|安全招聘|kanxue.com
2、GCC将main( )函数的地址传入_libc_start_main来调用main( )函数,查看调用的参数即可找到main( )函数的地址
1)创建结构体
Ins键:创建结构体
d键:添加结构体成员(连续按d键可以切换字节数),添加新成员时,鼠标点击ends一行再按d键
Del:选中要删除的结构体,按Del键即可删除
要删除结构体中的某个成员:
先选中该成员,再右键按“Undefined”,然后对Undefined部分右键按“Shrink struct Type”即可删除
快速创建结构体成员:
法一:
先创建结构体和一个结构体成员
再选中该成员,右键点击Array
在Array size中输入要创建的成员个数(Options全不选),最后点击OK即可
法二:
Xdbg
以管理员模式运行
1)快捷键:
g:查看流程图
右键-脱离:可以脱离流程图
CPU窗口-右键-搜索-选择模块-字符串:搜索字符串
空格:对汇编语言进行修改
F7:步进——相当于逐语句执行
F8:步过——相当于逐过程执行
Ctrl+F9:运行到返回
F9:运行程序,进入主模块
F2:下断点(在想断下的指令上按下对应快捷键)
选中函数-右键-符号名称帮助:查询不理解的函数名称
F4:运行到光标处位置
Ctrl+G:跳转到(401000是程序的入口地址)
单击需要高亮显示的内容:进入高亮模式,高亮显示所有相同的内容
按H-点击空白处:取消高亮
帮助-计算器:x64dbg计算器
右键-显示指令提示:显示汇编指令对应解释
选中要复制的数据部分-右键-二进制-编辑-复制数据:复制各种格式的数据
2)基本窗口
3)汇编代码相关:
(一)寄存器
寄存器:
x64有16个寄存器,以”R“开头
x32有8个寄存器,以‘’E’开头
EIP/RIP:存放即将执行的代码的地址
ESP/RSP:指向堆栈的最顶端
EAX/EBX/ECX/EDX/RAX/RBX/RCX/RDX:通用寄存器,存储内存地址,计算,计数
16位寄存器可拆分为2个8位寄存器:如AX,可以拆分为AL(低8位)和AH(高8位)
标志位:
CF(进位标志位):执行一个加法(减法)运算时,最高位产生进位(或借位)时,CF=1,否则为0
ZF(零标志位):若当前运算的结果为0,则ZF=1,否则为0
SF(符号标志位):该标志位与运算结果的最高位相同,即运算结果为负,则SF=1,否则为0
OF(溢出标志位):若运算结果超出机器能够表示的范围称为溢出,此时OF=1,否则为0
PF(奇偶标志位):若运算结果(二进制)的最低16位中含1的个数为偶数,则PF=1,否则为0
(二)指令
nop指令:
意思是没有执行任何操作。
选择跳转(jmp)处,右键-二进制-用nop填充,可以不执行跳转指令。再右键-回复选取,即可取消nop指令
lea指令:
1 | lea 寄存器,[值] |
(三)位运算指令
and指令:逻辑与指令,按位进行运算
mov al,01100011B
and al,00111011B
执行后:al=00100011B
**注:两个同时为真的结果才会为真(只有1 and 1才会为1) **
功能:通过该指令可将操作对象的相应位设为0,其他位不变。
例如–将al的第6位设为0:and al,10111111B
or指令:逻辑或指令,按位进行或运算
mov al,01100011B
or al,00111011B
执行后:al=01111011B
注:两个同时为假的结果才会为假(只有0 or 0才会为0)
功能:通过该指令可将操作对象的相应位设为1,其他位不变
例如–将al的第0位设为1:or al,00000001B
xor指令:按位异或运算
按位异或运算将两个运算分量的对应位按位遵照以下规则进行计算:
0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0
即相应位的值相同的,结果为 0,不相同的结果为 1。
例如,2 ^ 6结果为4
因为2表示为二进制为0010,6表示为二进制为0110
两数只有第三位相异,因此最后的结果为0100,即为4
not指令:逻辑取反运算
mov ax,010100000B
not ax
执行后:ax=10101111B
注:1则为0,0则为1
(四)比较指令
cmp指令:
通过相关标志位的值可以看出比较结果
1 | cmp 操作对象1,操作对象2 |
test指令:逻辑比较指令
1 | test 操作数1,操作数2//将两个操作数进行逻辑与运算,并根据运算结果设置相关的标志位。但是,Test命令的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃。(即test不会改变寄存器的值) |
(五)跳转指令
jmp:无条件跳转,不根据标志位来改变程序运行逻辑
je/jz:等于则转移(ZF=1)
jne/jnz:不等于则转移(ZF=0)
jb(判断无符号数):低于则转移(CF=1)
jnb:不低于则转移(CF=0)
jbe:操作数1小于等于操作数2时,CF或ZF=1则跳转
jnbe:操作数大于操作数2时,CF和ZF=0则跳转
jl(判断有符号数):SF=1则跳转
js:如果结果为负数,即SF=1则跳转
jns:如果结果为正数,即SF=0则跳转
jp/jpe:如果二进制结果中1的个数为偶数,即PF=1则跳转
jnp/jpo:如果二进制结果中1的个数为奇数,即PF=0则跳转
jo:OF=1则跳转
jno:OF=0则跳转
(六)函数指令
call指令:
修改IP或同时修改CS和IP汇编:call指令_汇编call指令主指令加子指令-CSDN博客
(1)将当前的IP或CS和IP压入栈中
(2)转移(jmp)
call指令不能实现短转移,除此之外,call指令实现转移的方法和jmp指令的原理相同
1 | call 标号(将当前的IP压栈后,转到标号处执行指令) |
ret指令:
1 | 用栈中的数据,修改IP的内容,实现近转移//pop ip |
注:call指令和ret指令一般搭配使用,call指令跳转之后,ret指令返回
(七)循环指令
loop指令:
loop指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。
对IP修改范围为-128~127
1 | loop 标号 |
Reflector
可以将.NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将中间语言转换为C#或Visual Basic以外,Reflector还能够提供程序集中类及其成员的概要信息、提供查看程序集中中间语言的能力以及提供对第三方插件的支持。
Reflector可以用于对代码的修改
Jadx-gui
简介
jadx-gui 是一种基于 jadx 项目的图形界面工具,用于反编译 Android 应用程序的工具。通过使用jadx-gui,开发人员可以打开 APK(Android应用程序包)文件,并查看其反编译的源代码。这对于分析、理解和调试 Android 应用程序非常有用。jadx-gui 提供了一个用户友好的界面,使用户能够浏览应用程序的类、方法、变量等,并可以搜索特定的代码片段
可以查看APK中classes.dex转化成出的jar文件,即源码文件
使用方法
2024最新版Android逆向教程——第2天:dex反编译工具的安装和使用_jadx-CSDN博客
缺点及解决方案
Android反编译 jadx-gui基本用法_jadxgui-CSDN博客
APK过大时无法使用索引
jadx-gui缺点是如果遇到较大的APP,代码加起来超过30mb的话,这个软件的索引功能基本会失效,需要用Android studio来辅助。
在jadx-gui中,选择左上角的文件,另存为gradle工程。
在保存之后,再用Android Studio打开另存为的工程,就可以使用索引了。
内存不足
如果内存无论如何都不够用用,需要调大内存的话,这个时候就不要从github上下载exe文件了,下载zip文件并解压。
只要打开bin目录下的jdax-gui.bat就能正常使用
右键该文件,选择编辑
搜索set DEFAULT_JVM_OPTS
在后面的”-Xms128M” “-Xmx4g”中的4g改为你想要开的内存大小即可,如果后面的内容为空就增加这些内容。
ResourceHacker
可以直接查看文件中的资源