(void(*)(void)) &shellcode啥意思?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(void(*)(void)) &shellcode啥意思?相关的知识,希望对你有一定的参考价值。
(void(*)(void)) &shellcode什么意思,详细分析下
这两个void个是什么意思?
转化后如果加括号,就可以对该函数进行调用,格式如下:((void(*)(void)) &shellcode)()
如果是测试shellcode的功能,还可以用下面这个方法:
__asm
lea eax, shellcode
call eax
这个方便记,直接call shellcode的地址。 参考技术A void(*)(void)是函数指针,函数类似原型void function(void);
void(*p)(void);/*定义一个函数指针*/
p=(void(*)(void))&shellcode;
p(); 参考技术B 将&shellcode指针进行强制类型转换,转换的类型为void(*)(void)。
void(*p)(void);//p是一个函数指针,指向void fun(void),
所有上面是把shellcode的地址转为一个指向函数的指针类型。 参考技术C 将shellcode强制(类型)转换为函数指针void(*)(void)
错误:从‘void*’到‘void* (*)(void*)’的无效转换 - pthreads
【中文标题】错误:从‘void*’到‘void* (*)(void*)’的无效转换 - pthreads【英文标题】:error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’ - pthreads 【发布时间】:2012-08-01 11:20:52 【问题描述】:anisha@linux-y3pi:~> g++ conditionVarTEST.cpp -Wall
conditionVarTEST.cpp: In function ‘int main()’:
conditionVarTEST.cpp:33:53: error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’
conditionVarTEST.cpp:33:53: error: initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
conditionVarTEST.cpp:34:53: error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’
conditionVarTEST.cpp:34:53: error: initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
第 33 行是这样的:
pthread_create (&A, NULL, (void *) &functionA, NULL);
functionA
的声明是这样的:
void functionA (void*);
它的定义是:
void functionA (void* argA)
while (1)
pthread_mutex_lock (&mutexA);
if (count < 0)
pthread_cond_wait (&conditionVariableA, &mutexA);
else
// Do something.
std :: cout << "\nTime to enjoy!";
pthread_mutex_unlock (&mutexA);
【问题讨论】:
【参考方案1】:如果你查看manual page,你会看到函数参数是
void *(*start_routine) (void *)
即,指向一个函数的指针,该函数接受一个void *
参数并返回void *
。
要消除您的错误,请将您的函数更改为返回 void *
,并在不进行类型转换的情况下传递它。如果你不关心值,线程函数的返回可以是一个简单的return NULL
。
【讨论】:
很抱歉没有看手册页。我跟着这个:amparo.net/ce155/thread-ex.html这给了我错误。 @AnishaKaul 如果您收到有关函数参数的编译错误,那么查看该函数的手册页以确保您获得正确的参数可能会有所帮助。【参考方案2】:(void *) &functionA
会将你的函数指针functionA
类型为void (*)(void*)
转换为简单的void*
。后者不能再转换为第一个,所以编译器报错。这是您不应该使用 C 风格强制转换的原因之一。
请改用pthread_create (&A, NULL, functionA, NULL);
。
另外,线程函数的返回类型应该是void*
,而不是void
。所以把void functionA(void*)
改成void* functionA(void*)
。
【讨论】:
这给了我:error: invalid conversion from ‘void (*)(void*)’ to ‘void* (*)(void*)’
更一般地说,void*
是指向数据的指针,void (*)(void*)
是指向函数的指针。两种类型之间没有没有合法的转换。【参考方案3】:
使用
pthread_create (&A, NULL, functionA, NULL);
而不是强制转换。
您用来传递给 pthread_create 的函数也应该返回 void*
,因此为避免以后出现任何问题,请考虑更改函数签名以适应这一点。
【讨论】:
【参考方案4】:当您使用 C++ 编译器时,您应该使用带有 C 绑定的函数,因为 pthread_create 需要一个 C 函数:
extern "C" void* functionA (void*);
C++ 和 C 在您当前的平台上可能具有相同的调用约定,但不能保证在其他平台上会是这种情况,或者将来会是这样。
【讨论】:
以上是关于(void(*)(void)) &shellcode啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
从 'void* (*)(int*)' 到 'void* (*)(void*)' 的无效转换