Android安全–使用Cydia Substrate进行Java Hook

这是基于Cydia的可以修改Java相关方法的框架。

官网地址:http://www.cydiasubstrate.com/

话不多说,直接来演示下官方的例子,例子的地址为:http://www.cydiasubstrate.com/id/20cf4700-6379-4a14-9bc2-853fde8cc9d1/

 

首先下载Cydia Substrate SDK

然后在手机上面安装Cydia Substrate,如下:

2015-07-26_233050

 

新建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的效果。

安装前首先点击:

2015-07-26_233204

然后安装刚刚编写的apk,点击软件重启。

2015-07-27_000742

再来看看界面的字体颜色变化。

2015-07-27_001052

发现颜色已经被修改了。

 

系统的函数可以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;

image

然后再运行应用:

2015-07-28_185814

2015-07-28_185829

如果是游戏,可以根据反编译的代码来hook指定的方法修改值来达到自己想要的结果。

 

如果参数有多个,类似于:

getClock(Context context,byte[] params)

这种应该怎么写。

arg0.getMethod(“getClock”, Context.class,byte[].class);

这样写就行了。

本文链接:http://www.alonemonkey.com/cyidasubstrate.html