【问题标题】:x86 assembly call label at an address from string来自字符串的地址处的 x86 程序集调用标签
【发布时间】:2015-07-29 02:05:55
【问题描述】:

我不确定 x86 程序集是否可以实现这样的事情,但我可以

mov eax, string
call string

my_funct:
mov ebx, hi_msg
call puts32 ;say hi
ret

string db 'my_funct', 0
hi_msg db 'Hi', 0

我知道我想在地址处调用标签并且我给它一个字符串但是我可以将字符串转换为地址吗?如果是这样怎么办?当我尝试任何关于我可能如何做到这一点的建议时,似乎是三重错误?


感谢 superultranova、scott Hunter 和其他发帖但被删除的人,我认为 esm 是您的回复和帮助。我想出了

pop ebx ;num from stub
mov al, 2
mul bx ; mul 2 to correct offset (our funct_ptr are word not byte)
mov ebx, eax
mov eax, [funct_ptr + ebx]
call eax

funct00:
nop
ret

funct01:
mov ebx, hi_msg
call puts32 ;say hi
ret

funct02:
;not implemented
ret

funct_ptr:
dw funct00, funct01, funct02, 0

【问题讨论】:

  • 你不能做你想做的事,它只是在 x86 中不起作用,因为编译后的二进制文件中不存在标签作为可以调用的东西。如果您能解释为什么要这样做,以及出于什么目的,也许还有其他选择。
  • 我正在设计一个存根函数,它将东西压入堆栈,其中一项是 0 到 255 之间的数字。另一个函数(我在上面尝试做的事情)使用这个数字并进一步修改字符串例如。 'funct00' 到 'funct1A' 并从一组标记为 funct00: 到 functFF: 的预先编写的函数中调用它:
  • 您可以布置一个函数指针(地址)表,以这样一种方式存储函数指针(地址),以便在解析字符串中的十六进制数字时找到正确的指针。本质上,有一个 FF 指针表,并根据您从字符串中解析出的数字对其进行索引,然后调用该地址。
  • 不客气,我想我会写下这条评论作为答案。

标签: assembly x86 nasm


【解决方案1】:

根据您上面的评论,关于字符串 func00 - funcFF 被传递给您的程序。

您可以布置一个函数指针(地址)表,以这样一种方式存储函数指针(地址),以便在解析字符串中的十六进制数字时找到正确的指针。本质上,有一个 FF 指针表,并根据您从字符串中解析出的数字对其进行索引,然后调用该地址。

【讨论】:

    【解决方案2】:

    实际上,没有;运行时不知道源代码中使用了哪些标签,更不用说它们关联的地址了。显然,这对于调试信息是可能的(这就是调试器如何将标签与地址匹配),但这似乎超出了您尝试做的范围。

    【讨论】:

    • 如果您要查找的符号位于动态链接库中,您实际上可以进行运行时符号查找。例如,POSIX dlopen / dlsym。 (linux.die.net/man/3/dlsym)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 2021-07-06
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多