天行健 发表于 2025-1-1 22:45:51

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]
查看完整版本: Win32汇编学习笔记12.总结