一些小知识
反编译一个APK,找到他的源码所在地,即smali(原本是dex文件)
温馨提示,一个dex就反编译一个smali文件,当dex内的方法超过65535个,
就会出现2个dex文件夹,即反编译会出现2个smali文件夹
这里一般“ com ”文件夹是作者自己写的代码,其他的是系统代码。
小游戏实践
随便打开一个smali文件,第一行是“包名”+“类名”
其中的“Lcom”中的“L”是指“java”的意思。
第十行的“<init>”是初始化,先不用管;
第十行是开始方法,十六行结束方法,十五行这个方法返回一个“空”,之后就没了。
总的从10~16行就是一个方法开始后,初始化之后返回空就结束了。
一般情况下,P0没有被定义为参数,默认就是this。
往下看,第33行,意思是将P0的值传给V1,即把thisc传给了V1.
像44行的“:goto_1“与47行的“:cond_0”都是“半标签”,
即不会自己运行,就能被别的地方调用,才会执行。
第48行,定义一个类“V2”,是java类型的。
内容(59行),如果V1不等于V2的话,就跳转到“ :cond_1 ”。
我们可以弹出图标,弹出java的源码对比一下。
我们来继续破解,之前研究过,直接在“工程搜索”处搜索“支付失败”,
直接输入中文搜不到,就编码一下在搜索,
看到第90行的代码,定义一个V2,对应的值为“支付失败”。
92行,初始化V1与V2(别的先不管),这里我们只看V2。
94行,是调用拼接,96行,拼接后返回V1,
98行,调用了一个“tostring”方法,将V1传进去,
100行,将结果返回到V1,
102行,将V2定义为0. 0就是falsed的意思。
104行,将V0,V1,V2全部传进makeText方法,
106行,将结果返回到V0
108行,将V0传入“show” 方法。 这里从字面意思也可以猜出,是将结果V0打印输出。
在之后也没有什么逻辑,在128行,直接调用“BuyFailed”方法。
在114行,返回空。
115行,整个逻辑结束。
上述整个过程转化为Java代码就是框内的这些,
扫描二维码关注公众号,回复:
13506435 查看本文章
其中,从Java的代码就可以很容易得知破解的逻辑,
即无论支付成功与失败都调用“BuySccess”方法即可,
或者直接将支付成功的那两行代码直接覆盖上述失败的两处。
复制“支付成功”的两行代码,将上述替换之后直接回编译这两种都可以。
在之后,安装回编译后的软件即可实现内购