通过地址 C 调用函数
Calling a function via its address C
我试图实现这个问题的解决方案: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++ 的区别吗?
给定代码(从您的代码中提取):
typedef void* memchr(const void *, int, size_t);
void shell_code(void)
{
memchr* memchr = (memchr*)0xdeadbeef;
// ^1 ^2 ^3
^1
提及memchr
是针对typedef
中的函数类型; ^2
提及的是局部变量的名称。这个局部变量现在隐藏了类型;您无法再访问函数中的类型。 ^3
提到的 memchr
是对局部函数指针变量的引用,而不是类型。您在变量后有一个乘法运算符,但没有用于乘法的 RHS — 因此编译器抱怨 )
因为它期望那里的表达式作为乘法的 RHS。
别玩同名了。你会让阅读你的代码的人感到困惑。为类型和函数指针使用不同的名称。例如(不一定是好的命名风格,但足够了——并且避免使用有利于 function pointers 的函数):
typedef void *(*MemChr)(const void *, int, size_t);
void shell_code(void)
{
MemChr p_memchr = (MemChr)0xdeadbeef;
代码现在有机会编译,但是当你 运行 它并调用 p_memchr
时只会崩溃,因为 0xDEADBEEF 处的代码不太可能是像 memchr
这样的函数,假设它完全被映射为可执行代码。
请注意,此表示法允许您 #include <string.h>
(声明 memchr()
的地方)而不干扰它,或不受它的干扰。
我试图实现这个问题的解决方案: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++ 的区别吗?
给定代码(从您的代码中提取):
typedef void* memchr(const void *, int, size_t);
void shell_code(void)
{
memchr* memchr = (memchr*)0xdeadbeef;
// ^1 ^2 ^3
^1
提及memchr
是针对typedef
中的函数类型; ^2
提及的是局部变量的名称。这个局部变量现在隐藏了类型;您无法再访问函数中的类型。 ^3
提到的 memchr
是对局部函数指针变量的引用,而不是类型。您在变量后有一个乘法运算符,但没有用于乘法的 RHS — 因此编译器抱怨 )
因为它期望那里的表达式作为乘法的 RHS。
别玩同名了。你会让阅读你的代码的人感到困惑。为类型和函数指针使用不同的名称。例如(不一定是好的命名风格,但足够了——并且避免使用有利于 function pointers 的函数):
typedef void *(*MemChr)(const void *, int, size_t);
void shell_code(void)
{
MemChr p_memchr = (MemChr)0xdeadbeef;
代码现在有机会编译,但是当你 运行 它并调用 p_memchr
时只会崩溃,因为 0xDEADBEEF 处的代码不太可能是像 memchr
这样的函数,假设它完全被映射为可执行代码。
请注意,此表示法允许您 #include <string.h>
(声明 memchr()
的地方)而不干扰它,或不受它的干扰。