編輯:關於Android編程
使用Xposed去Hook Android,最讓人頭痛的是怎麼樣才能找到合適的函數入口。
Xposed的作者rovo89在開發教程https://github.com/rovo89/XposedBridge/wiki/Development-tutorial裡說,有兩個方法:
Possibility one: Decompile it。rovo89說反編譯得到smali代碼很難閱讀。在沒有JEB之前確實是這樣。有了JEB和JD-GUI,反編譯apk不再是夢。當然,這裡涉及到另一個問題:很多程序是以odex打包的,而JEB只支持dex格式。所以需要將odex轉換成dex或jar。
smali可以將odex反編譯成.smali文件;dex2jar可以將dex變成jar文件。現在我們以CardManager.odex為例,對CardManager.odex進行反編譯。java -Xmx512m -jar baksmali-1.3.2.jar --api-level 12 -c:core.jar:bouncycastle.jar:ext.jar:framework.jar:android.policy.jar:services.jar:core-junit.jar -d framework/ -x framework.odex
即指定Java內存的大小,又指定了依賴項
package com.example.test;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import android.util.Log;
import dalvik.system.DexFile;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
/**
* Created by mbpeele on 2/24/16.
*/
public class PackageHooker {
private final XC_LoadPackage.LoadPackageParam loadPackageParam;
public PackageHooker(XC_LoadPackage.LoadPackageParam param) {
loadPackageParam = param;
try {
try {
hook();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
}
}
public void hook() throws IOException, ClassNotFoundException {
DexFile dexFile = new DexFile(loadPackageParam.appInfo.sourceDir);
Enumeration classNames = dexFile.entries();
while (classNames.hasMoreElements()) {
String className = classNames.nextElement();
if (isClassNameValid(className)) {
final Class clazz = Class.forName(className, false, loadPackageParam.classLoader);
for (Method method: clazz.getDeclaredMethods()) {
if (!Modifier.isAbstract(method.getModifiers())) {
XposedBridge.hookMethod(method, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
log("HOOKED: " + clazz.getName() + "\\" + param.method.getName());
}
});
}
}
}
}
}
public void log(Object str) {
SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
XposedBridge.log("[" + df.format(new Date()) + "]: "
+ str.toString());
}
public boolean isClassNameValid(String className) {
return className.startsWith(loadPackageParam.packageName)
&& !className.contains("$")
&& !className.contains("BuildConfig")
&& !className.equals(loadPackageParam.packageName + ".R");
}
}
以上代碼Copy自PackageHooker,鏈接在https://github.com/UMLGenerator/Android-UML-Generator/blob/f26521e9420d4be032c2e4a1a872ac0c945c7c2e/xposed/src/main/java/software/umlgenerator/PackageHooker.java
注:對於帶界面的APK,可以使用DDMS的Dump View快速找到對應的Package名稱。
Android的事件機制
一、理論概述最基本的操作類型:down 手指按下 move 手指在屏幕上移動 up 手指從屏幕上離開觸屏操作的順序:down->move->move->
Android 之仿IOS6開關
不知道童學們是不是喜歡,個人覺得還是可以的,直接上代碼:public class ToggleButton extends View { private Sprin
消息總線EventBus的基本使用(二十)
(一).前言:今天我們的項目繼續更新,今天我們主要講解消息總線EventBus的基本使用方法,後面一篇我們會從源碼的角度稍微分析一下實現過程。Fa
微信個人公眾號怎麼改名字 微信個人公眾號改名字教程
近日,微信悄然上線了個人公眾號改名功能,據悉,微信在原賬號名稱下方會有一行“個人類賬號一年內可主動修改一次名稱”的標注,每年只有一次