x64dbg反汇编技术入门学习笔记
EIP
- EIP是程序下一次要运行地方
寄存器
- 临时存放数据,按照Intel规定去存放
window API
- 微软提供的,用户可以操作系统的一些接口,以函数的形式体现
杀软是如何查杀恶意的
- 镜像地址 + 实际地址 = 实际运行后代码的地址
- 查外部调用段就可以定位到
.rdata
call的调用
- 我们现在需要手动调用这个删除的
- 我们找一片空白的内存区域
- 填入内容
- 我们改为删除123.txt文件
- 替换为另一端内存地址
if语句、eax寄存器与函数返回值的关系、流程图
eax存放函数的返回值
if在汇编中被编译为jne,可以通过右键流程图来查看流程
内存布局和补丁
- 我们可以通过内存布局来查找标题名称
填入”把我改了”
注意,有时候utf-8或者ascii无法搜索到,就需要点击代码页进行切换
- 在引用当中可以看到我们查找的结果
- 我们在内存窗口中查看看看
- 我们在内存窗口切换为GBK,软件估计是用GBK写的,这里我用UTF-8乱码了
- 修改内容
- 选择”修补文件”
- 这边随便弄了个名字
jmp指令
- 强制更改代码的执行流程
标志寄存器
- ZF
- SF
- OF
- 等等
常用无条件跳转
jmp
call
- 执行函数
ret
- 函数体不可或缺的一部分
- 无条件从函数体内部跳出来
无条件干掉一些不顺眼的函数
按钮关闭
- 我们找下按钮的提示字符串
- 找到了
- 进入此函数
- 将第一行代码修改为
ret
即可
植物大战僵尸特殊
我们附加下窗口
- 我们切换下
1 | ret8这个数字和堆栈相关,和堆栈平衡相关,函数相关,跟call相关 |
完整的call
- 有头
- push ebp
- 有尾
- pop ebp
EBP和ESP
EBP指针寄存器(extended stack pointer)
- 内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
- 始终指向堆栈最上面的数据
ESP基址指针寄存器(extended base pointer)
- 内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部
只要经过函数头,ESP就会等于EBP
1
2push ebp
mov ebp,esp
1 | 一个程序实际上是由很多个函数组成的,主函数去调用A函数,A函数调用B函数,B函数调用完是一定要返回的, |
植物大战僵尸跳过暂停
https://wwi.lanzoub.com/b0d40znvc
- 密码:1fws
我们最终定位到了暂停函数为下面的
- 我们先按照正常条件来走下,我们选择步过而不是步进,会发现会进入执行
- 所以我们不让他进入执行,改为jmp即可
- 发现游戏不暂停了
函数调用约定与参数顺序
__cdecl是C/C++的默认调用约定,也就是说,游戏/软件(包括我们自己写的)都是用这个约定
__stdcall是WindowsAPI默认调用约定,微软的WINAPI都是这个调用约定
如何理解?这种约定是为了配合函数调用出现的,函数调用必须按照这个规则,就像万事万物都有它的规则一样:太阳东升西落,夜晚繁星闪烁
函数在这种规则下造成的现象:参数顺序
__cdecl入栈顺序:从右到左
__stdcall入栈顺序:也是从右到左
1 | 比如有一个函数 |
函数调用约定与堆栈平衡、参数个数计算
- 堆栈平衡
- 简单理解为吃了多少,给我吐出来多少,
- 注意下: 用的都是十六进制,可以用过堆栈平衡来计算参数的个数
EBP寻址
- 只要是单参数函数,都是最先
push ecx
MOV指令
加减乘除
- 其他略
cmp eax,3
等同于sub eax 3
,然后再根据结果去改变标志位- 下面图片我随便截图的
push pop指令常用操作
条件转移
- 图片关系也就是条件上方的语句是否满足关系所示
1 | cmp eax,3 |
浮点寄存器、浮点单参数函数
Push ecx
Xmm
反汇编没有办法直接地址向地址传递,必须得通过寄存器
浮点寄存器局部变量
FPU寄存器与常用浮点运算、浮点栈-108
知识点
已到达系统断点
- 系统的断点,系统领空
程序会分段,可以通过PEID来查看分段的
- 代码段
PEID查看的段
- 查外部调用段就可以定位到
.rdata
回到最初的点
- 减号’-‘
带参数的call与远程调用
- 观察,特点,push,总之,有参数,就需要push,换句话说,call的参数需要push
- 或者说,函数的参数需要push指令
- push:压入,压了就能用了
- 格式:
1 | push 参数 |
远程调用
- 通过注入的方式调用call
但凡是push地址的,都是已经赋值了的
但凡是push寄存器的,都是在前面赋值的,就得找前面赋值了什么
更改断点
跳转颜色
- 一般情况下
- 蓝色为跳转成立,红色为跳转不成立
- 对于无条件跳转,蓝色线条意味着一定会跳转。
- 对于条件跳转,需查看跳转条件是否满足。
- 对于函数调用,蓝色线条表示会跳转到函数并返回。
回车可以临时进入函数体内部
只要经过函数头,ESP就会等于EBP
- EBP指针寄存器(extended stack pointer)
- 内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
- 始终指向堆栈最上面的数据
- ESP基址指针寄存器(extended base pointer)
- 内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部
单双局部变量的函数分析,局部变量的生命周期
- 函数内部的局部变量在汇编中怎么看呢?
- 一个局部变量创建方法如下图
- 看到
push ecx move
就是一个参数
- 看到
- 二个或多个局部变量方法
sub esp,8
,8为十六进制,这句话代表要开辟的新空间大小
al,ah
- al最右边的数
- ah
在线汇编网站
多个参数不一定有多个寄存器
- 可能一定参数对应一个寄存器,也可能多个参数对应一个寄存器,总之不是一一对应的关系
nop是什么都不干
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 梦洁小站-属于你我的小天地!
评论