程序基址,X64Dbg软件常用调试技巧查找系统函数调用位置执行到指定位置断点

https://docs.microsoft.com/en-us/cpp/build/reference/base-base-address?view=msvc-170

The /BASE option sets a base address for the program, overriding the default location for an .exe or DLL file. The default base address for an .exe file is 0x400000 for 32-bit images or 0x140000000 for 64-bit images. For a DLL, the default base address is 0x10000000 for 32-bit images or 0x180000000 for 64-bit images. On operating systems that do not support address space layout randomization (ASLR), or when the /DYNAMICBASE:NO option was set, the operating system first attempts to load a program at its specified or default base address. If sufficient space is not available there, the system relocates the program. To prevent relocation, use the /FIXED option.

/BASE选项设置程序的基址,覆盖.exe或DLL文件的默认位置。.exe文件的默认基址对于32位映像是0x400000,对于64位映像是0x140000000。对于DLL, 32位映像的默认基址是0x10000000, 64位映像的默认基址是0x180000000。在不支持地址空间布局随机化(ASLR)的操作系统上,或者设置/DYNAMICBASE:NO选项时,操作系统首先尝试在其指定的或默认的基地址加载程序。如果那里没有足够的空间可用,系统将重新定位程序。为了防止重新定位,使用/FIXED选项。

x64dbg 自带了功能比这好用的不得了啊

X64Dbg软件--常用调试技巧--查找系统函数调用位置--执行到指定位置断点

 分析现有二进制代码的结构,是Hook加入新功能的基础。如何在二进制代码海洋里快速定位,这个需要一定的技巧,本文主要整理来自网页提供的方法,方便大家快速上手。
  1.win64位虚拟内存地址
  X64 CPU 仅支持 64 位虚拟地址中的 48 位,这 48 位虚拟地址被运行在该 CPU 上的软件使用。 对于用户模式地址,64 位虚拟地址中的高 16 位总是被设置为 0x0;对于内核模式地址,总是设置为 0xF。这有效地将 X64 地址空间分开成2部分——用户模式地址的范围:0x00000000`00000000~0x0000FFFF`FFFFFFFF;内核模式地址的范围:0xFFFF0000`00000000~0xFFFFFFFF`FFFFFFFF。

  此内核虚拟地址范围总计为 256 TB,用于 Windows 上可访问的全部内核虚拟地址空间。然后,Windows 静态划分此空间成多个固定大小的虚拟地址范围(VA),每个范围被赋予特定用途。每个范围的起始和结束地址如下表所示:
在这里插入图片描述
  从X64Dbg的内存布局来看,如下图所示:
在这里插入图片描述
  如果需要修改PE文件,需要注意虚拟内存地址的范围,不要超过PE模块的内存地址范围。
  2.入口断点设置
  菜单栏–选项–设置–事件选项卡下,可以设置什么时候暂停,入口断点,就是进入代码段的第一个地址,就暂停下来。这个是可选头部AddressOfEntryPoint的内存位置。
在这里插入图片描述
  3.搜索导入表动态链接库函数
  点击面板符号,搜索user32.dll中的MessageBox函数,如下图所示:
在这里插入图片描述
  然后右键所选择的符号,加入断点,这样运行到此处内存时就停下来。然后运行到此位置,双击红色箭头位置文字,即可返回调用位置。如下图所示:
在这里插入图片描述
在这里插入图片描述
  如果一些文件有提示,就很容易通过这种方法,找到目标代码所在位置。双击RIP,回到当前指令位置:如下图哦所示:
在这里插入图片描述
  4.设置硬件断点和软件断点
  硬件断点:硬断点需要硬件寄存器提供支持,断点的数目受Embedded ICE中的Watchpoint数目的限制,但是可以在任何地方设置断点。
  软件断点:软件断点通过在运行起来的程序中设置特征值实现,其数目不受限制,但是一般情况下软件断点只能在可写的存储器的地址中设置(比如:RAM),而不能在ROM(比如:Flash)中设置。
  在X64Dbg中,右键即可设置断点。
  以上内容整理转载于网络,仅用于学习参考,如有侵权,第一时间联系删除。

VA与文件地址的换算公式

文件偏移地址=虚拟内存地址(VA)-装载基址(Image Base)-节偏移=RVA-节偏移
FileOffset = VA - ImageBase - (VOffset - ROffset)

这里写图片描述
文件虚拟偏移地址和文件物理偏移地址的计算公式如下:

①VaToFileOffset(虚拟地址转文件偏移地址)
如VA = 00401000 (虚拟地址)
ImageBase = 00400000 (基地址)
VRk = VOffset - ROffset = 00001000 - 00000400 = C00 (得出文件虚拟地址和文件物理址之间的VRk值)
FileOffset = VA - ImageBase - VRk = 00401000 - 00400000 - C00 = 400(文件物理地址的偏移地址)

如VA = 00401325,则:
FileOffset = VA - ImageBase - VRk = 00401325 - 00400000 - C00 = 725

②FileOffsetToVa(文件偏移地址转虚拟地址)
如FileOffset = 435(文件偏移地址)
VA = FileOffset + ImageBase + VRk = 435 + 00400000 + C00 = 00401035(虚拟地址)

=========================

工作机会(内部推荐):发送邮件至gaoyabing@126.com,看到会帮转内部HR。

邮件标题:X姓名X_X公司X_简历(如:张三_东方财富_简历),否则一律垃圾邮件!

公司信息:

  1. 1.东方财富|上海徐汇、南京|微信客户端查看职位(可自助提交信息,微信打开);
原文地址:https://www.cnblogs.com/Chary/p/15633846.html