分享一个 破解android apk 软件的思路:
apk: 链接: http://pan.baidu.com/s/1jG3TUOe 密码: d1p4
首先,得打开软件,随便点点,看这个软件,到底干什么的,这个很重要
重要就在于:你要快速的找到关键字,,,就得从软件中的提示中寻找;
之后就看见这个, 点FREE 之后, 就进入输入code 随便输入,,就得到,一个提示;
看到 Invalid coupon code 之后,,,得看看,,运气好不好,这个是不是关键字
下面就用到,反编译的,工具 apkIDE 小米改之理, 需要java 环境
环境,自行搜索,jdk.1.7
找到关键字,,然然后先看看,java 代码,,
java 还是很容易看懂的 点 上边java ,,
就可以打开 jui ,java的反编译器,搜索关键字,就可以看代码了,,!!
paramVoid = (String)this.mResponse.get("status");
int i = ((Integer)this.mResponse.get("days")).intValue();
if (paramVoid.equals("success"))
{
dismissProgressDialog();
giveFreePremium(i);
return;
}
if (paramVoid.equals("expired"))
{
dismissProgressDialog();
Toast.makeText(HabbitsApp.getContext(), "Coupon code expired", 1).show();
return;
}
} while (!paramVoid.equals("invalid"));
dismissProgressDialog();
Toast.makeText(HabbitsApp.getContext(), "Invalid coupon code", 1).show();
return;
这个一段代码,,就是有关,这个关键词 ,逻辑的代码!
看到里边有有一个判断,参数 paramVoid 还有等于成功的,,,
if (paramVoid.equals("success"))
if (paramVoid.equals("expired"))
while (!paramVoid.equals("invalid"));</span>
smali 的阅读就得自己下功夫了,
搜 dalvik opcodes 就可以找到官方的指令符文档,
iget-object v3, p0, Lgui/premium/CouponVerificationTask;->mResponse:Ljava/util/Map;
const-string v4, "status"
invoke-interface {v3, v4}, Ljava/util/Map;->get(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v2
check-cast v2, Ljava/lang/String;
.line 101
.local v2, "status":Ljava/lang/String;
iget-object v3, p0, Lgui/premium/CouponVerificationTask;->mResponse:Ljava/util/Map;
const-string v4, "days"
invoke-interface {v3, v4}, Ljava/util/Map;->get(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v1
check-cast v1, Ljava/lang/Integer;
.line 102
.local v1, "daysStr":Ljava/lang/Integer;
invoke-virtual {v1}, Ljava/lang/Integer;->intValue()I
move-result v0
.line 104
.local v0, "days":I
const-string v3, "success"
invoke-virtual {v2, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v3
if-eqz v3, :cond_4
.line 105
invoke-direct {p0}, Lgui/premium/CouponVerificationTask;->dismissProgressDialog()V
.line 106
invoke-direct {p0, v0}, Lgui/premium/CouponVerificationTask;->giveFreePremium(I)V
goto :goto_0
我们看到“succes ” 之后调用的函数 giveFreePremium
就是一个成功要调用的函数
所以在判断前边,去修改:
修改的方式有很多:
- 直接注释
- 是改否,否改是;
- 把,判断参数改成你想要走那个分支, 的值;
- 其他牛逼的
invoke-virtual {v2, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v3
# if-eqz v3, :cond_4
.line 105
invoke-direct {p0}, Lgui/premium/CouponVerificationTask;->dismissProgressDialog()V
.line 106
invoke-direct {p0, v0}, Lgui/premium/CouponVerificationTask;->giveFreePremium(I)V
goto :goto_0
回编译,之后看FREE 随便输入,确定会后,看到有个时间限制!!!
书名,还没有改完
paramVoid = (String)this.mResponse.get("status");
int i = ((Integer)this.mResponse.get("days")).intValue();
if (paramVoid.equals("success"))
{
dismissProgressDialog();
giveFreePremium(i);
return;
}
java 代码中,giveFreePremium(i)
有个参数 i 找到她,,然后进入
private void giveFreePremium(int paramInt)
{
LocalDate localLocalDate = new LocalDate().plusDays(paramInt);
this.mStorePurchaseHelper.giveFreePremium("premium", localLocalDate);
if (paramInt < 365)
{
Toast.makeText(HabbitsApp.getContext(), "Congratulations !! You have got free premium till " + localLocalDate.toString(), 1).show();
return;
}
Toast.makeText(HabbitsApp.getContext(), "Congratulations !! You have got free premium", 1).show();
}
看到这个参数的判断
.line 125
const/16 v1, 0x16d
if-ge p1, v1, :cond_0
.line 126
invoke-static {}, Lgui/application/HabbitsApp;->getContext()Landroid/content/Context;
move-result-object v1
看到判断,有很多种改法,
也可以把if-ge p1,v1, :cond_0
改为 goto :cond_0
回编译
成功了!
高手很容易找到关键所在,这个要长期的积累才行,,
附上汉化破解,汉化后的软件
链接: http://pan.baidu.com/s/1eQ2GjkA 密码: tusn
小弟刚刚学习,学习笔记