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(虚拟地址)