我正在尝试使用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;
}
但是输出是指针的值(即主函数的地址),而不是它指向的值(主函数的代码)。我曾在某处读过C不会取消引用函数指针。但我不知道为什么。有办法解决这个问题吗? 或者,程序是否有另一种方式来访问自己的代码部分?
P.S。我知道许多人可能认为这是一个愚蠢的问题,并没有对研究和所有这些做出重大贡献。但我正试图了解恶意软件是如何编写的,并且考虑到网络上没有材料,这一直令人沮丧,所以我决定自己尝试一下。任何帮助都会很棒。
答案 0 :(得分:2)
您的代码存在2个问题(尽管如此,UB是严格的)。 但即使从任何实现的角度来看,也存在以下问题
没有任何实现为函数指针定义*
运算符。
没有任何实现在函数指针上定义++
运算符,因为未定义函数的大小。
但大多数实现确实将fptr定义为void*
,然后将其转换为其他数据指针,即使它是UB。
你可以利用这个事实。
我尝试了对代码的简单修改 -
for(i=0;i<10;i++)
printf("%x ",*((int*)main_ptr++));
它产生了gcc
(MinGW64)的“预期”行为,将输出与objdump进行了比较。
如果你只需要获得与main相同的代码,一种方法是读取实际的二进制文件(由arg[0]
指向)。解析头部以找到main,然后从那里读取字节。由于读取文件会给你一个数据指针,因此没有UB。
答案 1 :(得分:0)
您的问题与其下方的详细信息或评论几乎没有关系。
要获取 true .TEXT部分或入口点,您需要解析PE头以获取它,因为将有一个设置你的主要功能。我提到了切入点,因为你的例子确实如此。再说一次,它并不是全部都在一起。