Android反编译实战(4)

接上节那个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
Dalvik字节码类型描述符
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里我们会看到打印出的当当电子书日志。

总算有点进步了。

原文地址:https://www.cnblogs.com/feiyunruyue/p/3127051.html