能力值:
( LV4,RANK:50 )
2 楼
好文,标记收藏
能力值:
( LV12,RANK:310 )
3 楼
顶一下,看来在下的LibInject还能派上点用场
能力值:
(RANK:350 )
4 楼
好文,不过要恢复的话,只需要一句“su killall system_server”就让它歇菜了
能力值:
( LV2,RANK:140 )
5 楼
啊,你是LibInject的原作者?握手握手。好厉害的功力。
能力值:
( LV2,RANK:140 )
6 楼
是的。system_server被干掉或crash后会被init自动重启,原先的hook就没了,需要再找个时机得到system_server的启动通知再来hook它一下才行。我暂时没想到好的思路,不知有无建议?
能力值:
( LV2,RANK:10 )
7 楼
mark。有用标记一下
。
能力值:
( LV2,RANK:10 )
8 楼
mark
能力值:
( LV10,RANK:160 )
9 楼
围观+1.好文感谢分享
能力值:
( LV2,RANK:10 )
10 楼
我勒个去啊,跪读了
能力值:
( LV2,RANK:10 )
11 楼
我想问下楼主怎么调试这段程序的,我还不知道怎么在android上方便的调试类似的程序
能力值:
( LV2,RANK:140 )
12 楼
我是通过打log来调试的。
#include <cutils/log.h>
#define LOG_TAG "inject"
代码中用LOGD("xxxxx %d", 0);这样输出。
然后链接时链接入liblog。
跑命令logcat -s inject 就能看见输出的xxxxx 0了。
能力值:
( LV2,RANK:10 )
13 楼
楼主您好,首先感谢您的分享。我按照您的方法实验了一下,有个问题想请教:
您提到 “写了一个新共享库让shellcode加载的共享库调用,以实现新共享库常驻system_server内存”,我想问一下这里具体是怎么实现常驻内存的?
为了描述方便,假设shellcode通过dlopen加载的共享库是libpayload.so,您提到的新共享库(也就是do_hook函数所在的共享库)的名称是libhook.so。
我实验时是这样的: 生成libpayload.so时链接了libhook.so,然后libpayload.so中的hook_entry调用do_hook函数。
也就是:
shellcode libpayload.so libhook.so
dlopen
---》 hook_entry
---》 do_hook
《---
《---
dlclose
但是我觉得这样也实现不了libhook.so常驻内存,因为dlclose卸载libpayload.so时候,应该会递归卸载掉libhook.so吧。
我按照这种方式实际实验的结果也是无法实现常驻,结果是用new_ioctl地址替换ioctl地址之后, system_server进程被重启。
注入程序查找和替换ioctl地址的实现部分是没有问题的,因为我尝试了如果shellcode中不调用dlclose卸载libpayload.so,则new_ioctl能够被调用。
所以想请问大家是如何实现libhook常驻system_server进程内存的?是否有简单的通用办法?谢谢
能力值:
( LV2,RANK:140 )
14 楼
楼上,dlclose不会递归卸载目标中显式加载的so,也就是说,A如果dlopen了B,B代码里dlopen了C,那么A来dlclose B的时候,应该不会影响到C的,除非B显式dlclose了C。
你说的递归卸载,是隐含链接的形式,如果A在编译期就指定了运行时要被动态链接B(不是显式dlopen),B要链C,那么A起来时会递归加载B,B起来时也会递归加载C,A退出时会递归卸载B再递归卸载C。
你碰到的system_server被重启的情况,可能是其他原因crash了导致被系统重启?
能力值:
( LV2,RANK:10 )
15 楼
谢谢您, 我试了一下,您说的是对的, libpayload 显式链接 libhook ,并且不主动dlclose卸载libhook,libhook就保留在内存了。
我之前是隐式链接的,libpayload被卸载的时候导致libhook也被卸载,system_server执行new_ioctl的时候,这个函数不在内存了,导致system_server崩溃。
另外不知道您后来对Binder通信有没有进一步研究, 我觉得在system_server进程中没法通过解析Binder通信数据了解客户端应用在请求哪个服务的什么功能。因为system_server进程中有多个Service线程,例如ActivityManager,PowerManagerService等等,通过拦截ioctl得到binder_transaction_data后,目前根据其中的Binder对象指针似乎不能找到其对应的Service,也就不能解析出通信数据中命令码(binder_transaction_data中的code成员)是对应哪个Service的哪个函数。
我对Binder的理解还不是很透彻,不知道这个理解是否正确?
能力值:
( LV2,RANK:10 )
16 楼
几大主流Android安软早就已经放弃从C层做binder hook了,Java层的hook可以拿到更多的信息,也更安全,建议考虑一下。
能力值:
( LV3,RANK:20 )
17 楼
这些service binder调用格式是固定的,从Parcel数据中可以取出service discribetor,可以知道是哪个service,进而通过transaction的code可以得知是该service的哪个函数
去看看android_util_binder.cpp transact函数吧
能力值:
( LV2,RANK:10 )
18 楼
楼主第一段代码里的 BINDER_WRITE_READ 怎么定义的(在自己的代码中)?
能力值:
( LV2,RANK:10 )
19 楼
谢谢您的回复。
你说的是framework/base/core/jni/android_util_Binder.cpp 中的 android_os_BinderProxy_transact函数么?
我看了这个函数但是还是看不出请求一个Service时候的具体格式,比如第一个字段是什么,第二个字段是什么。
后来看到这个文件中android_os_Parcel_writeInterfaceToken函数的一句注释
“ In the current implementation, the token is just the serialized interface name that the caller expects to be invoking” 提示了一些信息。
然后结合service_manager.c中的svcmgr_handler函数和拦截的消息,目前猜测是:
4字节 strict_policy_mask(作用未知),然后是4字节interface_name的长度,后面跟着interface_name字符串。在后面应该是code对应的函数的参数。
不过不知道哪里有文档定义了这些格式。
能力值:
( LV2,RANK:10 )
20 楼
在binder驱动头文件里binder.h
能力值:
( LV2,RANK:10 )
21 楼
楼主您好,我是一个菜鸟,想问下文中提到的:打开/system/lib/libbinder.so文件,获取其ELF头。
read(fd, ehdr, sizeof(Elf32_Ehdr));
请问下:是通过什么函数打开/system/lib/libbinder.so文件的呢?怎样获得了fd。
能力值:
( LV2,RANK:10 )
22 楼
好文章,顶一下
能力值:
( LV2,RANK:10 )
23 楼
楼主您好,我是一个菜鸟,想问下文中提到的:打开/system/lib/libbinder.so文件,获取其ELF头。
read(fd, ehdr, sizeof(Elf32_Ehdr));
请问下:是通过什么函数打开/system/lib/libbinder.so文件的呢?怎样获得了fd。
能力值:
( LV2,RANK:10 )
24 楼
楼主你好,我是人大的大三学生,我正在自己学习截获ioctl命令的相关知识,看到你的文章,觉得对我的帮助非常大,很想认真的学习一下,所以想请问你能不能传给我你的源代码?文章上的大都是片段,理解起来有困难,我的邮箱是zhoumeizi311@126.com,如果可以的话,我将十分感谢。ps。仅用于自己学习。
能力值:
( LV2,RANK:10 )
25 楼
好文,顶你没有理由!!!