2016-08-29 6 views
0

アプリケーションをテストしたいのですが、静的なアプローチでは大きすぎます。Xposedログの現在のメソッド名を使用できますか?

私はグーグルを始めました。 Xposed Frameworkという面白いツールが見つかりました。

私は多くのドキュメント/例を読んでいます。しかし、私はアプリケーションのメソッド名を取得することについてtheadを見つけることはできません。

私の目的は、アプリでボタンを押すと、現在のメソッド名を記録することです。メソッドが呼び出されたときに送信されるパラメータはどれですか?

詳細については、私がテストしたいアプリケーションはチャットアプリケーションです。私はそれが使用するために確保されていることを確認したいですか?デベロッパーがアプリケーションで曖昧な暗号化を使用していると主張しているのは本当ですか?実際のエンドツーエンド暗号化ですか?

大規模なアプリケーションによると、私はこれを分析するのに役立つツールが必要です。メッセージを送信するとき、どのメソッドが呼び出されますか?一緒に送られる値は?

+0

アプリケーションはあなたのものですか? – Karakuri

+0

それは私のものではありません。しかしそれはオープンソースのものです。 – kise

+0

オープンソースの場合は、Xposedにフックするのではなく、直接変更する方が簡単です。とにかくあなたはJavaとAndroid開発のノウハウが必要です。 – Robert

答えて

1

オープンソースの場合、ソースコードにいくつかのログを簡単に挿入して再コンパイルできます。一部のコードカバレッジツールでは、実行されたメソッドをログに記録できますが、パラメータについてはわかりません(例:EMMA coverage)。

クローズドソースの場合は、Xposedで実行できますが、いくつかの課題があります。 Xposedを使用すると、Javaメソッドをフックすることができます。opensourceの場合、パラメータを傍受して印刷する特定のメソッドを検索できます。クローズソースの場合は、アプリを逆コンパイルしてメソッド名を確認することができます。apktool

フックを登録する方法についてXposed tutorialを確認してください。あなたがXC_MethodHookを拡張するクラスを作成したと仮定すると、次のメソッドは、プリミティブのパラメータのトリックを行う必要があります。

@Override 
protected void afterHookedMethod(MethodHookParam param) throws Throwable { 

    String threadname = Thread.currentThread().getName(); 
    String d = _dateFormat.format(new Date()); 
    Class<?> cls = param.this.getClass(); 

    //Extend XC_MethodHook to receive the mthName in the constructor 
    //and store it as a static field. 

    Log.v("MethodInvocation", "[A][" + d + "]" 
      + "[" + cls.getName() + "." 
      + mthName 
      + "(" + args(param) + ")" + " = " + result(param) 
      + "]" + " [" + threadname + "]"); 
} 

public boolean shouldPrintContent(Object o) { 
    if (o.getClass().isPrimitive() 
     || o.getClass().getName().contains("java.lang")) 
      return true; 
    return false; 
} 

public String args(MethodHookParam param) { 
    String args = ""; 
    int counter = 0; 
    if (param != null) { 
     for (Object o : param.args) { 
      if (counter > 0) 
       args += ","; 

      // argument can be null 
      if (o == null) { 
       args += "null"; 


      } else { // if it is an object lets print its type and content. 
       args += printclean(o.getClass().getName()); 

       if (shouldPrintContent(o)) { 

        args += ":" + printclean(o.toString()); 
       } else 
        args += ":nonPrimitiveOrJavaLang"; 
      } 
      counter++; 
     } 
    } 
    return args; 
} 

//avoid identation chars in strings 
public String printclean(String str) { 
    char[] res = str.toCharArray(); 
    for (int i = 0; i < str.length(); i++) { 
     if (res[i] == '\n' || res[i] == '\r' || res[i] == '\t' 
       || res[i] == '[' || res[i] == ']') { 
      res[i] = '*'; 
     } 
    } 
    return String.valueOf(res); 
} 

public String result(MethodHookParam param) { 
    String res = ""; 
    Object retobj = param.getResult(); 
    if (retobj == null) { 
     res += "null"; 
    } else { 
     res += printclean(retobj.getClass().getName()); 

     if (shouldPrintContent(retobj)) { 
      res += printclean(retobj.toString()); 
     } else 
      res += "(nonPrimitiveOrJavaLang)"; 
    } 

    return res; 
} 

注意を任意のオブジェクトを印刷することは容易ではないということ。ここでは、プリミティブやその他のjava.langオブジェクトのような既知の型だけを出力しました。より複雑なオブジェクト(コレクションを含む)は、Gsonを使って表現することもできますが、これには制限があります(例えば、参照ループを扱うことができないなど)。

最後に、フッキングやロギングメソッドが頻繁に呼び出されるため、アプリケーションのパフォーマンスに影響するため、どのメソッドをフックするか注意してください。

幸運を祈る!

+0

ありがとうございました。私はそれを試してみます – kise

0

新しいXposed module called Inspeckageは、あなたがやりたいことを何でもしています:あなたはそれを使用してあらゆる方法をフックし、入力と出力を変更したり変更することさえできます。

関連する問題