提问人:iegrm 提问时间:10/13/2023 最后编辑:iegrm 更新时间:10/13/2023 访问量:67
将 64 位 asm 转换为 32 位?
Converting 64bit asm to 32bit?
问:
我正在做一个项目,该项目涉及将 dll 加载到具有 64 位和 32 位版本的应用程序中。我无权访问此应用程序的源代码,我正在将指令注入代码洞穴以使用导入的 LoadLibrary,并且加载的 dll 将钩接函数调用。
对于 64 位版本,我执行以下操作:
JMP codecave (this is at entry, replaces func that I call in codecave lbl to return)
在 codecave 中:
unicode u"example.dll"
PUSH EAX
MOV RCX, [dllstr] (address of unicode string for name of dll)
CALL qword ptr [loadlibraryw] (address of LoadLibraryW)
POP EAX
JMP entryfunc (return to original code)
这很好用!
在应用程序的 32 位版本中,改用 LoadLibraryA,因此我的字符串不再是 unicode:
ds "example.dll"
JMP 到 codecave 使用相同的入口点,但替换了 func,并且 codecave 位置类似,位于可执行 .text 部分的末尾。
我不确定的是要在 32 位中使用哪些寄存器。从函数签名来看,LoadLibraryA 似乎仍在使用 EAX 进行存储,因此我认为我仍然需要推送/弹出 EAX。
我不确定将字符串移动到哪里,从我看到的示例来看,我似乎应该在没有寄存器的情况下使用PUSH,例如:
PUSH EAX
PUSH dllstr
CALL dword ptr [loadlibrarya]
POP EAX
JMP entryfunc
但这会导致应用程序崩溃。我怀疑是因为我正在更改这里的堆栈,但我需要对此进行澄清,任何帮助将不胜感激。
答: 暂无答案
评论
PUSH EAX
不是有效的 64 位指令。(/只有 16 位或 64 位操作数大小)。 不是有效的 32 位指令;普通通话只有 32 位。(你不想要一个远距离调用,那将是一个 48 位操作数,也不是 qword)。所以 IDK 你实际注入了什么指令,但不是这些。push
pop
CALL qword ptr [loadlibrarya]
dword ptr
[loadlibraryw]
lea rcx, [unicode]
dllstr: dq unicode
[foo]
call [loadlibraryw]