Win32汇编学习笔记12.总结
### 定位call找的是话一般往外层去找, 先找数据,找到数据以后下访问断点,下了断点之后去找调用的call,到一个感觉像的,然后改改参数看看能不能达到自己想法要的效果,从而确定是不是
### 扫雷边扫雪定位关键点
扫雷变扫雪需要定位他的地图(内部存储数据的的二维数组),然后考虑程序什么时候会访问这个数组, 一般绘图的时候回访问,初始化的时候也会访问,也可以通过CE去定位,例如改变地图大小,搜数据位置,搜到之后可以下访问断点,因为地图初始化时候一定要拿地图的宽和高,然后去找二维数组,定位二维数组方法很简单,就看有几个层嵌套循环,二维数组就2个,还有一种就是直接找绘图
!(./notesimg/1654523416385-704bd46c-9d6b-4c11-80ef-21a9121f61bb.png)
### 利用异常加解密代码
编译的时候把自己的代码替换掉,换成自己加密后的数据,然后再异常里进行解密
### windbg
windbug 本质是命令行工具,他的命令基本和 debug 是一致的 ,只需要注意2点
1. 符号配置:加载符号
2. 符号解析: 如dt等
他的命令分2套,一套内核用的,一套3环用的
2对四条指令 dt _peb !peb dt _teb !teb
!(./notesimg/1654524163578-b4121321-265a-4335-a7ac-7e9d3653a2d0.png)
.reload/f强制所有模块重新加载
!(./notesimg/1654524386186-226037a8-2e78-4e7e-ba8d-cac7c0d5bf66.png)
有时候dt _peb没有东西 ,那是因为模块和符号没有对应 这种情况多出现于 windbg 下载过其他系统的符号,处理方法是把符号路径改一下,让他重新下载,如果要用到之前的符号,再把路径换回去,不同的版本一般会改保存符号的文件夹不同的名字,不放在一块,因为比较乱
vs修改符号
!(./notesimg/1654524842708-2d697283-10d3-459a-8e71-97092cf806b6.png)
### 异常
异常主要要知道异常的派发流程
#### 非调试状态
!(./notesimg/1654525408699-4c20af4e-d8b6-4ec6-a9ba-80bf155c72e5.png)
#### 调试状态
!(./notesimg/1654525441595-4eb32bd7-b14c-4770-85ed-8900e1fdd399.png)
注意: 上面的流程如果中间处理了,那就没有后面的事了,是通过返回值告诉有没有处理
```
2次调试器的的派发是通过标志区分的
```
除非对抗否则异常是方便我们体面的退出程序
SEH是一个链表,他会沿着链表往上回溯,要注意的是安装和卸载
## APIHOOK重入功能
apihook 拦截api的调用流程,拦截到自己这里
注意点:
1. 偏移的计算
2. 寄存器环境变量要保存
3. APIHOOK重入功能
字节的函数没有预留的三行,想要hook自己写的函数——见招拆招(针对不同的函数去写跳和恢复),如果想要通用,就得上反汇编引擎
### x32dbg跟踪功能
以找植物大战僵选只为界面为例
首先通过 增减值物数量 在 CE种找到植物数量地址
!(./notesimg/1654529112534-762d8420-a1ba-41a4-8a8d-263b1951cb56.png)
再到x32dbg 内存中转到该地址
!(./notesimg/1654529224586-587ec7b4-555c-4063-a3a8-59ac59380b47.png)
!(./notesimg/1654529334556-2eed5f63-a509-4710-ab13-5087c1ac1e19.png)
这样再去选植物就可以断下来了
!(./notesimg/1654529446956-13bb0c0b-f4b6-4e82-b313-131bcc91d910.png)
然后网上找call ,因为肯定会有植物种类这个参数
!(./notesimg/1654529559284-a7139961-ea92-495a-b5ce-72529c281b9b.png)
!(./notesimg/1654529587934-a1dc6375-8d6e-4df7-8abc-d29c1fd62d57.png)
!(./notesimg/1654529729209-6fe99460-5731-4fe4-b310-21ed537503a3.png)
!(./notesimg/1654530112846-1f42f0ac-2db3-4724-a071-1f1b0afe5bff.png)
查看分支:
!(./notesimg/1654530356310-4d4c824e-4536-4f5c-ad5e-a99b00225cbf.png)
#### 跟踪
!(./notesimg/1654530482913-5635c55a-0cc0-4b18-bd1e-1f58edf1c90e.png)
!(./notesimg/1654530926968-e6f996de-4720-4fc8-bc47-1364e368bab5.png)
[https://x64dbg.com](https://x64dbg.com/)
!(./notesimg/1654531079567-6f78668e-2e72-4ab8-a0aa-a4e061293b6f.png)
!(./notesimg/1654531161830-6b9d0ab7-a34c-48d7-8498-0c0cc3c879f0.png)
在分别选择高亮 和 不高亮的 分别追踪,对比2个文本 内容,查看分支条件
!(./notesimg/1654531282028-652dc6a8-a802-4297-bd46-c1589dce4ff3.png)
再跳转到地址查看 判断条件以及逻辑
### 花指令
欺骗反调试器
正常代码
```
push ebp
jmp LABEL0
LABEL0:
mov ebp, esp
jmp LABEL1
LABEL1:
sub esp, 5560
```
花指令代码
```
push ebp
jmp LABEL0
db 0e9h
LABEL0:
mov ebp, esp
jmp LABEL1
db 0e9h
db 00
db 01
db 00
db 00
LABEL1:
sub esp, 5560
```
在调试器中看
!(./notesimg/1654532924904-6381ec79-7db9-4282-9c60-0c5fe8cb5059.png)
!(./notesimg/1654533204439-86dd4fee-c7d5-4a54-8831-ee492e142746.png)
因为反汇编引擎是通过内存读数据 ,先拿操作码再拿操作数 ,所以读取到 db 0e9h会转成 jmp,后面四个字节当做地址 ,但并不影响软件运行时, cpu执行是碰到跳转 就直接跳,跳转中间的代码就直接忽略了,凡事调试器需要反汇编出来
花指令
```
push ebp
jmp LABEL0
db 0e9h
LABEL0:
mov ebp, esp
jmp LABEL1
db 0e9h
db 00
db 01
db 00
LABEL1:
sub esp, 5560
```
!(./notesimg/1654533525229-5e5e2c37-a63c-4c57-9289-c6b192d76cb8.png)
上面代码 到 db 0e9h 后反汇编成 jmp , jmp 后面需要四个字节的地址 , 从而导致后面反汇编代码错误(有一个字节被取走了,导致后面解析指令出错)
去除花指令方法 : 碰到跳转直接跳 , 忽略中间指令
页:
[1]