能力值:
( LV2,RANK:10 )
2 楼
我把问题描述的详尽一些:
packageManager对‘删除包’的接口定义是这样:
public void deletePackage(java.lang.String packageName, android.content.pm.IPackageDeleteObserver observer, int flags) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeString(packageName);
_data.writeStrongBinder((((observer!=null))?(observer.asBinder()):(null)));
_data.writeInt(flags);
mRemote.transact(Stub.TRANSACTION_deletePackage, _data, _reply, 0);
_reply.readException();
}
finally {
_reply.recycle();
_data.recycle();
}
}
其中第二个参数是服务‘deletePackageObserver’的代理对象。
我拦截了该远程调用,可以获取到‘deletePackageObserver’代理对象的handle值。
deletePackageObserver有一个远程调用接口‘packageDeleted’定义如下:
public void packageDeleted(java.lang.String packageName, int returnCode) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeString(packageName);
_data.writeInt(returnCode);
mRemote.transact(Stub.TRANSACTION_packageDeleted, _data, null, android.os.IBinder.FLAG_ONEWAY);
}
finally {
_data.recycle();
}
}
我使用获取到的deletePackageObserver代理对象handle,调用packageDeleted方法,代码如下:
nsigned iodata[512/4];
struct binder_io msg, reply;
bio_init(&msg, iodata, sizeof(iodata), 4);
bio_put_uint32(&msg, 0); // strict mode header
bio_put_string16_x(&msg, "android.content.pm.IPackageDeleteObserver");
bio_put_string16(&msg, packagename);
bio_put_uint32(&msg, 1);
if (binder_call(handle, &msg, &reply, target, 1, 0x01))
{
log("\tnotify the other side fail \n");
return ;
}
else
log("\tnotify the other side success \n");
binder_done(handle, &msg, &reply);
这段代码已经验证是可用的,是从service_manager的代码中扣出来的。
能力值:
( LV2,RANK:10 )
3 楼
按照我的理解 这个思路是没有问题的,但是总是失败~~~~~~~~~~~
0: async from 3868:3884 to 0:0 node 0 handle 271 () size 148:0 dex 1 start 6901.588186
从这个记录来看 ,貌似是服务不在了~~~~~~~~~ 大神们 求指教啊~~~~~~~~~~~~ 拜谢啊拜谢~~~~~~~~~~
能力值:
( LV2,RANK:10 )
4 楼
求大神 现身~~~~~~~~~~~
能力值:
( LV3,RANK:20 )
5 楼
既然已经截获handle对象,那直接使用handle对象发送你需要的消息,binder驱动接收到消息就可以处理了吧,为什么还有这段代码? if (binder_call(handle, &msg, &reply, target, 1, 0x01))
{
log("\tnotify the other side fail \n");
return ;
}
else
log("\tnotify the other side success \n");
binder_done(handle, &msg, &reply);
能力值:
( LV2,RANK:10 )
6 楼
这段代码 就是向驱动发消息的~~~~~~~~~
能力值:
( LV2,RANK:10 )
7 楼
如果是拦截OnTransact,那直接调用HOOK时保存的原远程代理对象的OnTransact就行了,我在拦截通知推送服务的时这么试过。
能力值:
( LV3,RANK:20 )
8 楼
binder驱动中存在两个binder对象,一个是服务端的binder另一个是binder驱动中的binder对象,会不会是拦截错对象了?
能力值:
( LV2,RANK:10 )
9 楼
拦截的是libbinder.so库中的ioctl,你说这个是C++里的东西。
请问你是怎么拦截的OnTransact?????????????????
能力值:
( LV2,RANK:10 )
10 楼
binder通信在传输binder对象时,传输的是flag_binder_obj这个结构体,这个结构中有个域Type,用来描述传输的是啥东西,有这样几个类型:
HANDLE、Binder、WeakBinder等(记不清),这读取的时候类型确实是Handle,即服务的代理。
能力值:
( LV2,RANK:10 )
11 楼
我是在JAVA层拦截的..看来和你不是同一个路子。
我拦截OnTransact就是因为
android.app.NotificationManager类有静态成员sService,他的类型是android.app.INotificationManager
它有个成员叫mRemote,类型为IBinder。
自己继承Binder搞一个类,然后用此类的对象覆盖mRemote即可。
能力值:
( LV2,RANK:10 )
12 楼
你好 请问你是怎么做到“自己继承Binder搞一个类,然后用此类的对象覆盖mRemote即可。 ”这个的?
难道是先在本地成注入,然后在注入到java中???(注入这个叫法是我自己叫的,不一定准确)
你这个实际上拦截的是代理对象(java层的),对吧?
能力值:
( LV2,RANK:10 )
13 楼
是你说的这样,拦截的是代理。
能力值:
( LV3,RANK:20 )
14 楼
“我使用获取到的deletePackageObserver代理对象handle,调用packageDeleted方法,代码如下:”
lz 拦截的是system_server 吗? 这个回调是在packagemanagerser里边调用的
理论上,只要parcel数据按照java中的方式打包,应该不会有问题,确定你的handle是代理端通过deletepackage传过来的那个deletePackageObserver的handle。
可以在ioctl里抓一下双方通信的数据,然后再对照一下,是否哪里不完整。
能力值:
( LV2,RANK:10 )
15 楼
感谢,目前的情况估计是读取Binder Handle时出的问题,毕竟在Parcel中有readstrongbinder方法,我是自己读取的。