逆向工程-REVERSE知识手册

发布于:2023-05-22 ⋅ 阅读:(382) ⋅ 点赞:(0)

逆向基础

windows 逆向 软件保护
IDA扩展

正向开发

.net C# 逆向

1.1 汇编基础

1.1.1目前计算机的常见指令集
● x86/x64
● ARM/ARM64(AArch64)
● 其他相对小众的架构(如MIPS)

汇编指令<-----C语言代码(简洁的运算符) 拆开写

CPU的运行方式:
取出下一条要执行的指令+执行当前的指令+输出结果
Intel AMD

常用汇编指令

运算指令:
加减乘除 与或非 异或

数据转移指令:
读取/写入不同长度的内存
写入寄存器

跳转指令:
无条件跳转/条件跳转

JMP 无条件跳转 
jmp 入口点

栈操作指令:
入栈、出栈

push 0
把立即数 0 和 -1 压入堆栈。
汇编指令: JO、JNO、JB、JNB、JE、JNE、JBE、JA、JS、JNS、JP、JNP、JL、JNL、JNG、JG、JCXZ、JECXZ、JMP、JMPE 
名称 功能 操作数 操作码 模数 寄存器1 寄存器2 或内存 位移量 立即数 符号方向 芯片型号 16位 32位

JO 溢出跳转 短 $70 无 无 无 无 10 无 无 8086 无 无 
JNO 不溢出跳转 短 $71 无 无 无 无 10 无 无 8086 无 无 
JB 低于跳转 短 $72 无 无 无 无 10 无 无 8086 无 无 
JNB 不低于跳转 短 $73 无 无 无 无 10 无 无 8086 无 无 
JE 相等跳转 短 $74 无 无 无 无 10 无 无 8086 无 无 
JNE 不等跳转 短 $75 无 无 无 无 10 无 无 8086 无 无 
JBE 不高于跳转 短 $76 无 无 无 无 10 无 无 8086 无 无 
JA 高于跳转 短 $77 无 无 无 无 10 无 无 8086 无 无 
JS 负号跳转 短 $78 无 无 无 无 10 无 无 8086 无 无 
JNS 非负跳转 短 $79 无 无 无 无 10 无 无 8086 无 无 
JP 奇偶跳转 短 $7A 无 无 无 无 10 无 无 8086 无 无 
JNP 非奇偶跳转 短 $7B 无 无 无 无 10 无 无 8086 无 无 
JL 小于跳转 短 $7C 无 无 无 无 10 无 无 8086 无 无 
JNL 不小于跳转 短 $7D 无 无 无 无 10 无 无 8086 无 无 
JNG 不大于跳转 短 $7E 无 无 无 无 10 无 无 8086 无 无 
JG 大于跳转 短 $7F 无 无 无 无 10 无 无 8086 无 无 
JO 溢出跳转 近 $0F80 无 无 无 无 10 无 无 386 无 $66 
JNO 不溢出跳转 近 $0F81 无 无 无 无 10 无 无 386 无 $66 
JB 低于跳转 近 $0F82 无 无 无 无 10 无 无 386 无 $66 
JNB 不低于跳转 近 $0F83 无 无 无 无 10 无 无 386 无 $66 
JE 相等跳转 近 $0F84 无 无 无 无 10 无 无 386 无 $66 
JNE 不等跳转 近 $0F85 无 无 无 无 10 无 无 386 无 $66 
JBE 不高于跳转 近 $0F86 无 无 无 无 10 无 无 386 无 $66 
JA 高于跳转 近 $0F87 无 无 无 无 10 无 无 386 无 $66 
JS 负号跳转 近 $0F88 无 无 无 无 10 无 无 386 无 $66 
JNS 非负跳转 近 $0F89 无 无 无 无 10 无 无 386 无 $66 
JP 奇偶跳转 近 $0F8A 无 无 无 无 10 无 无 386 无 $66 
JNP 非奇偶跳转 近 $0F8B 无 无 无 无 10 无 无 386 无 $66 
JL 小于跳转 近 $0F8C 无 无 无 无 10 无 无 386 无 $66 
JNL 不小于跳转 近 $0F8D 无 无 无 无 10 无 无 386 无 $66 
JNG 不大于跳转 近 $0F8E 无 无 无 无 10 无 无 386 无 $66 
JG 大于跳转 近 $0F8F 无 无 无 无 10 无 无 386 无 $66 
JO 溢出跳转 近 $0F80 无 无 无 无 10 无 无 386 $66 无 
JNO 不溢出跳转 近 $0F81 无 无 无 无 10 无 无 386 $66 无 
JB 低于跳转 近 $0F82 无 无 无 无 10 无 无 386 $66 无 
JNB 不低于跳转 近 $0F83 无 无 无 无 10 无 无 386 $66 无 
JE 相等跳转 近 $0F84 无 无 无 无 10 无 无 386 $66 无 
JNE 不等跳转 近 $0F85 无 无 无 无 10 无 无 386 $66 无 
JBE 不高于跳转 近 $0F86 无 无 无 无 10 无 无 386 $66 无 
JA 高于跳转 近 $0F87 无 无 无 无 10 无 无 386 $66 无 
JS 负号跳转 近 $0F88 无 无 无 无 10 无 无 386 $66 无 
JNS 非负跳转 近 $0F89 无 无 无 无 10 无 无 386 $66 无 
JP 奇偶跳转 近 $0F8A 无 无 无 无 10 无 无 386 $66 无 
JNP 非奇偶跳转 近 $0F8B 无 无 无 无 10 无 无 386 $66 无 
JL 小于跳转 近 $0F8C 无 无 无 无 10 无 无 386 $66 无 
JNL 不小于跳转 近 $0F8D 无 无 无 无 10 无 无 386 $66 无 
JNG 不大于跳转 近 $0F8E 无 无 无 无 10 无 无 386 $66 无 
JG 大于跳转 近 $0F8F 无 无 无 无 10 无 无 386 $66 无 
JCXZ 计数一六零跳转 位移8 $E3 无 无 无 无 10 无 无 8086 无 $67 
JECXZ 计数三二零跳转 位移8 $E3 无 无 无 无 10 无 无 386 $67 无 
JMP 跳转 寄16 $FF 11 100 3 无 无 无 无 8086 无 $66 
JMP 跳转 寄32 $FF 11 100 3 无 无 无 无 386 $66 无 
JMP 跳转 16[寄16] $FF 00 100 5 无 无 无 无 8086 无 $6766 
JMP 跳转 32[寄16] $FF 00 100 5 无 无 无 无 386 $66 $67 
JMP 跳转 16[寄32] $FF 00 100 5 无 无 无 无 386 $67 $66 
JMP 跳转 32[寄32] $FF 00 100 5 无 无 无 无 386 $6766 无 
JMP 跳转 16[寄16+位移8] $FF 01 100 5 9 无 无 无 8086 无 $6766 
JMP 跳转 32[寄16+位移8] $FF 01 100 5 9 无 无 无 386 $66 $67 
JMP 跳转 16[寄32+位移8] $FF 01 100 5 9 无 无 无 386 $67 $66 
JMP 跳转 32[寄32+位移8] $FF 01 100 5 9 无 无 无 386 $6766 无 
JMP 跳转 16[寄16+位移16] $FF 10 100 5 9 无 无 无 8086 无 $6766 
JMP 跳转 32[寄16+位移16] $FF 10 100 5 9 无 无 无 386 $66 $67 
JMP 跳转 16[寄32+位移32] $FF 10 100 5 9 无 无 无 386 $67 $66 
JMP 跳转 32[寄32+位移32] $FF 10 100 5 9 无 无 无 386 $6766 无 
JMP 跳转 近16[寄16] $FF 00 100 5 无 无 无 无 8086 无 $6766 
JMP 跳转 近32[寄16] $FF 00 100 5 无 无 无 无 386 $66 $67 
JMP 跳转 近16[寄32] $FF 00 100 5 无 无 无 无 386 $67 $66 
JMP 跳转 近32[寄32] $FF 00 100 5 无 无 无 无 386 $6766 无 
JMP 跳转 近16[寄16+位移8] $FF 01 100 5 9 无 无 无 8086 无 $6766 
JMP 跳转 近32[寄16+位移8] $FF 01 100 5 9 无 无 无 386 $66 $67 
JMP 跳转 近16[寄32+位移8] $FF 01 100 5 9 无 无 无 386 $67 $66 
JMP 跳转 近32[寄32+位移8] $FF 01 100 5 9 无 无 无 386 $6766 无 
JMP 跳转 近16[寄16+位移16] $FF 10 100 5 9 无 无 无 8086 无 $6766 
JMP 跳转 近32[寄16+位移16] $FF 10 100 5 9 无 无 无 386 $66 $67 
JMP 跳转 近16[寄32+位移32] $FF 10 100 5 9 无 无 无 386 $67 $66 
JMP 跳转 近32[寄32+位移32] $FF 10 100 5 9 无 无 无 386 $6766 无 
JMP 跳转 远16[寄16] $FF 00 101 5 无 无 无 无 8086 无 $6766 
JMP 跳转 远32[寄16] $FF 00 101 5 无 无 无 无 386 $66 $67 
JMP 跳转 远16[寄32] $FF 00 101 5 无 无 无 无 386 $67 $66 
JMP 跳转 远32[寄32] $FF 00 101 5 无 无 无 无 386 $6766 无 
JMP 跳转 远16[寄16+位移8] $FF 01 101 5 9 无 无 无 8086 无 $6766 
JMP 跳转 远32[寄16+位移8] $FF 01 101 5 9 无 无 无 386 $66 $67 
JMP 跳转 远16[寄32+位移8] $FF 01 101 5 9 无 无 无 386 $67 $66 
JMP 跳转 远32[寄32+位移8] $FF 01 101 5 9 无 无 无 386 $6766 无 
JMP 跳转 远16[寄16+位移16] $FF 10 101 5 9 无 无 无 8086 无 $6766 
JMP 跳转 远32[寄16+位移16] $FF 10 101 5 9 无 无 无 386 $66 $67 
JMP 跳转 远16[寄32+位移32] $FF 10 101 5 9 无 无 无 386 $67 $66 
JMP 跳转 远32[寄32+位移32] $FF 10 101 5 9 无 无 无 386 $6766 无 
JMP 跳转 短 $EB 无 无 无 无 10 无 无 8086 无 无 
JMP 跳转 位移16 $E9 无 无 无 无 10 无 无 8086 无 $66 
JMP 跳转 位移32 $E9 无 无 无 无 10 无 无 386 $66 无 
JMP 跳转 近 $E9 无 无 无 无 10 无 无 8086 无 $66 
JMP 跳转 近 $E9 无 无 无 无 10 无 无 386 $66 无 
JMP 跳转 远(数段址:)偏移16 $EA 无 无 无 无 10 无 无 8086 无 $66 
JMP 跳转 远(数段址:)偏移32 $EA 无 无 无 无 10 无 无 386 $66 无 
JMP 跳转 数段址:偏移16 $EA 无 无 无 无 12 无 无 8086 无 $66 
JMP 跳转 数段址:偏移32 $EA 无 无 无 无 12 无 无 386 $66 无 
JMPE 跳转扩展 寄16 $0F00 11 110 3 无 无 无 无 IA64 无 $66 
JMPE 跳转扩展 寄32 $0F00 11 110 3 无 无 无 无 IA64 $66 无 
JMPE 跳转扩展 16[寄16] $0F00 00 110 5 无 无 无 无 IA64 无 $66 
JMPE 跳转扩展 32[寄16] $0F00 00 110 5 无 无 无 无 IA64 $66 无 
JMPE 跳转扩展 16[寄32] $0F00 00 110 5 无 无 无 无 IA64 无 $66 
JMPE 跳转扩展 32[寄32] $0F00 00 110 5 无 无 无 无 IA64 $66 无 
JMPE 跳转扩展 16[寄16+位移8] $0F00 01 110 5 9 无 无 无 IA64 无 $66 
JMPE 跳转扩展 32[寄16+位移8] $0F00 01 110 5 9 无 无 无 IA64 $66 无 
JMPE 跳转扩展 16[寄32+位移8] $0F00 01 110 5 9 无 无 无 IA64 无 $66 
JMPE 跳转扩展 32[寄32+位移8] $0F00 01 110 5 9 无 无 无 IA64 $66 无 
JMPE 跳转扩展 16[寄16+位移16] $0F00 10 110 5 9 无 无 无 IA64 无 $66 
JMPE 跳转扩展 32[寄16+位移16] $0F00 10 110 5 9 无 无 无 IA64 $66 无 
JMPE 跳转扩展 16[寄32+位移32] $0F00 10 110 5 9 无 无 无 IA64 无 $66 
JMPE 跳转扩展 32[寄32+位移32] $0F00 10 110 5 9 无 无 无 IA64 $66 无 
JMPE 跳转扩展 位移16 $0FB8 无 无 无 无 10 无 无 IA64 无 $66 
JMPE 跳转扩展 位移32 $0FB8 无 无 无 无 10 无 无 IA64 $66 无 

x86寄存器

支持使用一个寄存器的不同长度的值

只包含通用寄存器
在这里插入图片描述

RIP-指向下一条执行的命令
RSP-指向栈顶
RBP-指向栈帧中心(稍后解释栈和栈帧)

ARM寄存器

在这里插入图片描述

SP与x86中esp相当
R11与x86中ebp相当
LR是link register的简称,用于保存调用者的地址方便返回
PC在ARM中指向两条指令之后(由于三级流水线的历史遗留问题)

X86和ARM的汇编指令

在这里插入图片描述

总论

在这里插入图片描述

一般指令执行时都会将返回的结果存储于寄存器中。
但寄存器数量很有限,于是我们需要经常的将它存入内存。

然后聪明的先人就创造了栈。

1.2 常用逆向思路

1.3 工具

1.3.1 二进制编辑器

● 010 Editor
在这里插入图片描述

模板功能, Templates→Template Repository即可看到各种已有模板
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Template的语法类似于C结构体,可自己直接编写并加载,且支持基本的C语法如循环、判断等
在这里插入图片描述
在这里插入图片描述

解析的结果会以列表的形式显示在Variables界面中

快速解析已知格式文件
二进制复制与粘贴支持
不同格式输入
编码支持较差

● EditPlus
在这里插入图片描述

编码支持相当好
二进制编辑能力较弱
UltraEdit、WinHex

1.3.2 可执行文件查看工具

● PE:CFF Explorer
在这里插入图片描述

● MachO:MachO View
● ELF:直接IDA

1.3.3 格式转换工具

● Shellcode Helper

1.3.4 反汇编器 非侵入式
● IDA:Interactive Disassembler
反汇编界面使用
不同界面说明
设置Data、Code(d、c)
查看Cross Reference(x)
查看String List(Shift-F12)

F5反编译器使用
设置Type (变量、函数)(Y)
设置Calling Convention (Y)

1.3.5 调试器
命令行调试器
● gdb
支持平台全面,有强大社区支持
支持配合gdbserver进行远程调试
社区维护大量插件
● WinDBG
仅支持Win平台
强于解析结构体,尤善于Windows内部结构的解析与显示
同样支持插件,但数量相对较少
支持Win内核调试
支持Win远程调试

图形界面调试器
● OllyDBG
Win下老牌调试器
有强大的社区,
支持脚本和插件扩展
仅支持32位
快捷键:F8步过 F7步进 F4运行至 F9运行 F2下断点

x64dbg 2020.06.04 反汇编修改神器

https://x64dbg.com/

在这里插入图片描述在这里插入图片描述
pluginsdk 插件开发包
release x64dbg的主程序目录
在这里插入图片描述

支持32和64位
仍在活跃开发中
插件相对较少
快捷键与OD相同

在这里插入图片描述

逆向反汇编修改神器,免费开源x64/x32位动态调试器,适用Windows的专业程序调试器,软件原生支持中文界面和插件,其界面及操作方法与OllyDbg调试工具类似,
支持类似C的表达式解析器、
全功能的DLL和EXE文件调试、IDA般的侧边栏与跳跃箭头、动态识别模块和串、快反汇编、可调试的脚本语言自动化等多项实用分析功能。

x64dbg调试器主要分为三部分载体:

DBG 是调试器的调试部分,它处理调试技术(使用的 TitanEngine),并为GUI提供数据。
GUI 是调试器的图形部分,它建立在Qt上,并提供用户交互界面。
Bridge 是DBG和GUI部分的通信库,它可以用于在新建功能上工作,而无需更新代码的其它部分。

在这里插入图片描述在这里插入图片描述修订了啥
简体中文修订说明:王苏 2020.06.10

  1. 为帮助用户更好地了解 x64dbg 反汇编后的 CPU 汇编指令信息,对汇编指令的“助记符摘要”全部进行了汉化。
  2. 由于本次更新幅度较大,更改的内容较多,所以对“助记符帮助”进行了部分汉化。
  3. 汇编指令的汉化参考了“清华大学出版社”出版的《汇编语言程序设计教程》(第4版) 中术语,因此可能与其他软件的汉化术语略有不同。
  4. 对 Scylla 插件等进行了全面汉化。
  5. 对 x64dbg 帮助文档的主要内容进行了汉化,并按照最新版进行了修订、翻译。
  6. 对界面字体以及布局重新进行了设置。
  7. 将默认调用在线英文帮助更改为调用本地的中文帮助文件。
  8. 对 x64dbg 官方中文版的汉化错误及不一致处进行了修订,并与帮助文档的关键词进行了统一。
  9. 对中文版界面字体进行了重新设置,使其更为美观。

x64dbg初步认知

快捷键

附加进程 ALT + A
在这里插入图片描述在这里插入图片描述在这里插入图片描述
cpu 反汇编窗口
F2 断断点 同OD
F8 步过
空格键 编辑 汇编
在这里插入图片描述

IDA pro 内置调试器

快捷键与OD相同
支持多种后端:
IDA内置调试器
gdb、windbg

支持远程调试
兼容gdbserver
官方支持ARM/ARM64、x86/x64指令集远程调试
支持Android iOS Win Linux
支持配合Hex-Rays调试

单步、查看运行过程中变量的值
步进
单步执行,遇到call调用时会跟进而不是跳过去
步过
单步执行,遇到call调用时会和别的指令一样跳过去
运行至指定位置
相当于临时下断点,碰到循环时可以方便的跳过去
运行
直接跑起来,而不是一条一条指令执行

在这里插入图片描述

打开安装程序

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 安装错误 看看这里有没有 卸载
    在这里插入图片描述
  • 卸载 重新安装
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

APK反编译工具

工具:

1、apktool.bat;apktool.jar
官网下载地址 https://ibotpeaches.github.io/Apktool/install/

作用:最大程度的还原apk中的manifest文件和资源文件 。
使用apktool工具反编译apk文件比直接解压同一个apk文件大;
还可以将反编译之后的apk重新打包成apk文件,
但需要重新签名,才能安装使用。

2、dex2jar
官方下载地址https://sourceforge.net/projects/dex2jar/

作用:
将APK直接解压后,目录下包含的一个classes.dex
文件反编译为classes-dex2jar.jar文件。

3、jd-gui.jar

作用:直接查看classes-dex2jar.jar文件。

网盘资源 完整工具压缩包下载
https://pan.baidu.com/s/1u9ZAIlnMMHJx9LWRO7OWcA


  1. apktool
    在这里插入图片描述
    在这里插入图片描述
    重新打包:

输入命令apktool b xxx

在这里插入图片描述在这里插入图片描述


  1. dex2jar
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

3、jd-gui
在这里插入图片描述在这里插入图片描述

C#逆向 反编译工具

dotPeek

官网地址:https://www.jetbrains.com/decompiler/

是 JetBrains 开发的一款.Net反编译工具,是.Net工具套件中的一个

  • 将 .NET 程序集反编译为 C#

dotPeek 是一款基于 ReSharper 捆绑反编译器的免费独立工具。

它可以可靠地将任意 .NET 程序集反编译为对等的 C# 或 IL 代码。

支持包括库 (.dll)、可执行文件 (.exe) 和 Windows 元数据文件 (.winmd) 在内的多种格式。

  • 将反编译代码导出至 Visual Studio 项目
    在反编译完程序集后,您可以将其另存为 Visual Studio 项目 (.csproj)。
    如果您需要从旧程序集恢复丢失的源代码,此举可以为您节省大量的时间。

在这里插入图片描述

  • 下载源代码并调试第三方代码
    dotPeek 可以根据 PDB 文件识别本地源代码,或者从 Microsoft Reference Source Center 或 SymbolSource 等源服务器中获取源代码。

dotPeek 还可以作为符号服务器运行,
为 Visual Studio 调试器提供调试程序集代码所需的信息。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实战小记

Android 反编译逆向调试与安全加固

安卓逆向 初识

#了解下 安卓端的 逆向学习框架#

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • ELF 程序逆向分析 ——可执行程序(功能)

001课 教学内容规划

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

学习流程

  • 汇编

在这里插入图片描述

  • 安卓逆向 软件分析(商业、工具、游戏)
  • 手游辅助 光是 游戏APP

综合基础

  • smail汇编 - java代码 逆向

  • ARM汇编 指令 (二进制文件 - 普通代码语言) IDA
    汇编 寄存器
    在这里插入图片描述

  • hook插件 开发

  • NDK工具
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 修改so dll 等 关键文件
    在这里插入图片描述

  • APK 防护 HOOK过掉
    改函数 返回值 该参数 打印参数

在这里插入图片描述

  • Dalvik虚拟机和ART虚拟机

在这里插入图片描述

C++游戏逆向 apk

在这里插入图片描述

#语言分析#

  • C# —— unity3d
  • Lua ——cocos2dx
  • c++ ——cocos2dx libgame.so

— /data/app-lib/包名/lib
找so 几百kb 就不是 c++(几个MB)(有cocos2d引擎在里面)

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • cocos2d
  • cpp ----->c++
    在这里插入图片描述在这里插入图片描述
  • arsc 资源文件
  • dex java代码
  • xml 配置文件
  • sdk manifest google

res 资源 配置 图片 动画 xml 音频
org linux
META-INF 签名文件夹
在这里插入图片描述
assets 资源
在这里插入图片描述在这里插入图片描述


在这里插入图片描述

  • this 上下文

在这里插入图片描述

  • 拿之前那个 恶搞程序 练手
  • 查看是否 代码混淆在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
  • 查看 类似有没有CN中文
    在这里插入图片描述在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到