看雪论坛
发新帖
6

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

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

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

当然注入是需要root权限的,模拟器上可以直接用,但是真机的话,先exploit吧
上传的附件:
本主题帖已收到 0 次赞赏,累计¥0.00
最新回复 (54)
3
tihty 2011-10-13 11:27
2
好贴啊,支持
王二黑 2012-2-21 13:50
3
好技术!验证一下。
kearnel 2012-4-28 14:59
4
实现了注入,楼主有没有研究过如何hook系统API啊?
zixuan 2012-4-30 17:31
5
好贴啊,支持
ayunaa 2012-11-13 03:42
6
请问楼主怎样编译?
花了2天时间找都不知道怎样编译 。。。。
4
kindsjay 2012-11-13 10:03
7
收藏了,支持古河
wawt 2012-11-13 16:33
8
怎么用呢?????
8
HSQ 2012-11-24 21:52
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中为什么不用相对偏移,避免导出有些符号并去运行时修正这些地址,应该有优化的余地?
上传的附件:
netsniffer 2013-1-6 09:35
10
我觉得0x3c00之前是为了给后续调用预留栈空间,之后给插入代码用
楼上的ida是哪个版本,能转换ARM汇编到c code,能给个下载地址么?
hjjiang 2013-1-14 04:07
11
https://bitbucket.org/mikukon/android-test/overview
里面包括了makefile及libso文件。
gvbasic 2013-2-21 14:20
12
确实是这样的~~
chhhxj 2013-2-21 15:17
13
多谢大神们的共享啦
fudingyu 2013-3-20 14:00
14
有没有不需要Root就能够注入的办法?
麦小扣 2013-3-21 15:55
15
有没有编译成功呢 要用什么编译呢
麦小扣 2013-3-21 16:44
16
utils/Log.h: No such file or directory
figofuture 2013-4-1 19:11
17
可以参考参考这个,有makefile的 https://bitbucket.org/tewilove/injectso
ysguet 2013-4-7 17:24
18
if ( ptrace_attach( target_pid ) == -1 )
                return EXIT_SUCCESS;
为什么返回成功呢?
8
HSQ 2013-6-26 11:27
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-27 17:15
20
学习了,感谢HSQ的深入分析。
1
zhoujiamur 2013-7-10 17:36
21
先留个脚印
xupengpai 2013-10-8 13:10
22
一切正常,就是没有调用so里面的函数,肿么破?
unwww 2013-10-22 12:13
23
谁能写个详细的用法么?感激不尽
wfgfw 2013-10-25 14:42
24
可能是因为你不是在Android源码环境下编译,需要手动建立LOG的宏定义,解决方法可以参考这个博客:http://qgjie456.blog.163.com/blog/static/3545136720125297123324/
3
malokch 2013-10-26 22:14
25
这个不是早就有么?
我以前有一个更好的实现版本。
4
rockhard 2013-10-26 22:53
26
留名关注!!!!
unwww 2013-10-31 11:37
27
请教用法,谁能写个详细的用法么?感激不尽
unwww 2013-11-15 14:43
28
D:\android-ndk-r9\samples\hello-jni>ndk-build
Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
"Compile thumb : hello-jni <= hello-jni.c
jni/hello-jni.c: In function 'get_module_base':
jni/hello-jni.c:263 warning: too many arguments for format [-Wformat-extra-ar
gs]
"Compile thumb : hello-jni <= shellcode.s
SharedLibrary  : libhello-jni.so

怎么没人啊,,什么原因呢  [-Wformat-extra-args]
hyjxiaobia 2013-12-3 10:54
29
弱弱的问下,你的代码里,remote_code_ptr = map_base + 0x3C00;是什么用意?不是很明白,谢谢
小培 2013-12-3 17:23
30
楼主,请问ioctl里怎么拦截servicemanger啊
int hooked_ioctl(int fd, int cmd, void *data)
{
    LOGI("[+] ioctl is invoked ...");
    // do something here

    return (*orig_ioctl)(fd, cmd, data);
}
希望不吝赐教,谢谢
dktest 2013-12-22 17:58
31
后排留名
chitcrazy 2014-2-16 18:49
32
HSQ 大大 我最近 再看 古河的libinject 但是我注入的时候 老是出现 segment default  我怀疑古河的代码 有错 或者是 取少通用性  我看你已经运行成功了 ,所以 能不能麻烦你 能给我发一份 你的代码 我想看一下 谢谢您!
ganthur 2014-2-18 07:53
33
学习了来了
shileifull 2014-2-19 08:00
34
学习啦!感谢
unwww 2014-2-20 12:06
35
求 获取注入进程里某个SO库某个导出函数的方法
2
crazybug 2014-3-4 21:46
36
有一个疑问,在ptrace_call函数里对返回地址寄存器regs->ARM_lr = 0;为什么函数执行后不会出错呢?
NgkmRen 2014-3-23 22:25
37
当然注入是需要root权限的,模拟器上可以直接用,但是真机的话,先exploit吧
请问楼主  真机exploit是什么意思阿? 还有为什么我编译出来 在Genymotion 和谷歌的虚拟机中都崩溃了呢?
炽竹 2014-5-6 18:20
38
为什么下载不了?
下载的只是.php文件
DeepNoite 2014-5-14 11:11
39
有带注释的吗?
gqm 2014-5-23 15:46
40
古河您支持安卓的软件定做吗?有个难度非常大的,搞不定,想请您帮着分析 我Q168520564
麻辣丝瓜 2014-5-30 19:04
41
好帖,支持
1
filly 2014-6-29 14:05
42
做个记录
wule 2014-8-16 10:11
43
发给和我一样的小白:
http://blog.csdn.net/myarrow/article/details/9630377这个有比较详细的解释
二当家a 2014-9-29 09:58
44
19楼有解答。
二当家a 2014-9-29 09:59
45
[QUOTE=unwww;1239641]D:\android-ndk-r9\samples\hello-jni>ndk-build
Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb....[/QUOTE]

warning如果不影响正常运行的话,暂时可以先不管。
朕明天不上朝 2014-11-7 00:00
46
后排留名,感谢大大的分享,认真学习了
jeffycf 2014-12-3 13:47
47
mark 一下,以后用得着
heartbeast 2015-1-14 16:39
48
有一个重大疑问请教大家

inject_remote_process函数中,有这么一段:
  remote_code_ptr = map_base + 0x3C00;
这里大家都说了,是为了给栈预留空间,但是在最后面的部分:
  regs.ARM_sp = (long)remote_code_ptr;
  regs.ARM_pc = (long)remote_code_ptr;

ARM_sp怎么能和pc相同呢?不是应该指向map_base吗?这样才能达到大家说的栈空间的目的啊
JackJoker 2015-1-15 23:22
49
好帖,多谢分享
ywqjwq 2015-2-22 23:20
50
win 7 x64 用ndk编译貌似有错误。你们啥系统```
返回



©2000-2017 看雪学院 | Based on Xiuno BBS | 知道创宇带宽支持 | 微信公众号:ikanxue
Time: 0.022, SQL: 22 / 京ICP备10040895号-17