2017-12-02 200 views
0

我使用OllyDbg的修改應用程序,但我對彙編語言很新,我需要放置在一個內存地址的MD5哈希值,目的存儲器地址存儲在EAX。我該怎麼做?如何把一個HASH字節的內存地址與OllyDbg的

enter image description here

,我需要插入的哈希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是哈希地址。

發生在我身上的另一個問題是,當我啓動程序(我猜他們必須是動態地址)時,修改了帶黃色下劃線的字節,所以我在程序啓動時修改了該地址中寫入的內容,我該如何防止這發生了什麼?

enter image description here

回答

1

順便說一句,你爲什麼需要複製32個字節? MD5 hashes are 16 bytes。你是否複製它的ASCII表示?

MOV DWORD PTR DS:[EAX], 012B2C60

,而無需修改寄存器無法複製存儲器到存儲器。而且,即使可編碼,具有32位絕對地址的mov指令序列也不會更短,因爲每條指令都需要012B2C60地址。


如果可以揍的XMM或YMM寄存器(或保存/堆棧上恢復它),可以複製使用2 XMM SSE加載/存儲對,或單個AVX vmovdqu ymm4, [012B2C60]/vmovdqu [eax], ymm4 32個字節

如果性能事項程序後,你這樣做,如果周圍的代碼已經在使用AVX AVX使用。否則,使用帶有XMM寄存器的SSE movups。 (Avoid AVX/SSE transition stalls or Skylake false dependencies)。

相反AVX和SSE,你可以通過推ESI,EDI和ECX和使用ecx=8/rep movsd實現的memcpy,然後恢復暫存器。 (對於代表MOVSD,然後sub edi, 32,然後xchg再次之前EDI你可以xchg eax, edi。因爲如果這是比任何推/彈出更好地節省/它與其他一起恢復,雖然性能IDK。

或者,如果你不這樣做如果你的代碼只在程序啓動時運行一次,那麼除非代碼大小是真正的問題,否則它可能是最容易使用的立即數數據而不是複製。這對於總空間效率來說並不好,因爲每個數據字需要3個額外的字節:操作碼,模塊和disp8(除了第一個使用尋址模式的[eax]push對於直接數據具有更好的密度,但只能推。到堆棧

64位模式下僅略有幫助; mov r64, imm64爲10個字節,但只有一個目標寄存器工作

+0

謝謝,是的,它是一個ASCII表示,我選擇使用XMM註冊表移動字節,這樣我就可以只用兩個命令移動32個字節。但我仍然有地址的問題,我在第一次出版中提到... – Manuel23

+0

@ Manuel23:4指示:2加載/ 2商店。 (你想要的單詞是「寄存器」,而不是[「註冊表」](http://www.dictionary.com/browse/registry))。 –

+0

@ Manuel23:我不明白你的地址有什麼問題。 'movdqu xmm0,[012B2C60]'或'[012B2C60 + 16]'加載,並且您已經在'eax'中有地址,所以您可以使用'[eax]'和'[eax + 16]'尋址模式進行存儲。 –

0
  • 店的哈希碼在你的代碼段的底部,通常你可以。在代碼段中看到很多空閒的字節,它們永遠不會改變,它們是零數據段是用於你的全局變量的,所以它們可能會改變,但代碼段字節不會改變
  • 使用memcpy函數將這些字節複製到您的目標內存地址。