安卓逆向009实战分析smali代码破解小游戏(贪吃蛇)

一些小知识


反编译一个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代码就是框内的这些,

在这里插入图片描述


其中,从Java的代码就可以很容易得知破解的逻辑,

即无论支付成功与失败都调用“BuySccess”方法即可,

在这里插入图片描述


或者直接将支付成功的那两行代码直接覆盖上述失败的两处。

复制“支付成功”的两行代码,将上述替换之后直接回编译这两种都可以。

在这里插入图片描述

在之后,安装回编译后的软件即可实现内购

Guess you like

Origin blog.csdn.net/weixin_43970718/article/details/119514461