首页
社区
课程
招聘
[求助]在binder拦截中如何回调writeStrongBinder的binder handle????
发表于: 2013-11-20 15:36 10895

[求助]在binder拦截中如何回调writeStrongBinder的binder handle????

2013-11-20 15:36
10895
假设有这样的场景:

Settings应用去卸载一个android应用,会远程调用packageManager服务的deletePackage方法。

deletePackage方法有3参数:包名(String16)、flags和packageDeleteObserver的binder对象。

我在packageManager服务处理之前将该远程调用拦截后,可以读取到packageDeleteObserver这个代理对象的handle,但是我自己使用这个handle进行远程调用时,总是错误,应用层返回的错误是FAILED_REPLY,在sys/kernel/debug/binder/failed_transaction_log中可以找到这样的记录:0: async from 3868:3884 to 0:0 node 0 handle 271 () size 148:0 dex 1 start 6901.588186

我在看binder的时候,绕过了kernel层驱动这部分,所以找不到原因。

跪求各位大神指点啊~~~~~~~~~ 拜谢啊~~~~~~~~~拜谢~~~~~~~~~~~~

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 181
活跃值: (45)
能力值: ( 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的代码中扣出来的。
2013-11-20 16:43
0
雪    币: 181
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
按照我的理解 这个思路是没有问题的,但是总是失败~~~~~~~~~~~

0: async from 3868:3884 to 0:0 node 0 handle 271 () size 148:0 dex 1 start 6901.588186

从这个记录来看 ,貌似是服务不在了~~~~~~~~~

大神们 求指教啊~~~~~~~~~~~~ 拜谢啊拜谢~~~~~~~~~~
2013-11-20 16:47
0
雪    币: 181
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
求大神 现身~~~~~~~~~~~
2013-11-20 20:31
0
雪    币: 77
活跃值: (25)
能力值: ( 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);
2013-11-22 11:09
0
雪    币: 181
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这段代码 就是向驱动发消息的~~~~~~~~~
2013-11-22 21:00
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hqy
7
如果是拦截OnTransact,那直接调用HOOK时保存的原远程代理对象的OnTransact就行了,我在拦截通知推送服务的时这么试过。
2013-11-23 14:10
0
雪    币: 77
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
binder驱动中存在两个binder对象,一个是服务端的binder另一个是binder驱动中的binder对象,会不会是拦截错对象了?
2013-11-24 12:29
0
雪    币: 181
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
拦截的是libbinder.so库中的ioctl,你说这个是C++里的东西。

请问你是怎么拦截的OnTransact?????????????????
2013-11-25 16:28
0
雪    币: 181
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
binder通信在传输binder对象时,传输的是flag_binder_obj这个结构体,这个结构中有个域Type,用来描述传输的是啥东西,有这样几个类型:

HANDLE、Binder、WeakBinder等(记不清),这读取的时候类型确实是Handle,即服务的代理。
2013-11-25 16:33
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hqy
11
我是在JAVA层拦截的..看来和你不是同一个路子。
我拦截OnTransact就是因为
android.app.NotificationManager类有静态成员sService,他的类型是android.app.INotificationManager

它有个成员叫mRemote,类型为IBinder。
自己继承Binder搞一个类,然后用此类的对象覆盖mRemote即可。
2013-11-25 17:03
0
雪    币: 181
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
你好 请问你是怎么做到“自己继承Binder搞一个类,然后用此类的对象覆盖mRemote即可。 ”这个的?

难道是先在本地成注入,然后在注入到java中???(注入这个叫法是我自己叫的,不一定准确)

你这个实际上拦截的是代理对象(java层的),对吧?
2013-11-25 17:14
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hqy
13
是你说的这样,拦截的是代理。
2013-11-25 19:56
0
雪    币: 53
活跃值: (280)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
“我使用获取到的deletePackageObserver代理对象handle,调用packageDeleted方法,代码如下:”
lz 拦截的是system_server 吗? 这个回调是在packagemanagerser里边调用的
理论上,只要parcel数据按照java中的方式打包,应该不会有问题,确定你的handle是代理端通过deletepackage传过来的那个deletePackageObserver的handle。

可以在ioctl里抓一下双方通信的数据,然后再对照一下,是否哪里不完整。
2013-11-25 23:09
0
雪    币: 181
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
感谢,目前的情况估计是读取Binder Handle时出的问题,毕竟在Parcel中有readstrongbinder方法,我是自己读取的。
2013-12-3 10:25
0
游客
登录 | 注册 方可回帖
返回
//