【问题标题】:How to put a HASH bytes in a memory address with OllyDbg如何使用 OllyDbg 将 HASH 字节放入内存地址
【发布时间】:2018-05-16 17:55:55
【问题描述】:

我正在使用 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 是哈希地址。

我遇到的另一个问题是,当我启动程序时,黄色下划线的字节被修改(我猜它们必须是动态地址)所以我在该地址中写入的内容在程序启动时被修改,我该如何防止这种情况发生不会发生?

【问题讨论】:

    标签: assembly reverse-engineering ollydbg cracking


    【解决方案1】:

    顺便说一句,为什么需要复制 32 个字节? MD5 hashes are 16 bytes。你是在复制它的 ASCII 表示吗?

    MOV DWORD PTR DS:[EAX], 012B2C60

    你不能在不修改寄存器的情况下将内存复制到内存。此外,具有 32 位绝对地址的 8 条 dword mov 指令序列即使可编码也不会更短,因为每条指令都需要 012B2C60 地址。


    如果您可以破坏 XMM 或 YMM 寄存器(或将其保存/恢复到堆栈上),则可以使用 2 个 XMM SSE 加载/存储对或单个 AVX vmovdqu ymm4, [012B2C60] / @987654328 复制 32 个字节@

    如果执行此操作后程序的性能很重要,如果周围的代码已经在使用 AVX,请使用 AVX。否则,将 SSE movups 与 XMM 寄存器一起使用。 (Avoid AVX/SSE transition stalls or Skylake false dependencies)。

    除了 AVX 或 SSE,您可以通过推送 esi、edi 和 ecx 并使用 ecx=8 / rep movsd 然后恢复 regs 来实现 memcpy。 (对于 edi,您可以在 rep movsd 之前 xchg eax, edi,然后 sub edi, 32,然后再次 xchg。对于性能 IDK,如果这比 push/pop 与其他人一起保存/恢复它更好的话。

    或者,如果您不必保存寄存器,rep movsd 可以很好地减少代码大小以提高运行一次的效率。

    如果您执行此操作的代码仅在程序启动时运行一次,那么除非代码大小是一个真正的问题,否则使用即时数据而不是复制可能最容易。这对总空间效率来说并不是很好,因为每个数据的 dword 需要 3 个额外的字节:操作码、modrm 和 disp8(第一个使用裸 [eax] 寻址模式的除外。push 具有更好的即时数据密度,但只能压入堆栈。

    64 位模式的帮助很小; mov r64, imm64 为 10 个字节,但仅适用于寄存器目标。

    【讨论】:

    • 谢谢,是的,它是 ASCII 表示,我选择使用 XMM 注册表移动字节,这样我可以只用两个命令移动 32 个字节。但是我仍然有我在第一个出版物中提到的地址的问题......
    • @Manuel23:4 条指令:2 次加载/2 次存储。 (你想要的词是“寄存器”,而不是"registry")。
    • @Manuel23:我不明白你的地址有什么问题。要加载movdqu xmm0, [012B2C60][012B2C60+16],并且您已经拥有eax 中的地址,因此您可以使用[eax][eax+16] 寻址模式进行存储。
    • @Manuel23:哦,你的最后一段。这看起来像是在与预期不同的地址加载可执行文件的重定位/修复。您是否要替换一些在该位置具有地址的现有代码?
    • 是的,如果你看第一张图片,我已经将 NOP 设置为一个完整的函数,但是还有 8 个字节带有黄色下划线,这些字节在应用程序重新启动时被修改,破坏了我的修改
    【解决方案2】:
    • 将哈希码存储在代码段的底部。通常你可以在代码段中看到许多永不改变的空闲字节。他们是零。数据段用于您的全局变量,因此它们可能会改变,但代码段字节永远不会改变。
    • 使用memcpy 函数将这些字节复制到您的目标内存地址。

    【讨论】:

      猜你喜欢
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 2014-02-12
      • 1970-01-01
      相关资源
      最近更新 更多