【问题标题】:How to get c function Bytes and convert it into char如何获取c函数字节并将其转换为char
【发布时间】:2014-05-24 21:17:26
【问题描述】:

我正在寻找一种加载函数并将其转换为 char 的方法; 我想获取它的字节数。

void myFunc();
int main()
{
   char myChar =(char)&myFunc; // stuff like that
   return 0;
}
void myFunc()
{
   printf("hi!");
}

我试图取消引用我的地址指针@user2482551:

这是我的新代码:

#include <stdio.h>

void myFunc(){
    printf("hi");

}
int main(){
    unsigned int* c = (unsigned int*)(&myFunc);

    printf("%d\n",*c);
    return 0;
}

输出:-443987883

你知道这是什么意思吗?

【问题讨论】:

  • 您希望myChar 成为什么?指向函数的指针?或字符串"hi!"?
  • @Pavel 它有 SMC(自我修改代码)尝试的味道。
  • @WhozCraig 好吧,任何现代操作系统都可能以单个“分段错误”结束任何“SMC”尝试:)
  • 不,我想获得函数“bytes”,它是&amp;myFunc地址处的RAM
  • 这对编译器、体系结构和操作系统非常依赖,甚至不应该是您在堆栈溢出时询问的问题。

标签: c


【解决方案1】:

当您键入一个键时,以下将获取 myFunc 的地址并从该地址开始逐字节遍历内存:

void myFunc();
int main()
{
   void* ptr = &myFunc; // stuff like that
   while(getchar() != -1) {
     printf("%d", *((char*)ptr++));
   }
   return 0;
}
void myFunc()
{
   printf("hi!");
}

这是我得到的输出:

[gregor@localhost tmp]$ ./faddr

85
72
-119
-27
-65
-109
6

我无法判断这是否实际上是单步执行函数的机器代码......也许你有办法检查这个?例如使用更简单的东西,例如:

int myFunc() 
{
   return 0;
}

【讨论】:

  • “判断这是否真的是单步执行机器代码”——确实如此。将结果打印为无符号十六进制显示55 48 89 E5 30 C0 48 8D 0D 41 00 00 00 48 89 CF E8 09 00 00 00 5D C3 ..,以push 开头。停在C3 因为那是RET 指令。
  • 请注意,这并不是真正可移植的,因为您不应该将函数指针转换为void *,但如果您尝试获取机器代码,那么您可能不会关心。
【解决方案2】:

我会说你想要

char* myChar =(char*)&myFunc; // stuff like that

您不能将地址转换为char,但当然可以将其转换为指向字符的指针char*

另外,在main上面定义函数,如果没有,在main上面声明它的原型void myFunc();。否则main() 不会“看到”它,并且会出现编译时错误。

【讨论】:

  • 是的对不起,msitake
  • 当然,myChar 只会包含函数的地址,只是完整函数的字节表示。
  • @CandyMan 不确定我明白了......你所说的“函数的字节表示”是什么意思?存储f 的物理内存地址的实际值?像内存转储一样?
  • 我只想指出 OP,因为标题是 'get C function bytes' myChar 将不包含 'printf("hi");' 的机器代码
  • @user2777579 你不应该“打印”char*,它是一个指向内存中某些东西的指针,而不是类似C 的字符串。它将打印,直到在内存中找到\0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 2016-08-02
  • 2011-04-16
  • 2013-06-12
  • 2011-12-19
  • 2019-03-08
  • 2021-04-17
相关资源
最近更新 更多