高手帮我分析一下((void(*)(void))&ShellCode)() 这句话的语法

mikelisuper 2005-06-26 10:37:23
unsigned char ShellCode[] = “"\xEB\x10\x5A\x4A\x33\xC9\x66\xB9\x3E\x01\x80\x34\x0A\x96\xE2\xFA......" ;

((void(*)(void))&ShellCode)() 这句话的作用是把ShellCode转换成一个参数为空,返回为空的函数指针,并调用它,执行这就话相当于执行ShellCode数据你的那些数据。

问题:((void(*)(void))&ShellCode)() 这就话的语法很怪异,谁能详细分析一下它是如何工作的?
把每一个符号都解释清楚它的作用?

技术探讨,欢迎大家踊跃发言
...全文
360 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
mikelisuper 2005-06-28
  • 打赏
  • 举报
回复
强,fatalerror99 解释的很清楚,够强,分都给你了,我要结贴了,谢谢各位参与!!!
takbj 2005-06-27
  • 打赏
  • 举报
回复
就是在栈中运行code啦!
xEB就是一个JMP短跳转,向后x10
((void(*)(void))&ShellCode)()的作用是将unsigned char 的ShellCode转换为Function指针,这句应该是一个伪指令.以后就可以写 ShellCode();
jmsting 2005-06-27
  • 打赏
  • 举报
回复
ding!!!
Wolf0403 2005-06-27
  • 打赏
  • 举报
回复
找个 C Traps and Pitfalls 吧,开篇没多少就是说这个的 :-)
brianlu 2005-06-27
  • 打赏
  • 举报
回复
&ShellCode 和 unsigned char ** 没关系
&ShellCode是指向数组的指针。
就是把&ShellCode变成一个函数指针,然后执行一段代码。
比如执行&ShellCode所指向的一个函数
dongpy 2005-06-27
  • 打赏
  • 举报
回复
顺便说一句,&ShellCode 的类型不是unsigned char **。

它是指向数组的指针,而不是指向指针的指针。
dongpy 2005-06-27
  • 打赏
  • 举报
回复
&ShellCode 这里只是代表一个内存地址值,它的类型不重要。

&ShellCode也可以改成 &ShellCode[0]
dongpy 2005-06-27
  • 打赏
  • 举报
回复
((void(*)(void))&ShellCode)()
=====================================
将地址值&ShellCode转化成(void(*)(void)类型的函数指针,然后执行那个地址的代码。

这样写清楚些:

typedef void(*pf)(void);

( (pf)&ShellCode )();
fatalerror99 2005-06-26
  • 打赏
  • 举报
回复
((void(*)(void))&ShellCode)()
后面的括号说明这是一个函数调用,去掉

剩下 (void(*)(void))&ShellCode,这是一个强制类型转换,后面的 &ShellCode 是被转化对象,去掉

剩下 void(*)(void) 就是一个类型了,这类型是一个函数指针,前面的void表示这个函数指针指向的函数返回类型为 void,后面的 (void) 这个函数指针指向的函数的参数为 void。

合起来就是把 ShellCode 的地址,转换成这样一个函数指针类型:void(*)(void),然后执行。
mikelisuper 2005-06-26
  • 打赏
  • 举报
回复
&ShellCode : char**

(void(*)(void))&ShellCode :
将char**转成函数指针, void fun(void)

(...)() :
运行之
-----------
怎样把char**转换成函数指针?(*)加个括号有什么用?你没说明白。置于运行什么大家不要去管,我是随便写了些机器码。
truewill 2005-06-26
  • 打赏
  • 举报
回复
至于运行什么东西,就要找汇编的大佬拉
truewill 2005-06-26
  • 打赏
  • 举报
回复
&ShellCode : char**

(void(*)(void))&ShellCode :
将char**转成函数指针, void fun(void)

(...)() :
运行之
fatalerror99 2005-06-26
  • 打赏
  • 举报
回复
to niuniu612()

谁说 ShellCode 的类型是 char** 了,没看见定义:unsigned char ShellCode[] = “"\xEB\x10\x5A\x4A\x33\xC9\x66\xB9\x3E\x01\x80\x34\x0A\x96\xE2\xFA......" ;吗?

ShellCode 是 char*,&ShellCode 是取 ShellCode 的地址,&ShellCode 是一个取地址表达式,它的结果的类型才是 char**。
niuniu612 2005-06-26
  • 打赏
  • 举报
回复
ding

为什么是 &ShellCode,而不是ShellCode?
我的疑问是,ShellCode的类型是char**,而 &(char**)即&ShellCode是什么意思?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧