首页
社区
课程
招聘
[求助] android/linux gcc/clang如何使用裸汇编写函数
发表于: 2020-10-10 15:16 3601

[求助] android/linux gcc/clang如何使用裸汇编写函数

2020-10-10 15:16
3601

如题,在win(vs)下,可以用naked声明裸函数,然后emit 来使用 机器码,比如


extern "C" __declspec(naked) void init(){

        emit 0x55

        emit 0x89

        emit 0xe5

        xxxx 调用函数

        emit 0x89

        emit 0xec

        emit 0x5d

}


这种形式来生成的就是一个标准的

push ebp

mov ebp,esp

xxxx 调用函数

mov esp,ebp

pop ebp

=====================================================

求教在android/linux gcc/clang下如何实现同样的需求


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 35
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你究竟是想写汇编还是写机器码呢。
如果是汇编的话,各个主流编译器都是支持asm语法的。机器码的话,gcc可以用asm __volatile__ (".byte 0x12");的形式实现
2020-10-10 16:22
0
雪    币: 12502
活跃值: (3058)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
winkar 你究竟是想写汇编还是写机器码呢。 如果是汇编的话,各个主流编译器都是支持asm语法的。机器码的话,gcc可以用asm __volatile__ (".byte 0x12");的形 ...
谢谢,汇编好像也是 asm关键字,机器码的话。是.byte关键字。。这个好像是gcc-as的,。。。哈哈
2020-10-10 16:30
0
雪    币: 2089
活跃值: (3933)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
建议先做好汇编硬编码,有的编译器不支持asm。
auto *smAddr =mmap(0,字节码体积,PROT_EXEC|读|写,MAP_ANON,-1,0);
const unsigned char* shellcode = 硬编码;
RtlCopyMemory(smAddr,shellcode,体积);
using Fx = void(*)();//函数类型自己更改
((Fx)smAddr)();
2020-10-10 20:24
0
雪    币: 12502
活跃值: (3058)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
lhxdiao 建议先做好汇编硬编码,有的编译器不支持asm。 auto *smAddr =mmap(0,字节码体积,PROT_EXEC|读|写,MAP_ANON,-1,0); const unsigned ch ...
谢谢,还可以这样玩。老哥威武
2020-10-10 21:04
0
雪    币: 29
活跃值: (5682)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
ndk里写asm和普通的汇编不一样,x86的话用的是AT&T语法,和普通的x86汇编有很大区别
2020-11-18 11:50
0
雪    币: 29
活跃值: (5682)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
至于楼主你的代码,大概可以写成这样,需要注意的是AT&T语法中,操作数和被操作数的顺序与普通汇编相反
__asm volatile("push %ebp         \n"
               "mov %esp, %ebp    \n"
               "call xxxxxx       \n"
               "mov %ebp, %esp    \n"
               "pop %ebp          \n");
2020-11-18 11:58
0
游客
登录 | 注册 方可回帖
返回
//