通过地址C调用函数

时间:2018-10-21 19:12:29

标签: c pointers memory function-pointers memory-address

我尝试实现以下问题的解决方案: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 vs C ++吗?

1 个答案:

答案 0 :(得分:1)

给出代码(从您的代码中提取):

typedef void* memchr(const void *, int, size_t);

void shell_code(void)
{
    memchr* memchr = (memchr*)0xdeadbeef;
//  ^1      ^2        ^3

^1的{​​{1}}涉及memchr中的函数类型; typedef是本地变量的名称。现在,该局部变量隐藏了类型;您将无法再访问函数中的类型。 ^2的{​​{1}}引用是对函数的局部指针的引用,而不是对类型的引用。您在变量后有一个乘法运算符,但没有用于乘法的RHS-因此编译器会抱怨^3,因为它希望在那里有一个表达式作为乘法的RHS。

不要用相同的名字努力比赛。您会让人们在阅读您的代码时感到困惑。类型和函数指针使用不同的名称。例如(不一定是好的命名方式,而是足够的,并且避免使用支持function pointers的函数):

memchr

代码现在有编译的可能,但是在运行它并调用)时会崩溃,因为0xDEADBEEF处的代码不太可能像typedef void *(*MemChr)(const void *, int, size_t); void shell_code(void) { MemChr p_memchr = (MemChr)0xdeadbeef; 这样的函数,假设它被映射为根本没有可执行代码。

请注意,这种表示法允许您p_memchr(在声明memchr的地方)不干扰它,也不会受到它的干​​扰。