下图是x86架构函数调用堆栈布局
1、 CPU 汇编代码窗口2、 Symbols 模块列表窗口3、 Dump1-dump5 数据查看窗口4、 寄存器窗口5、 堆栈窗口6、 breakPoints 断点列表窗口
1、 Ctrl + G 转到地址,计算表达式的值2、 H 高亮显示(使用方法:按下H后,会出现一个红框,双击要高亮的显示的文字,就可以高亮显示)3、 F4 运行到当前选中的行4、 F2 下断点5、 F7 单步步入6、 F8 单步步过7、 F9 运行8、 CTRL + F9 执行到本函数的返回处,也就是遇到本函数RET指令停下9、 * 转到RIP指向地址,也就是但钱汇编指令所在地址10、 ; 给当前选中的行添加注释11、 查找常量或字符串汇编窗口右击->选择“当前区域”或“当前模块”或“所有模块”-> “常数”或者字符串
1、pdb符号设置2、入口断点设置菜单栏–选项–设置–事件选项卡下,可以设置什么时候暂停,入口断点,就是进入代码段的第一个地址,就暂停下来。这个是可选头部AddressOfEntryPoint的内存位置。3、下载符号并下断点右击要调试的程序,选择“用x64dbg调试”或者先打开x64dbg,选择文件->打开要调试的程序很多情况下,x64dbg不会自动加载符号文件,这时候就需要我们手动加载了,右击要下载pdb的模块,例如鼠标右击kernelbase.dll,再右键菜单中选中“下载此模块的符号信息”。对搜索到的函数GetModuleFileNameA的入口处下断点。按下F9,将运行到GetModuleFileNameA的入口处,此时GetModuleFileNameA函数的任何一条指令都没有执行,因为64位程序的前四个参数用RCX,RDX,R8,R9传递,所以RCX,RDX ,R8分别对应GetModuleFileNameA的第一个、第二个、第三个参数,我们之关心第二个参数路径信息lpFilename,它对应RDX, 此时查看RDX的值。双击右下角调用堆栈的红色文本。即可返回到函数GetModuleFileNameA的调用处。只是返回到调用处,便于用户查看何处调用,并不是程序执行到调用处。返回到GetModuleFileNameA的调用出后,选中GetModuleFileNameA的下一行,按下F2,下断点。因为RDX是易变寄存器,但仅仅用来传递参数,函数执行完后,它的值可能就发生了变化,所以GetModuleFileNameA的第二个参数,是个指针,必须是刚中断到GetModuleFileNameA到时,GetModuleFileNameA的任何汇编指令尚未执行时,RDX寄存器的值,参看图8程序运行到GetModuleFileNameA的下一行处时,GetModuleFileNameA的汇编指令执行完毕了,第二个参数(对应图8的RDX值)鼠标选中任何一个内存窗口(鼠标焦点必须在内存窗口中),按下快捷键CTRL + G,输入图8的RDX值,如果鼠标焦点在反汇编窗口中,按下CTRL + G,跳转到代码段指令地址处。焦点在内存窗口处,跳转的是内存地址处。 也可以通过以下插件查看内存,选择 插件/Scylla 打开插件窗口,选择 File/ Dump memory
1)测试源代码为下面的代码,用vs2017编译为x64 release版本。
2)用x64dbg调试生成exe程序,修改某一行的汇编代码(按下快捷键“空格键”)3)修改后保存exe文件,右击汇编窗口,选择 “补丁”
1、鼠标选中需要修改的汇编代码(可选中多行),选择“二进制” -> “编辑”(或者使用快捷键Ctrl + E)2、修改十六进制代码后,点击确定。3、修改十六进制代码后,按下快捷键CTRL+ P,或者右击,选择“补丁”,弹出“补丁对话框”4、选择“修改补丁”按钮,另存为
切换到"CPU"标签页,右击选择“二进制”=》“填充”(或者直接按下快捷键F)如果想把某几行用用nop空指令填充,选中要填充的行(可多行)可以选择“二进制”=》“用NOP填充”(或者快捷键Ctrl + 9)
1、观察程序程序有两个文本框、按钮。为了学习消息断点,这次将会从使用消息断点的角度来分析程序。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)