我们以“XXXX管家”为例,该apk使用了签名保护。我们对apk二次打包后,程序无法运行。原因是程序运行时会获取当前应用签名和官方签名进行对比。如果发现不一致就会终止程序。

下面我们对签名保护进行破解

首先我们需要用到的工具是APK改之理。百度云盘下载:http://www.cnblogs.com/ijiami/p/3346870.html

点击”项目”->”打开apk”,反编译apk。

http://images.cnitblog.com/blog/556984/201309/30101759-4cdc52e39b1a49f09b4b3acdc7cee9e6.bmp
获取应用签名的java代码是:

PackageInfo packageInfo = getPackageManager().getPackageInfo(

                "xx.xxx.xx", PackageManager.GET_SIGNATURES);

Signature[] signs = packageInfo.signatures;

其中“Signature” 对应的smali代码是

“Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature”

我们在改之理

搜索“Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature”

http://images.cnitblog.com/blog/556984/201309/30102103-5614d78b8eb1499a97906ea824018c02.bmp

有两个文件用到了签名。首先看下ct.smali

http://images.cnitblog.com/blog/556984/201309/30102234-07fa10efb692450dab56905c222b63c2.bmp
发现这个S(Ljava/lang/String;) 是获取签名的方法。Ctrl+F搜索下“->s(”,看谁调用了s这个方法。搜索后定位到了 gy()方法。返回值是布尔型。

http://images.cnitblog.com/blog/556984/201309/30102435-ffeaf8d6eaf8431995aa436d58f22da4.bmp

该方法 491行 查询了当前apk的签名,并保存在了v0寄存器里

http://images.cnitblog.com/blog/556984/201309/30102548-01e77c612af5437ea180f131eac06414.jpg
500 行,获取了保存的官方签名,并保存在了v1寄存器里

http://images.cnitblog.com/blog/556984/201309/30102719-d4096c5999954ed0b843e7c5d9c01fc5.jpg

579行,判断v0和v1是否相等。返回值保存在了v0寄存器里

583行,返回了v0

http://images.cnitblog.com/blog/556984/201309/30102834-aaaee1d8a4d14498927d67ccdf479cb4.jpg
通过分析我们发现这个gy()方法,就是判断签名的地方。我们只需要修改下让该方法返回真,就能突破签名保护。

在581行,强制返回值v0为真

http://images.cnitblog.com/blog/556984/201309/30103044-3ae15fcf2cd0477f83b1ad3916cd60cb.jpg

保存,重新编译运行。程序可以正常打开了。

更多内容,期待您的探索,请关注爱加密,让您精彩不断!

爱加密官方地址:http://www.ijiami.cn/

http://www.cnblogs.com/ijiami/p/3346870.html


爱加密
250 声望49 粉丝

爱加密是智游网安推出的核心产品,主要提供漏洞分析、应用保护、渠道监测三项服务,APP通过使用爱加密,可以杜绝破解和盗版,防止反编译和二次打包,保护开发者代码安全及产品形象。爱加密为金融和游戏等行业提供...


引用和评论

0 条评论