我正在使用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
是哈希地址。
发生在我身上的另一个问题是,当我启动程序时,黄色下划线字节被修改(我猜它们必须是动态地址)所以我在该地址写入的内容在程序启动时被修改,我该如何防止这种情况从发生?
答案 0 :(得分:1)
MOV DWORD PTR DS:[EAX], 012B2C60
如果不修改寄存器,则无法将内存复制到内存。此外,具有32位绝对地址的8 dword
mov指令序列即使可编码也不会更短,因为每条指令都需要012B2C60
地址。
如果您可以破坏XMM或YMM寄存器(或在堆栈上保存/恢复它),您可以使用2个XMM SSE加载/存储对或单个 AVX vmovdqu ymm4, [012B2C60]
/复制32个字节vmovdqu [eax], ymm4
强>
如果在执行此操作后程序中的性能很重要,请在周围代码已使用AVX时使用AVX。否则使用带有XMM寄存器的SSE movups
。 (Avoid AVX/SSE transition stalls or Skylake false dependencies)。
您可以通过推送esi,edi和ecx并使用ecx=8
/ rep movsd
,然后恢复注册来实现memcpy,而不是AVX或SSE。 (对于edi,您可以在重新播放之前xchg eax, edi
,然后再sub edi, 32
,然后再次xchg
。对于性能IDK,如果这比推/弹更好地保存/恢复它与其他人一样,虽然。
或者,如果您不必保存寄存器,rep movsd
对于一次运行效率的代码大小是很好的。
如果您的代码只在程序启动时运行一次,那么除非代码大小是真正的问题,否则最简单的方法是使用立即数据而不是复制。对于总空间效率来说并不是很好,因为每个dword数据需要3个额外字节:opcode,modrm和disp8(第一个使用裸[eax]
寻址模式除外。push
具有更好的密度对于即时数据,但只能推入堆栈。
64位模式只能稍微帮助; mov r64, imm64
是10个字节,但仅适用于寄存器目的地。
答案 1 :(得分:0)
memcpy
函数将这些字节复制到目标内存地址。