首页
社区
课程
招聘
[求助]关于HOOK手机的IMEI
发表于: 2012-10-23 16:44 15410

[求助]关于HOOK手机的IMEI

2012-10-23 16:44
15410
一般手机apk程序获得IMEI的Java代码如下:
TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String imei = mTelephonyMgr.getDeviceId();
所以我想通过Api的Hook来修改掉getDeviceId()函数的返回值,
我在查看Android源码中发现
TelephonyManager类只是调用了
IPhoneSubInfo.aidl
所以getDeviceId()的实现部分应该在系统服务中,
Android里跨进程通信是通过Binder,
所以想通过Hook系统的ioctl函数,把传输的IMEI值修改掉,
可是我老找不到这个IMEI值的缓冲区地址,
我是用IDA加载系统进程"com.android.phone"来查找的,
有哪位朋友做过类似的可以交流一下

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 113
活跃值: (703)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
什么意思,不就是要改IMEI吗,直接在GETDEVICEID的下一句话把结果改成你要的不就得了吗,至于弄那么麻烦嘛
2012-10-25 13:25
0
雪    币: 183
活跃值: (228)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这样做不到通用性撒
2012-11-18 16:05
0
雪    币: 30
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我也在做这样子的事情,不知道你解决了没,我想着可以通过hook ioctl,从ioctl的参数上入手
2013-5-29 09:01
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
能实现这个功能不咯,替换 TelephonyManager
的返回值?MCC,MNC,LAC,CID,换成我指定的。
2013-7-29 11:57
0
雪    币: 112
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
hook 这个有啥意思呢
2013-8-8 14:36
0
雪    币: 224
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你好,兄弟,你这个完成了吗?我也有相同的需求,能指点一下嘛?
2013-9-11 09:30
0
雪    币: 53
活跃值: (280)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
要去看binder打包时候的数据结构,ioctl发送/接收的数据buffer是binder_write_read类型,
ioctl执行完成后,可以从其中取出read_buffer,它本身就是一个Parcell数据对象,里边存储的结构要根据binder服务端的处理来读出来

其实就是先读_reply.readException(); 再读_result = _reply.readString(),后边读出来的这个unicode string就是IMEI,这两个read接口在Parcel里边有实现,直接去Parcel类里边看看就了解了。

客户端调用
public String getDeviceId() throws RemoteException
      {
        Parcel _data = Parcel.obtain();
        Parcel _reply = Parcel.obtain();
        String _result;
        try {
          _data.writeInterfaceToken("com.android.internal.telephony.IPhoneSubInfo");
          this.mRemote.transact(1, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readString();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
服务端响应
case 1:
        data.enforceInterface("com.android.internal.telephony.IPhoneSubInfo");
        String _result = getDeviceId();
        reply.writeNoException();
        reply.writeString(_result);
        return true;
2013-9-13 18:34
0
雪    币: 43
活跃值: (388)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
9
这个要么改系统代码,要么Hook Native,要么篡改vm。
我破解一些软件的试用权的时候曾做过类似的事情,就是新建一个类Landroid/telephony/AelephonyManager,
其中的getDeviceId()做成静态,用于返回自定义的IMEI,然后把待破解软件smali,然后插入AelephonyManager,然后把所有的Landroid/telephony/TelephonyManager->getDeviceId()批量修改成Landroid/telephony/AelephonyManager->getDeviceId()的静态调用.这就成功了.
不过这个方法在一些验证签名的软件上行不通.
2013-9-14 15:38
0
游客
登录 | 注册 方可回帖
返回
//