簡體   English   中英

如何使用OllyDbg將HASH字節放入內存地址

[英]How to put a HASH bytes in a memory address with OllyDbg

我正在使用OllyDbg修改應用程序,但是我在匯編語言中還是一個新手,我需要在內存地址中放置MD5哈希,目標內存地址存儲在EAX 我該怎么做?

在此處輸入圖片說明

我需要插入的哈希是dba2d8bf7063faf1275e693661bc9651 我已經嘗試過以下方式:

MOV DWORD PTR DS:[EAX],32616264
MOV DWORD PTR DS:[EAX+4],66623864
MOV DWORD PTR DS:[EAX+8],33363037
MOV DWORD PTR DS:[EAX+12],31666166
MOV DWORD PTR DS:[EAX+16],65353732
MOV DWORD PTR DS:[EAX+20],36333936
MOV DWORD PTR DS:[EAX+24],63623136
MOV DWORD PTR DS:[EAX+28],31353639

但是我認為這是很長的,而且效率很低。 我還嘗試使用MOV指令將哈希保存在另一個地址中,並將其移動到需要的位置,但是我無法使其工作:

MOV DWORD PTR DS:[EAX], 012B2C60

其中012B2C60是哈希地址。

我遇到的另一個問題是,啟動程序時修改了帶下划線的黃色帶下划線的字節(我猜它們必須是動態地址),所以我在程序啟動時在該地址中寫的內容被修改了,如何防止這種情況發生?

在此處輸入圖片說明

順便說一句,為什么您需要復制32個字節? MD5哈希為16個字節 您是否正在復制它的ASCII表示形式?

MOV DWORD PTR DS:[EAX], 012B2C60

如果不修改寄存器,就無法將內存復制到內存中。 同樣,即使8位dword mov指令可編碼,它的序列也不會短一些,因為每條指令都需要012B2C60地址。


如果您可以破壞XMM或YMM寄存器(或將其保存/存儲在堆棧上),則可以使用2個XMM SSE加載/存儲對或單個AVX vmovdqu ymm4, [012B2C60] / vmovdqu [eax], ymm4復制32個字節vmovdqu [eax], ymm4

如果執行此操作后程序的性能很重要,請使用AVX(如果周圍的代碼已在使用AVX)。 否則,將SSE movups與XMM寄存器一起使用。 避免AVX / SSE轉換停頓或Skylake錯誤的依賴關系 )。

代替AVX或SSE,您可以通過推送esi,edi和ecx並使用ecx=8 / rep movsd然后恢復regs來實現memcpy。 (對於edi,您可以對rep movsd進行xchg eax, edi ,然后再次對ed ed, sub edi, 32 ,然后再次進行xchg 。對於性能IDK,如果它比push / pop更好地與其他文件一起保存/恢復,則可以。

或者,如果您不必保存寄存器,則rep movsd非常適合代碼大小,以提高運行效率。

如果執行此操作的代碼僅在程序啟動時運行一次,那么除非代碼大小是一個實際問題,否則使用即時數據而不是復制可能是最容易的。 它不是很大的總空間效率,因為數據的每一個DWORD需要3個額外的字節:操作碼,modrm,和DISP8(除了其使用裸的第一個[eax]尋址模式push具有用於即時數據更好的密度,但可以僅推入堆棧。

64位模式僅提供輕微幫助; mov r64, imm64是10個字節,但僅適用於寄存器目標。

  • 將您的哈希碼存儲在代碼段的底部。 通常,您可以在代碼段中看到許多不改變的可用字節。 他們是零。 數據段用於全局變量,因此它們可能會更改,但代碼段字節永遠不會更改。
  • 使用memcpy函數將這些字節復制到您的目標內存地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM