11
回答
C中嵌入机器语言,有几个人会这样写代码!
华为云4核8G,高性能云服务器,免费试用   
#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下测试出错
举报
zhuchunyu_14a
发帖于6年前 11回/935阅
共有11个答案 最后回答: 6年前
为什么要用16进制来储存呢,用10进制不会更加清晰吗?
--- 共有 5 条评论 ---
就是我啊好吧,那我就不懂了。。 6年前 回复
guoliang晕,16禁制的机器码可读性更高啊。。 6年前 回复
SErHo回复 @%%%% : 用个十六进制就B格倍增了,那么程序员都是ZB犯了。 6年前 回复
杨同学10进制会清晰吗? 6年前 回复
lanybass因为用16进制看起来B格倍增~ 6年前 回复

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

堆栈中的数据可以当代码执行?
现在至少Win7/8应该不行,要不然缓冲区溢出漏洞太多了。
这个代码没法通用啊,Linux和Windows汇编指令集不一样,而且32位和64位系统对堆栈的处理也不一样,64位是可以设定数据存储区域“不可执行”的

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

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