【发布时间】:2019-08-06 05:01:26
【问题描述】:
我需要编写一些程序集,将其写入另一个进程的地址空间(已经在运行)。
基本上我想要做的是每次调用这个程序集时,它会将堆栈中的值与预定义的值进行比较,然后如果它与预定义的值匹配,我想调用一个指针将很难的函数编码到程序集中,如果没有,我希望程序集基本上什么都不做,所以返回。
到目前为止,我有以下内容(只是为了简单起见,只发布 x86 的 sn-p)
mov eax, [esp+0x04] ; this is the value from the stack
cmp eax, 0x01 ; this is the predefined value I am comparing to
如上所述,如果在这种情况下,eax 中的值与 0x01 匹配,我希望它跳转到一个函数(预定义指针,因此可以硬编码到程序集中),否则我希望子例程返回。问题是我不知道如何在不使用标签的情况下执行此操作,我不相信我将能够使用它,因为这将在另一个进程的上下文中执行,因此地址不会从 0 开始(对于我将要调用的程序集。)
我听说你可以做一个相对跳跃,但我在实现这些方面遇到了麻烦。
有人可以告诉我如何使用相对跳转或其他方法来实现这一点吗?
【问题讨论】:
-
基本上是Write a jump command to a x86-64 binary file 的副本,它显示了相对跳转的编码方式。您需要知道源和目标地址,或者至少是相对位移。仅知道绝对目标是没有用的(或者您必须使用效率较低的跳过
mov eax, imm32/jmp eax) -
如何确定要跳转的地址?如果你知道地址,你可以将它加载到 eax 并执行“jmp eax”。
-
@prl:似乎效率低下。您将其注入到一个已经运行的进程中,因此在复制它时,您肯定有可用的源地址和目标地址。例如使用
db 0x0f, 0x84;branch_offset: dd 0编码一个带有相对位移标签的jz rel32,并在注入时更新位移。 (How does $ work in NASM, exactly? 展示了更多关于手动编码相关分支的信息)。