利用soot插装Android App

1.下载soot的相关jar包,并将其导入eclipse中:

在Eclipse中导入jar包的方法:右键项目->Build Path->Add External Achieves

然后选择单个或多个的,对应的库;

2.下载不同版本的Android标准库https://github.com/Sable/android-platforms

Soot利用这些标准库来解析所插装的应用程序的类型。

3.官方给的一个测试例:

import java.util.Iterator;

import java.util.Map;

 

import soot.Body;

import soot.BodyTransformer;

import soot.Local;

import soot.PackManager;

import soot.PatchingChain;

import soot.RefType;

import soot.Scene;

import soot.SootClass;

import soot.SootMethod;

import soot.Transform;

import soot.Unit;

import soot.jimple.AbstractStmtSwitch;

import soot.jimple.InvokeExpr;

import soot.jimple.InvokeStmt;

import soot.jimple.Jimple;

import soot.jimple.StringConstant;

import soot.options.Options;

 

 

public class AndroidInstrument {

public static void main(String[] args) {

//告知Soot装载Android apk文件

Options.v().set_src_prec(Options.src_prec_apk);

//告知Soot输出一个Dex/APK 文件

Options.v().set_output_format(Options.output_format_dex);

        // 告诉Soot装着两个类,我们在插装的时候需要这两个类,但可能被插装的APK不需要这两个类

Scene.v().addBasicClass("java.io.PrintStream",SootClass.SIGNATURES);

        Scene.v().addBasicClass("java.lang.System",SootClass.SIGNATURES);

 

        PackManager.v().getPack("jtp").add(new Transform("jtp.myInstrumenter", new BodyTransformer() {

 

@Override

protected void internalTransform(final Body b, String phaseName, @SuppressWarnings("rawtypes") Map options) {

final PatchingChain<Unit> units = b.getUnits();

//important to use snapshotIterator here

for(Iterator<Unit> iter = units.snapshotIterator(); iter.hasNext();) {

final Unit u = iter.next();

u.apply(new AbstractStmtSwitch() {

public void caseInvokeStmt(InvokeStmt stmt) {

InvokeExpr invokeExpr = stmt.getInvokeExpr();

if(invokeExpr.getMethod().getName().equals("onDraw")) {

 

Local tmpRef = addTmpRef(b);

Local tmpString = addTmpString(b);

  // insert "tmpRef = java.lang.System.out;"

        units.insertBefore(Jimple.v().newAssignStmt(

                      tmpRef, Jimple.v().newStaticFieldRef(

                      Scene.v().getField("<java.lang.System: java.io.PrintStream out>").makeRef())), u);

 

        // insert "tmpLong = 'HELLO';"

        units.insertBefore(Jimple.v().newAssignStmt(tmpString,

                      StringConstant.v("HELLO")), u);

        

        // insert "tmpRef.println(tmpString);"

        SootMethod toCall = Scene.v().getSootClass("java.io.PrintStream").getMethod("void println(java.lang.String)");                    

        units.insertBefore(Jimple.v().newInvokeStmt(

                      Jimple.v().newVirtualInvokeExpr(tmpRef, toCall.makeRef(), tmpString)), u);

        

        //check that we did not mess up the Jimple

        b.validate();

}

}

});

}

}

 

 

}));

soot.Main.main(args);

}

 

    private static Local addTmpRef(Body body)

    {

        Local tmpRef = Jimple.v().newLocal("tmpRef", RefType.v("java.io.PrintStream"));

        body.getLocals().add(tmpRef);

        return tmpRef;

    }

    

    private static Local addTmpString(Body body)

    {

        Local tmpString = Jimple.v().newLocal("tmpString", RefType.v("java.lang.String"));

        body.getLocals().add(tmpString);

        return tmpString;

    }

}

4.带参数运行程序

-android-jars E:\\Soot\\Android_Flatforms

-process-dir E:\\Soot\\DeskClock\\bin\\DeskClock.apk

第一个路径为android标准库的路径,第二个路径为APK的路径



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值