基础篇:
汇编指令的移动方向
CPU汇编
基本的汇编指令:
寄存器介绍:
X86寄存器:
第一篇 IDA简介
反汇编的含义:反汇编以汇编语言甚至机器语言伟输入,输出高级语言的过程 。编译属于对多对的操作,程序可以通过不同的方式转换成汇编语言,而机器语言也可以通过不同的方式转换成源程序。也就说说编译一个文件,并立即反编译我们不一定得到与之前完全相同源文件。
反汇编的意义: 分析病毒木马文件,恶意软件, 分析源软件的漏洞,分析源软件的互操作性,分析编译器生成的代码,等等
动态分析和静态分析: 动态分析是在严格控制沙盒中执行恶意软件,使用系统检测所有行为。 静态分析通过分析源代码分析程序的行为。
线性扫描反汇编:优点是能够全部覆盖程序的所有代码,缺点没有考虑代买中可能混有的数据。
GNU 调试器(Gdb)微软公司的WinDbg 调试器 以及 objdump使用工具凡湖边殷勤军采用线性扫描算法。
递归下降反汇编:递归下降算法抢到控制流的概念,根据指令对CPU指令指针的影响分成下面几类:
顺序指令: 顺序指令将执行权传递给紧随其后的下一条指令,顺序指令的列子包括简单的算术指令,and ;寄存器与内存之间的传输指令, mov; 栈操作指令 push pop 这些指令反汇编以县城扫描啊啊啊方式进行。
条件分支指令:提供两条执行路径,如果条件为真,则执行分支,并修改指令指针,指向目标指针。条件为假的,则继续执行线性模式指令,并使用线性扫描方法反汇编下一条指令。
无条件的分支指令:不遵循线性流模式,
函数调用指令
IDA PRO功能讲
本质上讲IDA PRO属于递归下降反汇编器
段窗口对应的命令行功能更加 obj dump (-h) readlf (-s) dumpbin (/HEADERS )
IDA利用一个庞大的知识课只识别代码块,
IDA PRO学习需要掌握的编程语言,低级编程语言,
栈帧---程序运行时战中分配的内存块,专门用于特定的函数调用,
调试的时候需要用的一些快捷键:
F2:设置断点。
F5: 一键反汇编功能
esc: 回退键 能够回退到上一步操作的视图(只有在汇编窗口才可以使用,如果是在其他窗口,按下esc 会退出窗口)
shift+ F12 可以打开string窗口 ,一键找出字符串,右击 setup还可以对窗口属性进行设置
ctrl+W 保存IDA数据库
Ctrl +S 选择某个数据段 直接进行跳转
Ctrl + 鼠标滚 调试视图大小
x: 对着某个函数、变量按该快捷键,可以查看它的交叉引用 (这里可能电脑型号不同需要按住FN键等 配合使用)
g: 直接跳转到某个地址
n: 更改变量的名称
y: 更改变量的类型
/ : 在反编译后伪代码的界面中写下注释
: 在反编译后伪代码的界面中隐藏/显示变量和函数的类型描述,有时候变量特别多的时候隐藏掉类型描述看起来会轻松很多在反汇编后的界面中写下注释
ctrl+shift+w:拍摄IDA快照
u:undefine,取消定义函数、代码、数据的定义
Shift+ F4 :打开名称窗口 : 或者在菜单中 View ---Open--subView--Names
在Names windws 窗口上,可以显示 Text view 或者 Graph View 之间切换。
如果是机器语言,则以指令为单位设置断点,如果是高级语言,则以源代码的行为单位设置断点
每执行一条指令都中断一次叫做单步跳入或跳出,通过单步运行功能个,可以以一条指令或者一行代码为单位逐个运行程序中的逻辑:
跳入:------------调用函数时进入函数内部
跳出:------------用函数时不仅如此函数内部,二是将函数调用作为一条指令来执行
第二章 OllDbg 简介
打开一个新的可执行程序 (F3)
设置断点位置(F2)
添加注释 使用 ;
添加标签 使用 shift + ;
执行到光标的位置 (F4),直接转到要调试的地址
重新运行当前调试的程序 (Ctrl+F2)
当前调试的程序 (Alt+F2)
运行选定的程序进行调试 (F9)
暂时停止被调试程序的执行 (F12)
单步进入被调试程序的 Call 中 (F7)
步过被调试程序的 Call (F8)
跟入被调试程序的 Call 中 (Ctrl+F11)
跟踪时跳过被调试程序的 Call (Ctrl+F12)
执行直到返回 (Ctrl+F9)
显示记录窗口 (Alt+L)
显示模块窗口 (Alt+E)
显示内存窗口 (Alt+M)
显示 CPU 窗口 (Alt+C)
显示补丁窗口 (Ctrl+P)
显示呼叫堆栈 (Alt+K)
显示断点窗口 (Alt+B) 调出断点位置
打开调试选项窗口 (Alt+O)如果中途程序运行停止,地址栏中当前执行点(寄存器指针EIP 指向的地方)会标记黑色。
第三章 XDBG介绍
F2:设置断点。(可以简单理解为暂停)
F4:运行到光标处
F7:单步步入。(遇到call指令,进入call函数的实现处继续执行汇编指令)
F8:单步步过。(遇到call指令,执行call函数,之后接着执行call指令的下一条指令)
F9:运行程序(如果没有碰到断点,程序会一直执行到结束。)
Ctrl+F9: 执行到函数返回处,用于跳出函数实现
Alt+F9:执行到用户代码,用于快速跳出系统函数
Ctrl+G:输入十六进制地址,快速定位到该地址处
第四章 加壳判断 与去保护
没有加密
UPX解密类型
加壳分成两种类型:
1、压缩壳: 压缩的目的是减少程序体积 比方 ASPack UPX PECompact等
2、加密壳: 加密是为了防止程序被反编译 反汇编 跟踪和调试 比如 ASProtect Armadillo EXECrypto Themida WMProtect .
加壳的目的是反逆向汇编
加密壳的基本思路:
- 将原本程序的 PE 相关代码复制到补丁(壳)中;
- 加密程序;
- 修改程序入口点,使得程序启动后会先运行补丁程序;
- 补丁程序会根据先前复制的相关代码对程序进行解密和还原,使得程序能够正常运行;
- 还原后再返回执行原本的入口点。