X64dbg使用技巧

发布于:2023-07-04 ⋅ 阅读:(392) ⋅ 点赞:(0)

X64dbg使用技巧

前言:各类杂项x64dbg的使用技巧

示例1:进出call

PS:在选择一条call指令时,使用enter键进入call指令对应的函数内部;在call指令内部时使用-减号键退出该call。

示例2:条件断点

PS:若一条指令被多种情况触发,但只需追踪其中一种情况下的状况,可在该指令处设置条件断点。如设置rax>10,则当执行至该指令时,只当rax寄存器中的值大于10时中断。

示例3:忽视异常

PS:在x64dbg的选项设置中的异常选项卡内,可通过'忽略范围'按钮设置忽略异常号为某个区间的异常,在调试的程序频繁触发特定异常导致调试难以进行的情况下十分有用。

示例4:判断call的参数1

PS:在进入一个call内部后,找到形如sub rsp,xxx(将堆栈空出一块空间,此后用于存放call内可能用到的各种局部变量)的指令,此指令意为开辟内存空间。在此句之后出现的形如mov xxx,rcx/rax/r8/r9或lea xxx,[rcx/rax/r8/r9]等将可作为参数的寄存器中的值赋给另一不可作为参数的寄存器(两种寄存器的区分见反汇编笔记——64位机寄存器)的语句可用以推断该call的参数信息;如上图的sub rsp,rax之后出现的mov r14,r8、movups xmm0,xmmword ptr [r9]、mov esi,edx、mov r12,rcx四条语句,可推断出当前call的参数未r8、r9、rdx、rcx。

示例5:判断call的参数2

PS:在一个call的外部,观察该call与上一个call之间的代码,那些被赋值的,可作为call的参数的寄存器即为该call的参数。如上图rcx、r9、r8、rdx都被赋值了,它们都是call 13FB684E0的参数。

示例6:获取特征码

PS:选中一条或多条代码之后shift+c:复制特征码(或右键二进制——》复制)此后进入符号确定其所在模块,右键搜索特征码确保该特征码只匹配一次,则该特征码可唯一确定一块内存区域

示例7:键消息以及键代码

 

PS:在按键相关的call的调用过程中,call的参数中一定会包含一份键消息和一份键代码,前者用于标识按钮状态,后者用于标识按键类别。因此若需在程序中寻找按键相关功能的call,可由其参数中是否包含以上两者判断(上述键代码只示例部分,更多相关代码自行搜索)

示例8:堆栈结构体

PS:对于类似 lea rcx qword ptr [rbp-20]的将标识堆栈地址的寄存器的值存入rcx作为call参数的情况,说明rcx标识的为一个堆栈结构体。即有大量数据保存在堆栈内以rcx标识的部分里。

示例9:特征码匹配规则

mov [eax+4],ebx                          可以(偏移+4较小)
mov [eax+431],ebx                      不可以(中间+431偏移太大,不适合作为特征码)
mov [eax+4],10000                      不可以(操作数过大)
je 0x321234                                 可以(注:小跳转可以,但大跳转不能作为特征码)
call 0x0031731C                          不可以(一般call是函数调用,由于每次装入地址不确定,所以不能作为特征码)
push                                             可以

PS:这里说明一下,像是call 或者大跳转,一般而言我们不能用它作为特征码字段,如果非要作为特征码,当然也可以,只是在某些情况下会出现错误!