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(虛擬地址)