这是基于Cydia的可以修改Java相关方法的框架。
官网地址:http://www.cydiasubstrate.com/
话不多说,直接来演示下官方的例子,例子的地址为:http://www.cydiasubstrate.com/id/20cf4700-6379-4a14-9bc2-853fde8cc9d1/
首先下载Cydia Substrate SDK。
然后在手机上面安装Cydia Substrate,如下:
新建Android工程,导入SDK里面的substrate-api.jar。
配置AndroidManifest.xml文件:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application> <meta-data android:name="com.saurik.substrate.main" android:value=".Main"/> </application> <uses-permission android:name="cydia.permission.SUBSTRATE"/> </manifest>
为了让我们的代码能够加载,必须设置cydia.permission.SUBSTRATE权限,并且设置加载的主类。
编写初始化函数:
initialize()是初始化函数,代码加载完自动调用。
设置需要hook的类,如下:
public class Main { static void initialize() { MS.hookClassLoad("android.content.res.Resources", new MS.ClassLoadHook() { public void classLoaded(Class<?> resources) { // ... code to modify the class when loaded } }); } }
确定需要hook的方法,并设置参数类型,进行hook处理。
public void classLoaded(Class<?> resources) { Method getColor; try { getColor = resources.getMethod("getColor", Integer.TYPE); } catch (NoSuchMethodException e) { getColor = null; } if (getColor != null) { final MS.MethodPointer old = new MS.MethodPointer(); MS.hookMethod(resources, getColor, new MS.MethodHook() { public Object invoked(Object resources, Object... args) throws Throwable { int color = (Integer) old.invoke(resources, args); return color & ~0x0000ff00 | 0x00ff0000; } }, old); } }
以上代码说明需要hook的方法是getColor,有一个Integer参数。然后获取原始方法的指针,进行hook,调用自己制定的函数,首先调用原来的函数获取颜色的值,然后修改颜色的值并返回,这样就达到了hook的效果。
安装前首先点击:
然后安装刚刚编写的apk,点击软件重启。
再来看看界面的字体颜色变化。
发现颜色已经被修改了。
系统的函数可以hook,安装的应用程序当然也能hook了。
首先写一个简单的Android应用,通过函数返回Coin的值,默认为0.
package com.monkey.getcoin;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView)findViewById(R.id.coin);
tv.setText(“Coin value is:”+getCoin());
}
public int getCoin(){
return 0;
}
}
要么我们要hook的类为com.monkey.getcoin.MainActivity,要hook的方法为getCoin,参数为null;
按照上面的代码,调用原来的函数 int coin = (Integer) old.invoke(resources, args);
然后修改值为99999, coin = 99999; 然后return coin;
然后再运行应用:
如果是游戏,可以根据反编译的代码来hook指定的方法修改值来达到自己想要的结果。
如果参数有多个,类似于:
getClock(Context context,byte[] params)
这种应该怎么写。
arg0.getMethod(“getClock”, Context.class,byte[].class);
这样写就行了。