C中嵌入机器语言,有几个人会这样写代码!

zhuchunyu_14a 发布于 2012/11/21 13:08
阅读 987
收藏 1
#include <stdio.h>

typedef int (*fp_add_t)(int a, int b);

int main(void)
{
unsigned char buf[] = {
0x55, 
0x89, 0xe5,
0x8b, 0x45, 0x0c,
0x8b, 0x55, 0x08,
0x8d, 0x04, 0x02,
0x5d,
0xc3,
};
fp_add_t add = (fp_add_t) buf;
printf("%d+%d=%d\n", 2, 3, add(2, 3));
return 0;

}
winxp下测试通过,linux下测试出错
加载中
0
杨同学
杨同学
堆栈中的数据可以当代码执行?
0
就是我啊
就是我啊
为什么要用16进制来储存呢,用10进制不会更加清晰吗?
就是我啊
就是我啊
好吧,那我就不懂了。。
guoliang
guoliang
晕,16禁制的机器码可读性更高啊。。
SErHo
SErHo
回复 @%%%% : 用个十六进制就B格倍增了,那么程序员都是ZB犯了。
杨同学
杨同学
10进制会清晰吗?
lanybass
lanybass
因为用16进制看起来B格倍增~
0
小苏打
小苏打

引用来自“杨同学”的答案

堆栈中的数据可以当代码执行?
现在至少Win7/8应该不行,要不然缓冲区溢出漏洞太多了。
0
zhuchunyu_14a
zhuchunyu_14a

引用来自“杨同学”的答案

堆栈中的数据可以当代码执行?
不试一下怎么知道呢?
0
吃土的汉子
吃土的汉子
这个代码没法通用啊,Linux和Windows汇编指令集不一样,而且32位和64位系统对堆栈的处理也不一样,64位是可以设定数据存储区域“不可执行”的
0
mental
mental
可以,hook就是这样干的
0
卜库塔
卜库塔
搞shellcode的好像经常有人喜欢这么写
0
cut
cut

这个一般是写外挂才这么写的那么蛋疼,一般做项目的写这样的代码纯粹找抽。

zhuchunyu_14a
zhuchunyu_14a
不要搞那么多冠冕堂皇的东西,什么该死的项目!什么都搞得那么僵硬,就是纯粹为了混口饭吃,乐趣何在!写这个纯粹为了好玩。
0
guoliang
guoliang
以前做过的,Shellcode的原理。。用来实现各种攻击,缓冲区溢出等
0
guoliang
guoliang
另外,这个代码是机器码,跟机器的指令集是相关的,而linux和windows的指令集完全不一样,所以不可能通用的。。
guoliang
guoliang
回复 @cut : 哦,对哦。。真是我错了。。架构是一样的。。只是调用的驱动不一样,系统函数的位置不一样,,,谢谢指出。。。这种架构方面的东西,学习的时候没有联系实际,老是混乱。。
cut
cut
真的不知道你懂还是不懂,X86的机机器码是一样的,linux和windows的都一样,但linux与windows的执行文件驱动不一样,所以不一定能打开。
返回顶部
顶部