最近几个月接触到Android软件逆向
原软件地址:http://www.play.cn/game/gamedetail/5010556.htm
工具:apk改之理
步骤:
1.首先反编译文件,本人下载的重命名1.apk
2.一般来说,目前Android游戏的付费一般就两种:成功和失败。那么我们根据基本的英文翻译即可,如果不确定可以一个一个搜,我当初破解的时候是在模糊搜索,慢慢分析的。那么,现在我搜索的是paysuccess
根据上面的搜索结果我们可以看到有两个结果我们点进去第一个查看一下。
发现这里只是APP对支付的监听而已,所以这一个所有结果排除。
我们点开第二个搜索结果。
这里我们看到了比较明显的代码了,不确定的话,可以使用软件上面的java图标进行源码查看。
3.我们看到了,这里已经完全的表示出来的。有支付取消(paycancel)、支付失败(payfailed)、支付成功(paysuccess)。那我们应该如何修改呢?一般情况下我们将方法复制过来即可。
.method public paySuccess(Ljava/util/Map;)V
.locals 3
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Ljava/util/Map",
"<",
"Ljava/lang/String;",
"Ljava/lang/String;",
">;)V"
}
.end annotation
.prologue
.line 608
.local p1, "params":Ljava/util/Map;, "Ljava/util/Map<Ljava/lang/String;Ljava/lang/String;>;"
sget-byte v0, Lorg/cocos2dx/swfc/AndSms;->messageType:B
invoke-static {v0}, Lorg/cocos2dx/swfc/AndSms;->sendSuccessLogic(I)V
.line 609
# getter for: Lorg/cocos2dx/swfc/AndSms;->sendCount:[B
invoke-static {}, Lorg/cocos2dx/swfc/AndSms;->access$1()[B
move-result-object v0
sget-byte v1, Lorg/cocos2dx/swfc/AndSms;->messageType:B
·········
return-void
.end method
现在我们将.prologue到.end method之前全部复制黏贴到失败和成功即可。
4.完成以上操作以后,我们将这个应用编译。
5.安装打开该APP,我们发现应用打开就闪退,或者是点击购买以后闪退。那是我们修改错误吗?当然不是。
那我们继续来分析(注意下方法头)。
.method public paySuccess(Ljava/util/Map;)V //成功方法
.locals 3
.end method
.method public payFailed(Ljava/util/Map;I)V //失败方法
.locals 1
.param p2, "errorInt" # I
.end method
.method public payCancel(Ljava/util/Map;)V //取消方法
.locals 1
.end method
请注意我所标注的红色字体。可以发现成功的方法有定义了三个寄存器v0,v1,v2,而失败和取消都只定义了一个寄存器v0
所以刚才我们贸然将成功的代码复制到失败和失败才会闪退。
要解决这些,只需要将failed和cancel的寄存器定义.locals定义成3即可
即:.locals 3
那我们再次编译,发现可以购买成功了
6.逆向以后app发布时一件非常激动的事情,但是你发布以后有人说你APP还是扣费怎么办?
这几天分析电信支付接口2014.08版发现,smali基本没有1开头的8位以上的号码。那我们换一种思路,让app发送短信到空号码,还不如让APP不发送短信
那我们打开Androidmianfest.xml。如图所示:
稍微对英语有所接触的都知道sms代表的短信的意思,那我们按下ctrl+F,搜索F,会发现一个权限
<uses-permission android:name="android.permission.SEND_SMS" />
这是app的用户权限,这个权限表示了系统允许该应用进行发送短信的操作,我们将这一条删除即可。
7.安装打包,大功告成。一个不扣费的破内购的app诞生了。
2014.09.08 Sarkozy