看的懂的报名

icoding 2008-05-01 01:05:30
#include <stdio.h>

typedef int (*PFUNC)(int,int);
char instruction[] =
{
0x55, //push ebp
0x8B, 0xEC, //mov ebp,esp
0x81, 0xEC, 0xC0, 0x00, 0x00, 0x00 , //sub esp,0C0h
0x53, //push ebx
0x56, //push esi
0x57, //push edi
0x8D, 0xBD, 0x40, 0xFF, 0xFF, 0xFF, //lea edi,[ebp-0C0h]
0xB9, 0x30, 0x00, 0x00, 0x00, //mov ecx,30h
0xB8, 0xCC, 0xCC, 0xCC, 0xCC, //mov eax,0CCCCCCCCh
0xF3, 0xAB , //rep stos dword ptr es:[edi]
0x8B, 0x45 ,0x08, //mov eax,dword ptr [a]
0x03, 0x45, 0x0C, //add eax,dword ptr [b]
0x5F, //pop edi
0x5E, //pop esi
0x5B, //pop ebx
0x8B, 0xE5, //mov esp,ebp
0x5D, //pop ebp
0xC3 //ret
};

int main()
{
PFUNC pfunc;
pfunc =(PFUNC)&instruction;
printf("%d \n",pfunc(6,9));
}
...全文
668 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyvvv 2008-05-23
  • 打赏
  • 举报
回复


#include <stdio.h>

typedef int (*PFUNC)(int,int);
char instruction[] =
{
0x55, //push ebp
0x8B, 0xEC, //mov ebp,esp
0x81, 0xEC, 0xC0, 0x00, 0x00, 0x00 , //sub esp,0C0h
0x53, //push ebx
0x56, //push esi
0x57, //push edi
0x8D, 0xBD, 0x40, 0xFF, 0xFF, 0xFF, //lea edi,[ebp-0C0h]
0xB9, 0x30, 0x00, 0x00, 0x00, //mov ecx,30h
0xB8, 0xCC, 0xCC, 0xCC, 0xCC, //mov eax,0CCCCCCCCh
0xF3, 0xAB , //rep stos dword ptr es:[edi]
0x8B, 0x45 ,0x08, //mov eax,dword ptr [a]
0x03, 0x45, 0x0C, //add eax,dword ptr [b]
0x5F, //pop edi
0x5E, //pop esi
0x5B, //pop ebx
0x8B, 0xE5, //mov esp,ebp
0x5D, //pop ebp
0xC3 //ret
};

int main()
{
PFUNC pfunc;
pfunc =(PFUNC)&instruction;
printf("%d \n",pfunc(6,9));
}

OpenHero 2008-05-23
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 jennyvenus 的回复:]
上面的int c[ 0x30 ];也错了

功夫不到家,哪位给解释一下,为什么上面的程序中
int c[ 0x20 ];
时产生的汇编代码和楼主的题目才一致呢?

[/Quote]
跟OS有很大的关系,debug和release版本也不一样= =!

就一段shellcode而已
没啥大惊小怪的- -!XD
偶像罗斯福 2008-05-23
  • 打赏
  • 举报
回复
有点意思,函数指针,汇编都用到了。但实在不解的是怎么做有什么目的阿。何苦那?难道只是在show
BluntBlade 2008-05-23
  • 打赏
  • 举报
回复
不就是一段ShellCode么……
vrace 2008-05-23
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 icoding 的回复:]
模拟一个函数编译后的二进制,不具有通用性吧.
------------------------------------
机器指令不具有通用性?哈哈
[/Quote]

确实没通用性
lowsar 2008-05-23
  • 打赏
  • 举报
回复
#include "stdafx.h"

typedef int( *PFUNC )( int, int );

int instruction( int a, int b )
{ int x,y; ;这两个变量没被用上直接被优化掉
int c[ 0x30 ] = {0xCCCCCCCC};
return a + b;
}
//lea edi,[ebp-0C0h] 这个说明至少有三个局部变量才对
int main(int argc, char* argv[])
{
PFUNC pfunc;
pfunc =(PFUNC)&instruction;
printf("%d \n",pfunc(6,9));
return 0;
}
lowsar 2008-05-23
  • 打赏
  • 举报
回复
函数还能那样写,真是长见识了
y2kpk123 2008-05-23
  • 打赏
  • 举报
回复
看不懂!努力学习
linlan999 2008-05-23
  • 打赏
  • 举报
回复
关注
hbsoft2008 2008-05-23
  • 打赏
  • 举报
回复
同上
ken547315 2008-05-23
  • 打赏
  • 举报
回复
不懂 学习
KTZ666 2008-05-23
  • 打赏
  • 举报
回复
看不懂
graphchina 2008-05-22
  • 打赏
  • 举报
回复
本来小菜,看起来好象有点简单,不知道看错了没有,各位大虾不要扔菜刀哈,我觉得是利用函数指针实现sub(a,b)功能,就是计算a+b的功能,并把值保存在eax 中
icoding 2008-05-22
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 akirya 的回复:]
引用 27 楼 PcrazyC 的回复:
引用 19 楼 icoding 的回复:
模拟一个函数编译后的二进制,不具有通用性吧.
------------------------------------
机器指令不具有通用性?哈哈


一般的编译器会对函数名进行处理,比如有的编译器中的函数A,编译的时候会变成@A之类的,而其它的编译器有可能不同,所以就会导致移植的问题,可能在某个平台下能用,换个平台就不行了...

所以最好是再加上extern "C"关键字,告诉编译器,…
[/Quote]

对的,是这样的,主要是硬件区分,同一个平台上具有通用性的,最简单的道理AMD 的CPU和INTEL 的CPU指令都不一样
一个平台 的指令拿到另一个平台上当然有问题,但也就是这样的区别而已

另说没用的同志们仔细看我最近的一段代码.
grellen 2008-05-19
  • 打赏
  • 举报
回复
没看懂
grellen 2008-05-19
  • 打赏
  • 举报
回复
mark
qsxiaoyao 2008-05-19
  • 打赏
  • 举报
回复
看不懂,mark下,也许N年后会回头看看
xkw365 2008-05-19
  • 打赏
  • 举报
回复

#include <stdio.h>

int main(int argc, char **argv)
{
char a[] = {
0x55,
0x8B, 0xEC,
0x81, 0xEC, 0xC0, 0x00, 0x00, 0x00 ,
0x53,
0x56,
0x57,
0x8D, 0xBD, 0x40, 0xFF, 0xFF, 0xFF,
0xB9, 0x30, 0x00, 0x00, 0x00,
0xB8, 0xCC, 0xCC, 0xCC, 0xCC,
0xF3, 0xAB ,
0x8B, 0x45 ,0x08,
0x03, 0x45, 0x0C,
0x5F,
0x5E,
0x5B,
0x8B, 0xE5,
0x5D,
0xC3
};

printf("%d\n", ((int(*)())a)(6,9));
//以上数组中是求两个数的和的二进制代码,
//((int(*)())a)(6,9)) 把数组a的地址强制转化为函数的首地址
// 每次调用时就从a的地址开始执行求两个数的和的二进制代码
// 实参可以使其他整数

return 0;

}
jan4984 2008-05-16
  • 打赏
  • 举报
回复
强制跳转到数据段而已,这想说明啥?
现在高级编译器的stack检查可能会出问题吧?
qmm161 2008-05-16
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 icoding 的回复:]
模拟一个函数编译后的二进制,不具有通用性吧.
------------------------------------
机器指令不具有通用性?哈哈
[/Quote]

当然不具备通用性!你移植到arm试试看!

而且这题目简直无聊到家,是为了优化?汇编足矣,况且现在的编译器优化出来的结果基本上已经很完美!
加载更多回复(38)

69,381

社区成员

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

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