[Soot-list] Inserting Log.i() in jimple..
Modhi Alsobiehy
m99m20 at hotmail.com
Mon Sep 1 03:15:41 EDT 2014
Hi all,
I am trying to insert jimple statement to log some calls in android apks.
the statement is a regular andoid Log.i() statement,,
I followed the following tutorials:
http://www.sable.mcgill.ca/soot/tutorial/profiler/
http://www.bodden.de/2013/01/08/soot-android-instrumentation/
However, I'm getting the following exceptions, the first one occurs when I remove loadClassAndSupport("android.util.Log") call,,
the second exception occurs when the loadClassAndSupport("android.util.Log") statement is present.
I checked the classpath and every required jar is present in the buildpath of the project [recent soot-trunk and android jars],,
1- is the code I am using to insert the Log.i() statement correct??
2- if it correct, why I'm getting these exceptions?
Your quick response is highly appreciated!
Thank you,,
Modhi
Exceptions:
------------
1) Exception in thread "main" java.lang.RuntimeException: tried to get nonexistent field <android.util.Log: int i>
at soot.Scene.getField(Scene.java:611)
at androidInstrument.AndroidInstrument$1$1.caseInvokeStmt(AndroidInstrument.java:78)
at soot.jimple.internal.JInvokeStmt.apply(JInvokeStmt.java:100)
at androidInstrument.AndroidInstrument$1.internalTransform(AndroidInstrument.java:60)
at soot.BodyTransformer.transform(BodyTransformer.java:51)
at soot.Transform.apply(Transform.java:105)
at soot.BodyPack.internalApply(BodyPack.java:49)
at soot.Pack.apply(Pack.java:126)
at soot.PackManager.runBodyPacks(PackManager.java:903)
at soot.PackManager.runBodyPacks(PackManager.java:583)
at soot.PackManager.runBodyPacks(PackManager.java:486)
at soot.PackManager.runPacksNormally(PackManager.java:463)
at soot.PackManager.runPacks(PackManager.java:389)
at soot.Main.run(Main.java:203)
at soot.Main.main(Main.java:146)
at androidInstrument.AndroidInstrument.main(AndroidInstrument.java:126)
2) Exception in thread "main" soot.SootResolver$SootClassNotFoundException: couldn't find class: android.util.Log (is your soot-class-path set properly?)
at soot.SootResolver.bringToHierarchy(SootResolver.java:219)
at soot.SootResolver.bringToSignatures(SootResolver.java:255)
at soot.SootResolver.processResolveWorklist(SootResolver.java:168)
at soot.SootResolver.resolveClass(SootResolver.java:129)
at soot.Scene.loadClass(Scene.java:673)
at soot.Scene.loadClassAndSupport(Scene.java:658)
at androidInstrument.AndroidInstrument.main(AndroidInstrument.java:40)
Code snippets:
----------------
G.reset();
final String androidJar = "D:/AndroidADT/adt-bundle-windows-x86_64-20131030/sdk/platforms/";
List<String> argsList = new ArrayList<String>(Arrays.asList(args));
Scene.v().loadClassAndSupport("android.util.Log");
Scene.v().addBasicClass("android.util.Log",SootClass.SIGNATURES);
Scene.v().addBasicClass("java.lang.System",SootClass.SIGNATURES);
PackManager.v().getPack("jtp").add(new Transform("jtp.myInstrumenter", new MyBodyTransformer()
{
@Override
protected void internalTransform(final Body b, String phaseName, Map options)
{
final PatchingChain<Unit> units = b.getUnits();
//using snapshotIterator
for(Iterator<Unit> iter = units.snapshotIterator(); iter.hasNext();)
{
final Unit u = iter.next();
u.apply(new AbstractStmtSwitch()
{
public void caseInvokeStmt(InvokeStmt stmt)
{
if(stmt.toString().equals(targetStmt))
{
Local tmpRef = addTmpRef(b);
Local tmpString1 = addTmpString1(b);
Local tmpString2 = addTmpString2(b);
// inserting "tmpRef = android.util.Log.i;"
units.insertAfter(Jimple.v().newAssignStmt(
tmpRef, Jimple.v().newStaticFieldRef(
Scene.v().getField("<android.util.Log: int i>").makeRef())), u);
// inserting "tmpString1 = stmt.getUseBoxes().toString();"
String stmtStr = stmt.getUseBoxes().toString();
units.insertAfter(Jimple.v().newAssignStmt(tmpString1,
StringConstant.v(stmtStr)), u);
// inserting "tmpString2 = stmt.getUseBoxes().get(1).getValue().toString();"
stmtStr = stmt.getUseBoxes().get(1).getValue().toString();
units.insertAfter(Jimple.v().newAssignStmt(tmpString2,
StringConstant.v(stmtStr)), u);
// insert "tmpRef.i(tmpString1,tmpString2);"
SootMethod toCall = Scene.v().getSootClass("android.util.Log").getMethod("int i(java.lang.String,java.lang.String");
units.insertAfter(Jimple.v().newInvokeStmt(
Jimple.v().newVirtualInvokeExpr(tmpRef, toCall.makeRef(), tmpString1, tmpString2 )), u);
//check that we did not mess up the Jimple
b.validate();
---------------
Other methods:
---------------
static Local addTmpRef(Body body)
{
Local tmpRef = Jimple.v().newLocal("tmpRef", RefType.v("android.util.Log"));
body.getLocals().add(tmpRef);
return tmpRef;
}
static Local addTmpString1(Body body)
{
Local tmpString = Jimple.v().newLocal("tmpString1", RefType.v("java.lang.String"));
body.getLocals().add(tmpString);
return tmpString;
}
static Local addTmpString2(Body body)
{
Local tmpString = Jimple.v().newLocal("tmpString2", RefType.v("java.lang.String"));
body.getLocals().add(tmpString);
return tmpString;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.CS.McGill.CA/pipermail/soot-list/attachments/20140901/b33c5d17/attachment-0002.html
More information about the Soot-list
mailing list