Может ли Xposed записывать текущее имя метода?
Я хочу протестировать приложение, но оно слишком велико для статического подхода.
Я начал гуглить. Я нашел интересный инструмент под названием Xposed Framework.
Я прочитал много документов / примеров. Но я не могу найти theads о получении имени метода приложения.
Моя цель - записать текущее имя метода, когда я нажимаю кнопку в приложении. Какие параметры отправляются при вызове методов?
Для получения дополнительной информации приложение, которое я хочу протестировать, является приложением чата. Я хочу проверить, безопасно ли это использовать? Правда ли, что разработчики утверждают, что приложение использует бла-бла-бла-шифрование? Это реальное сквозное шифрование?
В зависимости от приложения, мне нужны инструменты, которые помогут мне проанализировать это. Когда я отправляю сообщение, какие методы вызываются? какие значения отправляются вместе с?
2 ответа
Если это с открытым исходным кодом, вы можете легко вставить несколько журналов в исходный код и перекомпилировать. Некоторые инструменты покрытия кода позволяют регистрировать выполненные методы, но я не уверен в параметрах (например, покрытие EMMA).
Если это закрытый исходный код, то вы можете сделать это с помощью Xposed, но у него есть некоторые проблемы. Xposed позволяет подключать методы Java, если это открытый код, вы можете найти конкретные методы, которые вы хотите перехватить, и распечатать их параметры. Если это закрытый исходный код, вы всегда можете проверить имена методов, декомпилировав приложение с помощью apktool.
Посмотрите учебник Xposed о том, как регистрировать хуки. Предполагая, что вы создали свой класс, который расширяет 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 для их представления, но это также имеет ограничения (например, вы не можете часто обрабатывать циклы ссылок).
Наконец, будьте осторожны с тем, какой метод вы подключаете, так как часто вызываемые и регистрирующие методы влияют на производительность приложения.
Удачи!
Новый модуль Xposed под названием Inspeckage выполняет (среди многих других полезных проверок) то, что вы хотите сделать: вы можете использовать его для подключения любого метода и представления и даже для изменения его ввода и вывода.