首页
社区
课程
招聘
[原创]发个Android平台上的注入代码
发表于: 2011-10-13 11:10 155699

[原创]发个Android平台上的注入代码

2011-10-13 11:10
155699

rt,其实本质上就是linux下面的library注入
只不过处理器是arm的,需要额外处理一些东西
不少代码是从网上或xx直接借鉴的,谢谢这些代码的作者

整体流程分3步
1.在目标进程中分配内存,用来写shellcode和参数
2.往目标进程中写入shellcode, shellcode会调用dlopen来载入我们的library
3.运行目标进程中的shellcode

当然注入是需要root权限的,模拟器上可以直接用,但是真机的话,先exploit吧


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

上传的附件:
收藏
免费 8
支持
分享
最新回复 (58)
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
好贴啊,支持
2011-10-13 11:27
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
好技术!验证一下。
2012-2-21 13:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
实现了注入,楼主有没有研究过如何hook系统API啊?
2012-4-28 14:59
0
雪    币: 185
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
好贴啊,支持
2012-4-30 17:31
0
雪    币: 18
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
请问楼主怎样编译?
花了2天时间找都不知道怎样编译 。。。。
2012-11-13 03:42
0
雪    币: 310
活跃值: (159)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
7
收藏了,支持古河
2012-11-13 10:03
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
怎么用呢?????
2012-11-13 16:33
0
雪    币: 381
活跃值: (140)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
9
对比着LBE早起代码看,差不多原样抄过来的,虽说代码能编译成功并运行,同时也发现些疑问,期待各位高手解惑
疑问一: 为何要加0x3C00?否则注入进程后出行Segment fault 错误。
       mmap分配到内存映射,为什么不用返回的地址直接做代码基址,而必须加上 0x3C00,尝试过改为其他值比如0x100或者0x4偶尔成功,但出错几率99%以上

// 设置远程代码存储空间地址
remote_code_ptr = map_base+[COLOR="Red"][B]0x3C00[/B][/COLOR]; // + 0x3C00


LBE无论早期版本还是最新版本,也都是固定要加上0x3C00这个偏移,不知为何?
应该与ARM指令对其无关吧?


疑问二:为何要加 0x20?  经测试这个在严谨计算偏移后,完全没必要,删除了不会影响程序功能和运行。

dlopen_param1_ptr = local_code_ptr + code_length + [COLOR="Red"][B]0x20[/B][/COLOR];


疑问三:get_module_base 有不太准确的地方,是小问题但会影响程序运行。
void* get_module_base( pid_t pid, const char* module_name )
{
    // ... ...
   snprintf( filename, sizeof(filename), "/proc/self/maps", [B][COLOR="Red"]pid[/COLOR][/B] ); // pid是多余的吧!
   pch = [COLOR="Blue"][B]strtok( line, "-" ); [/B][/COLOR]// 此处完全没有必要调用API切分字符串,直接改为[COLOR="DarkRed"] [B]line[8]=0[/B];[/COLOR] 更合适
   if ( [B][COLOR="Blue"]strstr[/COLOR][/B]( line, module_name ) ) // 这么比对模块名,在有近似名是可能会找错对象 
   // ... ...
}


疑问四: shellcode.s中为什么不用相对偏移,避免导出有些符号并去运行时修正这些地址,应该有优化的余地?
上传的附件:
2012-11-24 21:52
0
雪    币: 53
活跃值: (280)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
我觉得0x3c00之前是为了给后续调用预留栈空间,之后给插入代码用
楼上的ida是哪个版本,能转换ARM汇编到c code,能给个下载地址么?
2013-1-6 09:35
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
https://bitbucket.org/mikukon/android-test/overview
里面包括了makefile及libso文件。
2013-1-14 04:07
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
确实是这样的~~
2013-2-21 14:20
0
雪    币: 57
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
多谢大神们的共享啦
2013-2-21 15:17
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
有没有不需要Root就能够注入的办法?
2013-3-20 14:00
0
雪    币: 61
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
有没有编译成功呢 要用什么编译呢
2013-3-21 15:55
0
雪    币: 61
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
utils/Log.h: No such file or directory
2013-3-21 16:44
0
雪    币: 122
活跃值: (45)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
可以参考参考这个,有makefile的 https://bitbucket.org/tewilove/injectso
2013-4-1 19:11
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
if ( ptrace_attach( target_pid ) == -1 )
                return EXIT_SUCCESS;
为什么返回成功呢?
2013-4-7 17:24
0
雪    币: 381
活跃值: (140)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
19
通过最近再次学习ARM方面的内容,已经明白了上面几个疑问
答疑问一:加0x3C00,是因为把前3c00空间做为栈使用,其实在.s文件中保护好寄存器,自己提供栈空间是有没有必要的,由于sp始终指向栈顶,不可能会覆盖进程中正在使用的数据,至于出现栈空间不够的可能性也极小。通过栈空间直接注入代码,可避免远进程的内存申请。
regs.ARM_sp=(long)remote_code

答疑问二:为何要加 0x20?,是因为ARM数据要求4字节对齐,加20没必要,只要保证数据是对齐即可。所有的数据都有修正为4字节对齐,可以用宏实现
疑问三:get_module_base 函数完全没必要,系统调用层的地址各个进程都一样,无需重新计算偏移,可直接使用
疑问四: shellcode.s中数据部分,可移至.BSS段减少代码文件尺寸
.bss
.global _inject_data_s
_inject_data_s: .space 1024*4
导出的符号放在与代码发在一个段就是为了使用相对偏移,如果代码在.text,数据在.data反而需要重新修正指针,LDR也得用伪指令,将数据和代码外装在.DATA,不影响代码编译,已经是最优的选择。
注入成功的效果图
上传的附件:
2013-6-26 11:27
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
学习了,感谢HSQ的深入分析。
2013-6-27 17:15
0
雪    币: 224
活跃值: (16)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
先留个脚印
2013-7-10 17:36
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
一切正常,就是没有调用so里面的函数,肿么破?
2013-10-8 13:10
0
雪    币: 32
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
谁能写个详细的用法么?感激不尽
2013-10-22 12:13
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
可能是因为你不是在Android源码环境下编译,需要手动建立LOG的宏定义,解决方法可以参考这个博客:http://qgjie456.blog.163.com/blog/static/3545136720125297123324/
2013-10-25 14:42
0
雪    币: 43
活跃值: (388)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
25
这个不是早就有么?
我以前有一个更好的实现版本。
2013-10-26 22:14
0
游客
登录 | 注册 方可回帖
返回
//