[英]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.