2016-07-17 4 views
1

Xposedのために "Hello world"アプリケーションを作成する必要があります。私はXposedによってIMEIを変更しようとしました。それはいくつかの方法をフック、一部ではない。問題はそれらのすべてをフックする方法ですか?Xposedはメソッドをフックしません

私はTelephonyManagerからIMEIを取り、それを示してテストアプリを作っ:

私は方法交換する方法を記述したより
telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); 
    tv.setText(telephonyManager.getDeviceId()); 

private void replaceImei(final XC_LoadPackage.LoadPackageParam loadPackageParam, 
         final String className, 
         final String methodName) 
{ 
    try { 
     XC_MethodHook.Unhook u = 
       XposedHelpers.findAndHookMethod(
         className, 
         loadPackageParam.classLoader, 
         methodName, 
         new XC_MethodReplacement() { 
          @Override 
          protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable { 
           XposedBridge.log("happy replaced " + methodHookParam.method.getName() 
             + " at " + methodHookParam.method.getDeclaringClass().getName()); 
           return "123456789"; 
          } 
         } 
       ); 

     if (u != null) { 
      XposedBridge.log("happy hooked " + u.getHookedMethod().getName() + " " 
        + u.getHookedMethod().getDeclaringClass().getCanonicalName()); 
     } 
    } catch (Exception e) { 
     XposedBridge.log("happy error " + e.getMessage()); 
     e.printStackTrace(); 
    } 
} 

をそして、それを使用:

@Override 
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { 

    XposedBridge.log("happy loaded app: " + loadPackageParam.packageName); 

    replaceImei(loadPackageParam, 
      "android.telephony.TelephonyManager", 
      "getDeviceId"); 
} 

それは動作します!

しかし、SettingsアプリでIMEIを見ると変わりません。 [OK]を、私は、SettingsアプリのAPKを取っapktoolことにより、ソースを抽出し、次のが見つかりました:

.line 86 
const-string v1, "imei" 

invoke-interface {v0}, Lcom/android/internal/telephony/Phone;->getImei()Ljava/lang/String; 

move-result-object v2 

invoke-direct {p0, v1, v2}, Lcom/android/settings/deviceinfo/ImeiInformation;->setSummaryText(Ljava/lang/String;Ljava/lang/String;)V 

だから、それはcom.android.internal.telephony.PhoneインタフェースからgetImei()メソッドを使用しています。設定アプリでPhoneProxygetImea()が引っ掛かったという記録を(上記のソースを見て)持って

replaceImei(loadPackageParam, 
      "com.android.internal.telephony.PhoneProxy", 
      "getImei"); 

    replaceImei(loadPackageParam, 
      "com.android.internal.telephony.PhoneBase", 
      "getImei"); 

    replaceImei(loadPackageParam, 
      "com.android.internal.telephony.gsm.GSMPhone", 
      "getImei"); 

    replaceImei(loadPackageParam, 
      "com.android.internal.telephony.imsphone.ImsPhone", 
      "getImei"); 

    replaceImei(loadPackageParam, 
      "com.android.internal.telephony.cdma.CDMAPhone", 
      "getImei"); 

ログ:

I/Xposed (6800): happy loaded app: com.android.settings 
I/Xposed (6800): happy hooked getDeviceId android.telephony.TelephonyManager 
I/Xposed (6800): happy hooked getImei com.android.internal.telephony.PhoneProxy 
、それはインターフェースのメソッドをフックすることは不可能ですので、私はこのインタフェースの in sourcesすべての実装を見つけました

何も起こりませんが、設定のIMEIは変更されませんでした。もちろん、私はアプリをインストールし、毎回電話を再起動しました。

[OK]を、私はこのタスクをbruteforceしようとしました:私はいくつかの他の方法を見つけて、それらも引っ掛けました。しかし、それは助けにはならない。

replaceImei(loadPackageParam, 
      "com.android.internal.telephony.gsm.GSMPhone", 
      "getPhoneId"); 

    replaceImei(loadPackageParam, 
      "com.android.internal.telephony.imsphone.ImsPhone", 
      "getPhoneId"); 

    replaceImei(loadPackageParam, 
      "com.android.internal.telephony.cdma.CDMAPhone", 
      "getPhoneId"); 

    replaceImei(loadPackageParam, 
      "com.android.internal.telephony.PhoneSubInfoController", 
      "getDeviceId"); 

    replaceImei(loadPackageParam, 
      "com.android.internal.telephony.PhoneSubInfoController", 
      "getImeiForSubscriber"); 

    replaceImei(loadPackageParam, 
      "com.android.internal.telephony.PhoneSubInfoController", 
      "getDeviceIdForPhone"); 

    replaceImei(loadPackageParam, 
      "com.android.internal.telephony.PhoneSubInfo", 
      "getDeviceId"); 

    replaceImei(loadPackageParam, 
      "com.android.internal.telephony.PhoneSubInfo", 
      "getImei"); 

    replaceImei(loadPackageParam, 
      "com.android.internal.telephony.PhoneSubInfoProxy", 
      "getImeiForSubscriber"); 

    replaceImei(loadPackageParam, 
      "com.android.internal.telephony.PhoneSubInfoProxy", 
      "getImei"); 

    replaceImei(loadPackageParam, 
      "com.android.internal.telephony.PhoneBase", 
      "getPhoneId"); 

アイデアはありますか?どうしたの?そして何をすべきか?

すべての実験は、Android 5.1.1搭載のNexus 4で行われました。

この質問から完全なソースはここにある:https://gist.github.com/tseglevskiy/d100898468b286e1fff214778c9609b3

アップデート1

実験の次の部分。私は、IXposedHookZygoteInitインターフェイスを実装することで、接合子の初期段階でいくつかのメソッドをフックすることが可能であることを発見しました。

private void replaceImeiInitZygote(final String className, 
            final String methodName) 
{ 
    try { 
     final Class<?> foundClass = XposedHelpers.findClass(className, null); 

     if (foundClass != null) { 
      XC_MethodHook.Unhook u = XposedHelpers.findAndHookMethod(foundClass, methodName, 

        new XC_MethodReplacement() { 
         @Override 
         protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable { 
          XposedBridge.log("happy replaced " + methodHookParam.method.getName() 
            + " at " + methodHookParam.method.getDeclaringClass().getName()); 
          return "123456789099999"; 
         } 
        }); 

      if (u != null) { 
       XposedBridge.log("happy hooked from initZygote " + u.getHookedMethod().getName() + " " 
         + u.getHookedMethod().getDeclaringClass().getCanonicalName()); 
      } 
     } 
    } catch (Exception e) { 
     XposedBridge.log("happy error " + e.getMessage()); 
     e.printStackTrace(); 
    } 
} 

をし、それを使用する:[OK]を、私はそれをしなかった

@Override 
public void initZygote(StartupParam startupParam) throws Throwable { 
    replaceImeiInitZygote(
      "android.telephony.TelephonyManager", 
      "getDeviceId"); 

    replaceImeiInitZygote(
      "com.android.internal.telephony.PhoneProxy", 
      "getImei"); 

    replaceImeiInitZygote(
      "com.android.internal.telephony.PhoneBase", 
      "getImei"); 

    replaceImeiInitZygote(
      "com.android.internal.telephony.gsm.GSMPhone", 
      "getImei"); 

    replaceImeiInitZygote(
      "com.android.internal.telephony.imsphone.ImsPhone", 
      "getImei"); 

    replaceImeiInitZygote(
      "com.android.internal.telephony.cdma.CDMAPhone", 
      "getImei"); 

} 

ログでは、それはいくつかのメソッドをフック:

I/Xposed ( 198): happy hooked from initZygote getDeviceId android.telephony.TelephonyManager 
I/Xposed ( 198): happy hooked from initZygote getImei com.android.internal.telephony.PhoneProxy 

をしかし、idが設定アプリでIMEIを変更しません。また、どうしましたか?

答えて

1

まあ、ほとんどやった! getImei()をフックしようとしていますが、実際にはシステムによって呼び出されることはありません。代わりにgetDeviceId()を使用して、同じデータを返します。設定でIMEIを変更するには

はこのスニペットを試して、それは魔法のように動作:

findAndHookMethod(
     "com.android.internal.telephony.gsm.GSMPhone", 
     lpparam.classLoader, 
     "getDeviceId", 
     new XC_MethodReplacement() { 
      @Override 
      protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { 
       XposedBridge.log("NEW IMEI!!! com.android.internal.telephony.gsm.GSMPhone.getDeviceId()"); 
       return "111111111111111"; 
      } 
     } 
); 

ところで、あなたも、これらのメソッドをフックすることができます

com.android.internal.telephony.PhoneSubInfo.getDeviceId() 
com.android.internal.telephony.gsm.GSMPhone.getDeviceId() 
com.android.internal.telephony.cdma.CDMAPhone.getDeviceId() 
com.android.internal.telephony.imsphone.ImsPhone.getDeviceId() 
com.android.internal.telephony.sip.SipPhone.getDeviceId() 

乾杯を!

+0

素晴らしい仕事、ありがとう! Btw、なぜ私はgetImei()をsmaliで見るが、getDeviceId()をフックする必要があるか? – tse

関連する問題