如何把一个HASH字节的内存地址与OllyDbg的
我使用OllyDbg的修改应用程序,但我对汇编语言很新,我需要放置在一个内存地址的MD5哈希值,目的存储器地址存储在EAX
。我该怎么做?如何把一个HASH字节的内存地址与OllyDbg的
,我需要插入的哈希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 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个字节,但只有一个目标寄存器工作
回答:
- 店的哈希码在你的代码段的底部,通常你可以。在代码段中看到很多空闲的字节,它们永远不会改变,它们是零数据段是用于你的全局变量的,所以它们可能会改变,但代码段字节不会改变
- 使用
memcpy
函数将这些字节复制到您的目标内存地址。
以上是 如何把一个HASH字节的内存地址与OllyDbg的 的全部内容, 来源链接: utcz.com/qa/258724.html