最近花点时间折腾了下Xposed框架,还挺有意思,这里记录下学习过程
0x01 Xposed介绍
Xposed是一个基于Android的Hook框架,他的基本原理大概是替换了系统的app_process,之后com.android.internal.osZygoteInit.main()被替换成了:de.robv.android.xposed.XposedBridge.main(), 以后fork出的进程都是被Hook的,后面利用XposedBridge.jar便可进行各种骚操作。
0x02 创建Xposed项目
Step 1.修改AndroidManifest.xml
创建一个空白的项目,在AndroidManifest.xml文件中增加如下代码:
<meta-data android:name="xposedmodule" android:value="true" /> <meta-data android:name="xposeddescription" android:value="描述" /> <meta-data android:name="xposedminversion" android:value="82" />
Step 2. 增加xposed依赖
在dependencies内增加
compileOnly 'de.robv.android.xposed:api:82'
Step 3. 自定义入口点
新建assets目录,增加xposed_init文件,内容为Xposed入口类。比如 spiders.example.com.myapplication.XposedMain
Xposed运行后会在xposed_init文件中读取Xposed入口,如上就会去寻找运行XposedMain类。Step 4. 编写Hook主函数
在此之前,先写一个简单的MainActivity,它用Toast显示一个字符串
public class MainActivity extends Activity { private String show = "unhooked!"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toast.makeText(this,this.show,Toast.LENGTH_LONG).show(); }
}
之后编写XposedMain.java,思路是先Hook MainActivity类中的onCreate函数,之后再调用函数之前修改show变量为hooked!,完成hook,代码如下:public class XposedMain implements IXposedHookLoadPackage { @Override public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { if(lpparam.packageName.equals("spiders.example.com.myapplication")){ XposedHelpers.findAndHookMethod("spiders.example.com.myapplication.MainActivity", lpparam.classLoader, "onCreate", Bundle.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { XposedBridge.log("before hook "); XposedHelpers.setObjectField(param.thisObject,"show","hooked!"); super.beforeHookedMethod(param); } }); }}}
Xposed折腾笔记(一)
最新推荐文章于 2024-06-11 09:53:18 发布