【发布时间】:2019-03-25 21:53:59
【问题描述】:
我试图实现这个问题的解决方案:Calling a function through its address in memory in c / c++,但我对 C 和 C++ 的区别不是很熟悉。当我尝试实现答案时,我的编译器向我抛出了一个奇怪的错误消息:
shellcode/findpattern.c: In function ‘shell_code’:
shellcode/findpattern.c:9:30: error: expected expression before ‘)’ token
memchr* memchr = (memchr*)0xdeadbeef;
^
shellcode/findpattern.c:10:30: error: expected expression before ‘)’ token
memcmp* memcmp = (memcmp*)0xdeadb00f;
^
这是我的代码:
//#include "string.h"
#include "stdio.h"
//#include "stdlib.h"
typedef void* memchr(const void* , int , size_t );
typedef int memcmp(const void* , const void* , size_t );
void shell_code(){
memchr* memchr = (memchr*)0xdeadbeef;
memcmp* memcmp = (memcmp*)0xdeadb00f;
unsigned char *current = 0x00400000;
unsigned char *end = 0x015f1000;
int patternlength = 8;
unsigned char pattern[8] = "\x48\x08\x49\x8B\x48\x11\x8B\$
unsigned char *ret;
while(current < end){
ret = memchr(current, pattern[0], end-current);
if (ret != NULL){
if (memcmp(current, &pattern, patternlength) == 0$
return current + patternlength;
}
}
current = ret;
}
}
我在这里缺少什么?据我了解,这只是一个演员表,那么为什么编译器会在这里抛出错误?这是我不熟悉的 C 与 C++ 的事情吗?
【问题讨论】:
-
在标准标题周围使用尖括号:
<stdio.h>等。这就是标准所说的,不这样做没有任何好处(至少,除非你不问这样的问题——即便如此,它也大多是有争议的)。函数类型有点奇怪。为什么你会这样命名我不知道。 -
问题是类型名和变量标识符在同一个命名空间中。用另一个名字调用你的函数指针;例如
memchr* memch = (memchr*)0xdeadbeef; -
顺便说一句;
typedefing 函数是邪恶的 ;) -
@AnttiHaapala 确实是邪恶的,但我必须为我的 shellcode 这样做,因为我需要调用一些函数,但我不太擅长编写汇编程序。所以我尝试使用更多的 C。
标签: c pointers memory function-pointers memory-address