反编译的步骤就不介绍了,咱们直接来看反编译获得的文件夹java
方法1:在smali目录下,咱们看到org/andengine/,能够知晓游戏是由andengine引擎开发的。打开/res/raw/atlas.txt文件,找到以下信息:编程
咱们直接把number_score_00 01....08的坐标值所有修改成number_score_09的坐标值,从新打包并签名apk,运行测试,0-9关分数一直为9分,10-99关分数一直为99分。app
方法2:打开string.xml,没有找到有用的信息,因为代码是被混淆过的,没法直接根据类名找关键代码。咱们换另外一种方式,查找string变量,用工具apk改之理打开apk文件,选中smali/com/dotgears/文件夹,在软件右侧面板,按以下操做:工具
在搜索结果中,有这样一条记录: ,咱们不妨猜想该字符串是用来获取分数的,双击来到所在文件,\com\dotgears\h.smali。关键代码以下:测试
# direct methods
.method static constructor <clinit>()V
.locals 1this
const-string v0, "0123456789".net
sput-object v0, Lcom/dotgears/h;->l:Ljava/lang/String;code
return-void
.end methodxml
为了测试咱们的猜想,直接将“0123456789”修改成“9999999999”,打包签名安装,运行测试,0-9关分数一直为9分,10-99关分数一直为99分。猜想正确。blog
sput-object v0, Lcom/dotgears/h;->l:Ljava/lang/String //将string类型的变量I赋值为“0123456789”
咱们在当前文件查找l:Ljava/lang/String, 在方法.method public a(II)V中发现调用,部分代码为:
sget-object v5, Lcom/dotgears/h;->l:Ljava/lang/String;
invoke-virtual {v5, v2}, Ljava/lang/String;->charAt(I)C
咱们转到反编译出的java代码来仔细看下该方法:
public void a(int paramInt1, int paramInt2) { this.k = 0; int m = paramInt1; if (paramInt2 <= 0); for (int i1 = 0; ; i1++) { if (i1 >= this.k) { if (this.k == 0) { this.i[0] = '0'; this.k = 1; } return; if (m <= 0); while (true) { paramInt2--; break; int n = m % 10; m /= 10; this.j[this.k] = l.charAt(n); this.k = (1 + this.k); } } this.i[i1] = this.j[(-1 + (this.k - i1))]; } }
根据编程经验,不妨猜想:
参数paramInt1为所得分数,paramInt2为所得分数位数
int n = m % 10; //获取分数低位
m /= 10; //获取分数高位
this.j[this.k] = l.charAt(n); //取分数
验证:咱们直接在该方法中对参数进行赋值,而后打包签名,安装测试便可。事实上,该方法的做用是实时更新界面上方的显示的分数。
经过修改此处的参数paramInt1的值,咱们就能够修改上方显示的分数,可是最终记录的分数仍然未改变,为此咱们必须找到该方法在哪里被程序调用,以及参数paramInt1是如何得来的。
打开ida,首先找到方法 (即上面的void a(int paramInt1, int paramInt2)),
双击来到该方法代码,按下回车键,点击jump to xref,即: ,点击ok,来到此处:
 
拉到最上面, ,在此处该方法被调用,咱们回到对应的java代码,找到相关调用以下:
this.an.a(this.y, 20);
即参数paramInt1为this.y,参数paramInt2固定取20。
继续往上搜索变量this.y,来到此处:
if ((this.ao > 0) && (this.ak <= 0) && ((this.ag == this.J.b) || (this.ag == -1 + this.J.b))) { this.y = (1 + this.y); c(9, 0); }
this.y在前面已被初始化为0,此处,if循环应为判断是否得分的条件,若是为真,则分数加1。显然,咱们直接将1修改成咱们所但愿的增加分数便可。打开对应的smali文件:/dotgears/flappy/c.smali,修改第489行代码:
add-int/lit8 v0, v0, 0x1 -> add-int/lit8 v0, v0, 0x* //*为你所但愿的增加分数(16进制)
从新打包,签名安装,测试经过。
附上使用的工具和修改后的包:
工具下载地址:http://pan.baidu.com/s/1ntyk1uT
修改后的包:http://pan.baidu.com/s/12AAq6
原始apk:http://pan.baidu.com/s/1jGsQTfS
Flappy Bird(安卓版)逆向分析(二):http://my.oschina.net/auo/blog/205286