前几天研究了火柴联盟的验证。
从网上得到火柴人联盟V1.5.3 的Apk,用Killer重新编译后就出现这种情况:
感谢群里的各路大神提醒,这个是网络验证的。我模拟器没有网,破解内购后能运行,放在真机上就弹出了版权声明
这是我用Fiddler抓到的数据包:
这个包里有很多关键的信息了,我已经用红色圈出来了。
我选择1103,换成16进制0x44f(smali反编译出来的数值都是16进制表示的),用Killer搜索。
都是在同一个文件中,文件名AddBlackName.. ??添加黑名单。够狠,这名字真浪。。
用jd-gui打开这个文件,搜索刚才的状态码:1103 (这回是10进制的)
this.updateItem.setTitle(paramString.getString("authTitle"));
this.updateItem.setDescription(paramString.getString("authDesc"));
authTitle和authDesc就是数据包里json数据的字段名..... 经检测XXX
可以断定,这里应该是调用显示什么的。 所以这个if分支是必须去掉的。
invoke-virtual/range {v26 .. v26}, Lcn/mycompany/addblackname/item/UpdateItem;->getStatus()I
move-result v26
const/16 v27, 0x44f
move/from16 v0, v26
move/from16 v1, v27
if-ne v0, v1, :cond_2
大概就是拿 getStatus() 的返回值与 0x44f 比较。 如果不相等就跳转到 :cond_2。
很显然,要干掉它,就必须无条件跳转过去。
if-ne v0, v1, :cond_2 改为 goto :cond_2
以上是第一处搜索出来的0x44f,Killer一共搜索出了三处。
第二处:
invoke-virtual/range {v26 .. v26}, Lcn/mycompany/addblackname/item/UpdateItem;->getStatus()I
move-result v26
const/16 v27, 0x44f
move/from16 v0, v26
move/from16 v1, v27
if-ne v0, v1, :cond_3 改为 goto :cond_3
第三处:
invoke-static {v3, v4}, Lcn/mycompany/addblackname/utils/PreferUtil;->getIntValue(Landroid/content/Context;Ljava/lang/String;)I
move-result v3
const/16 v4, 0x44f
if-ne v3, v4, :cond_0 改为 goto :cond_0
修改完后就能重编译,然后慢慢破解内购了。
下面是个人总结的经验,不喜勿喷,大神勿喷:
破解内购或者其他一类东西的时候,如果能找到状态码或者回调钩子一类的东西就很容易了,虽然改的地方很多,但是不会漏点,而且每处修改的地方代码样式都差距不大。
|