如何使用 C 中的函数指针访问 .text 部分?
How to access .text section using a function pointer in C?
我正在尝试使用 C 在内存中注入可执行代码。可执行文件应该能够读取它自己的代码并将其复制到指针引用的其他位置。通用模板代码如下
int
main(){
int (*main_ptr)();
main_ptr=main; // make the pointer point to start of main
/*
* rest of the code.
*
*/
/*Now I am trying to print the first 10 bytes of the main function.
* just to see if it is possible to access main's code.
*/
for(int i=0;i<10;i++)
printf("%x ",*main_ptr++);
return 0;
}
但是输出的是指针的值(即main函数的地址),而不是它指向的值(main函数的代码)。我在某处读到 C 不取消引用函数指针。但我不知道为什么。有办法解决这个问题吗?
或者,是否有其他方法可以让程序访问自己的代码段?
P.S。我知道很多人可能认为这是一个愚蠢的问题,对研究等没有太大贡献。但我试图了解恶意软件是如何编写的,鉴于网络上没有 material,这令人沮丧,所以我决定自己尝试一下。任何帮助都会很棒。
您的代码有 2 个问题(尽管严格来说是 UB)。
但即使从任何实现的角度来看,也存在以下问题
None 的实现为函数指针定义了 *
运算符。
None 的实现在函数指针上定义了 ++
运算符,因为未定义函数的大小。
但大多数实现确实定义了将 fptr 转换为 void*
,然后转换为其他数据指针,即使它是 UB。
你可以利用这个事实。
我试过对你的代码进行简单的修改-
for(i=0;i<10;i++)
printf("%x ",*((int*)main_ptr++));
它产生了 gcc
(MinGW64) 的“预期”行为,将输出与 objdump 进行了比较。
最后,警告说 none 方法是可移植的。也许没有可移植的方法来实现你正在做的事情。
如果您只需要获得与 main 相同的代码,一种方法可能是读取实际的二进制文件(由 arg[0]
指出)。解析 headers 以找到 main,然后从那里读取字节。因为读取文件会给你一个数据指针,所以那里没有 UB。
我正在尝试使用 C 在内存中注入可执行代码。可执行文件应该能够读取它自己的代码并将其复制到指针引用的其他位置。通用模板代码如下
int
main(){
int (*main_ptr)();
main_ptr=main; // make the pointer point to start of main
/*
* rest of the code.
*
*/
/*Now I am trying to print the first 10 bytes of the main function.
* just to see if it is possible to access main's code.
*/
for(int i=0;i<10;i++)
printf("%x ",*main_ptr++);
return 0;
}
但是输出的是指针的值(即main函数的地址),而不是它指向的值(main函数的代码)。我在某处读到 C 不取消引用函数指针。但我不知道为什么。有办法解决这个问题吗? 或者,是否有其他方法可以让程序访问自己的代码段?
P.S。我知道很多人可能认为这是一个愚蠢的问题,对研究等没有太大贡献。但我试图了解恶意软件是如何编写的,鉴于网络上没有 material,这令人沮丧,所以我决定自己尝试一下。任何帮助都会很棒。
您的代码有 2 个问题(尽管严格来说是 UB)。 但即使从任何实现的角度来看,也存在以下问题
None 的实现为函数指针定义了
*
运算符。None 的实现在函数指针上定义了
++
运算符,因为未定义函数的大小。
但大多数实现确实定义了将 fptr 转换为 void*
,然后转换为其他数据指针,即使它是 UB。
你可以利用这个事实。
我试过对你的代码进行简单的修改-
for(i=0;i<10;i++)
printf("%x ",*((int*)main_ptr++));
它产生了 gcc
(MinGW64) 的“预期”行为,将输出与 objdump 进行了比较。
最后,警告说 none 方法是可移植的。也许没有可移植的方法来实现你正在做的事情。
如果您只需要获得与 main 相同的代码,一种方法可能是读取实际的二进制文件(由 arg[0]
指出)。解析 headers 以找到 main,然后从那里读取字节。因为读取文件会给你一个数据指针,所以那里没有 UB。