接上节那个demo,我们简单学习下smali语法,可以自己去google上搜,看雪论坛的这篇就不错。
在google code上下载用到的jar包,地址https://code.google.com/p/smali/downloads/list
java -jar baksmali-2.0b4.jar Hell.dex
默认在当前目录下生成out 文件夹,里面有Hell.smali文件。
1 .class public LHell; 2 .super Ljava/lang/Object; 3 4 # static fields 5 .field private static final HELL:Ljava/lang/String; = "bupt" 6 7 # direct methods 8 .method public constructor <init>()V 9 .registers 1 10 invoke-direct {p0}, Ljava/lang/Object;-><init>()V 11 return-void 12 .end method 13 14 .method public static main([Ljava/lang/String;)V 15 return-void 16 .end method 17 18 # virtual methods 19 .method public sayNothing(Ljava/lang/String;)V 20 return-void 21 .end method
V | void |
Z | boolean |
B | byte |
S | short |
C | char |
I | int |
J | long |
F | float |
D | double |
L | Java类类型 |
[ | 数组类型 |
没什么可说的,跟上节的java代码一对比就能懂!
想找突破口太难了!!反编译完当当读书后,
经过一番查找,我发现com.dangdang.reader.c 包下有一个a.smali文件,里面有一些android Log调试信息。太好了!!!
103行定义了一个方法
public static void a(String, String)
方法用到了一个局部变量寄存器v0,
106行得到c的值然后赋给寄存器v0
108行判断v0是否等于0,如果v0等于0,跳转到cond_0标号处,程序返回,如果v0不等于0,调用android的Log.i("", "")方法。
我们可以把第108行代码删掉,是程序无条件执行Log方法。或者我们往上找c的值,将c初值设为1.
很明显,这是构造函数,第31行,我们把const/4 v0, 0x0改为const/4 v0, 0x1
重新打包、签名,生成新的apk,在ddms里我们会看到打印出的当当电子书日志。
总算有点进步了。