选自:
插桩的概念是以静态的方式修改第三方的代码,也就是从编译阶段,对源代码(中间代码)进行编译,而后重新打包,是静态的篡改;
而hook则不需要再编译阶段修改第三方的源码或中间代码,是在运行时通过反射的方式修改调用,是一种动态的篡改根据上文的内容,我们基本可以总结出Cydia Substrate的使用步骤,在本章节继续做一些演练
Cydia Substrate的使用一般步骤
- AndroidManifest.xml配置使用Cydiasubstrate相关的配置与权限
- 获取欲勾的第三方包的类名
- 主类操作,其中initialize()是初始化相关东西,这个相当于main函数入口
- 安装测试
实战演练c:金额修改——勾他人应用
http://pan.baidu.com/s/1c27c1EC
在本环节,我们创建一个as工程,而后用hook去修改他的值,主要是修改正常软件中方法的返回值
- 正常程序
代码很简单,模拟一般游戏的get方法,返回一个int类型的数据,一般用来当作游戏中的金币数量。
然后在onCreate中调用这个方法:
在调用方法前后,对数据都有打印,这样我们就可以很方便的查看数据是否改变了。
package com.example.testhook;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("开始执行了");
int bb=getMoney();
System.out.println("现在是新版本的aa为-->"+bb);
}
public int getMoney(){
int aa=10;
System.out.println("这里还是初始化的aa为-->"+aa);
return aa;
}
}
好了,测试工程基本就这样了,那么我们安装看一下log日志:
- AndroidManifest.xml配置使用Cydiasubstrate相关的配置与权限
- 获取欲勾的第三方包的类名
com.example.testhook.MainActivity - 主类操作,其中initialize()是初始化相关东西,这个相当于main函数入口
package com.example.cydiaexample;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import android.util.Log;
import android.widget.Toast;
import com.saurik.substrate.MS;
import com.saurik.substrate.MS.ClassLoadHook;
//hook 方法
public class Main {
public static void initialize() {
//定义我们需要hook的类
MS.hookClassLoad("com.example.testhook.MainActivity", new MS.ClassLoadHook() {
@Override
public void classLoaded(Class<?> arg0) {
// TODO Auto-generated method stub
//定义方法
Method log;
try {
//hook getMoney的方法
log=arg0.getMethod("getMoney", null);
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
log=null;
e.printStackTrace();
}
if(log!=null){
final MS.MethodPointer old = new MS.MethodPointer();
MS.hookMethod(arg0, log, new MS.MethodHook() {
@Override
public Object invoked(Object arg0, Object... arg1)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("i am in---------->");
System.out.println("i am going to fuck ---->");
//调用原getMoney方法,将原方法的返回值放到aa中
int aa=(Integer) old.invoke(arg0, arg1);
//修改aa为999999,即原方法返回值已经修改掉了
aa=9999999;
//返回aa
return aa;
}
},old);
}
}
});
}
}
- 安装测试
实战演练d: 简单android病毒分析并实现其效果——修改系统api
今天在群里看到大家发的一个链接,一个病毒的显示方式,挺好玩的,模仿写了下。http://mt.sohu.com/20150517/n413220620.shtml?qq-pf-to=pcqq.c2c
- AndroidManifest.xml配置使用Cydiasubstrate相关的配置与权限
获取欲勾的第三方包的类名根据截图来看,主要也就是文字方面的更改,那么我们可以直接考虑Android中如何给TextView进行赋值的操作。TextView.setText(CharSequence)
android.widget.TextView主类操作,其中initialize()是初始化相关东西,这个相当于main函数入口
public class Main {
public static void initialize() {
MS.hookClassLoad("android.widget.TextView", new MS.ClassLoadHook() {
@Override
public void classLoaded(Class<?> arg0) {
// TODO Auto-generated method stub
Method smstest ;
try {
smstest=arg0.getMethod("setText", CharSequence.class);
} catch (SecurityException e) {
// TODO Auto-generated catch block
smstest=null;
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
smstest=null;
e.printStackTrace();
}
if(smstest!=null){
final MS.MethodPointer old = new MS.MethodPointer();
MS.hookMethod(arg0, smstest, new MS.MethodHook() {
@Override
public Object invoked(Object arg0, Object... arg1)
throws Throwable {
// TODO Auto-generated method stub
Log.d("ggz","i am hook in------->");
String bb=(String)arg1[0];
Log.d("ggz","string is----->"+bb);
bb="爱破解,爱鬼哥";
Log.d("ggz","now string is --->"+bb);
return old.invoke(arg0, bb);
}
}, old);
}
}
});
}
}
- 安装测试