2017-12-02 215 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函数将这些字节复制到您的目标内存地址。