能力值:
( LV2,RANK:10 )
|
-
-
2 楼
什么意思,不就是要改IMEI吗,直接在GETDEVICEID的下一句话把结果改成你要的不就得了吗,至于弄那么麻烦嘛
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
这样做不到通用性撒
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
我也在做这样子的事情,不知道你解决了没,我想着可以通过hook ioctl,从ioctl的参数上入手
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
能实现这个功能不咯,替换 TelephonyManager
的返回值?MCC,MNC,LAC,CID,换成我指定的。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
hook 这个有啥意思呢
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
你好,兄弟,你这个完成了吗?我也有相同的需求,能指点一下嘛?
|
能力值:
( 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;
|
能力值:
( LV9,RANK:140 )
|
-
-
9 楼
这个要么改系统代码,要么Hook Native,要么篡改vm。
我破解一些软件的试用权的时候曾做过类似的事情,就是新建一个类Landroid/telephony/AelephonyManager,
其中的getDeviceId()做成静态,用于返回自定义的IMEI,然后把待破解软件smali,然后插入AelephonyManager,然后把所有的Landroid/telephony/TelephonyManager->getDeviceId()批量修改成Landroid/telephony/AelephonyManager->getDeviceId()的静态调用.这就成功了.
不过这个方法在一些验证签名的软件上行不通.
|
|
|