吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 46791|回复: 74
收起左侧

[Android 原创] 某APK注册机制分析与多思路破解方法

  [复制链接]
killer5 发表于 2015-7-25 14:32
刚刚接触android逆向,请多多包涵
----------------------------------------------------
在论坛看到一篇帖子,说软件作者利用异常机制来实现注册,思路比较好。。。
于是简单分析了下,并对so文件里的算法进行了分析。
原帖地址:http://www.52pojie.cn/thread-196268-1-1.html
原帖的作者对破解技术进行了部分讲解。
下面我将以软件注册机制和多思路破解两部分进行详细讲解
--------------------------------------------------------------
一        软件注册机制分析篇
--------------------------------------------------------------
首先,软件安装后,如图所示,
0.PNG
在右上角提示注册,点击后提示找回注册和注册说明,并提示了注册码(在不同的模拟器中显示不一样)
1.PNG
其中该软件的注册流程如下所示:
2.PNG
首先APK使用者支付成功后,利用短信或者邮件,将支付信息和机器码发送给作者->作者修改服务器的数据库->APK使用者利用找回注册,去服务器查询,查询成功后,提示注册成功,否则提示不成功。
3.PNG

因此利用"不成功"字符串为突破口,进行进一步的分析。
JEB载入apk,在BqimenDateInputActivity中查找到如下的函数
[Java] 纯文本查看 复制代码
static void s(BqimenDateInputActivity arg4) {
        String v0_2;
        try {
            v0_2 = "";
            HttpResponse v1 = new DefaultHttpClient().execute(new HttpGet(arg4.regetkey("QM" + arg4.
                    getIMEI())));
            if(v1.getStatusLine().getStatusCode() == 200) {
                v0_2 = EntityUtils.toString(v1.getEntity(), "UTF-8");
            }
        }
        catch(IOException v0) {
            arg4.aa.MyDialog(((Context)arg4), "不成功,连接超时,请开通网络重试!(错误代码:-403)", "提示");
            v0.printStackTrace();
            return;
        }
        catch(ClientProtocolException v0_1) {
            arg4.aa.MyDialog(((Context)arg4), "不成功,请开通网络重试或联系开发者!(错误代码:-327)", "提示");
            v0_1.printStackTrace();
            return;
        }

        v0_2 = arg4.regetkeyafter(v0_2);
        try {
            if(Integer.parseInt(v0_2) != 6) {
                return;
            }

            arg4.al = true;
            arg4.ag.setVisibility(8);
            arg4.writeFileData("config1my", arg4.writekey("QM" + arg4.getIMEI()));
            arg4.aa.ExecuteSQL(arg4.aa.MyDB, "insert into config values (\'qm\',\'" + arg4.getIMEI()
                     + arg4.getIMSI() + "\',\'1\',1)");
            arg4.aa.ShowMessage(((Context)arg4), "成功", "");
            arg4.m();
        }
        catch(Exception v0_3) {
            arg4.aa.ShowMessage(((Context)arg4), "不成功", "");
        }
    }

可以看到,首先利用HttpGet连接服务器,查询信息,然后利用动态库so里面的regetkeyafter()方法,对查询的结果进行处理,最后将regetkeyafter方法返回的字符串转换成整数,并判断值是否6。在字符串转换成整数过程中,如果转换失败,则抛出异常,软件的作者也是在异常中,提示注册不成功的。
上面对static void s(BqimenDateInputActivity arg4)整体流程分析后,我们再回过头来仔细看看该函数的细节。
该函数中首先调用getIMEI()方法获得一个字符串(实际上获得的机器码,稍后我会讲解如何验证),并与QM拼接获得新的字符串“QMXXXX”,传递给动态库so文件里的regetkey()方法,得到服务器的地址和查询参数(如何知道的?稍后会慢慢道来)。
下面我们可以先输出这几个关键函数的返回值,做个初步的判断。
因此,我们首先获得getIMEI()方法的返回值、regetkey()方法的返回值、服务器的查询结果v0_2regetkeyafter()方法的返回值。
打开apktool反编译后的文件BqimenDateInputActivity.smali,找到S函数
[Java] 纯文本查看 复制代码
.method static synthetic s(Lcom/forace/Bqimen/BqimenActivity/BqimenDateInputActivity;)V

修改如下几处代码:
4.PNG

5.PNG

6.PNG

然后打包成apk,签名运行后,点击注册->找回注册,并在cmd中输入adb logcat -s SN:V
得到结果为
7.PNG
对比之前的注册界面,可以验证我们的想法是正确的。即getIMEI()方法获得机器码、regetkey()方法的返回服务器的查询地址和参数、变量v0_2保存服务器查询的结果,regetkeyafter()对服务器的查询结果进行处理,
此处返回了字符a,因此调用Integer.parseInt会产生异常,跳到如下的代码执行:
[Java] 纯文本查看 复制代码
catch(Exception v0_3) {
            arg4.aa.ShowMessage(((Context)arg4), "不成功", "");
        }

分析完软件注册的整体框架后,下面我们对动态库so文件里的regetkey()方法和regetkeyafter()方法进行分析。
regetkey()方法根据机器码产生相应个服务器地址和查询参数,载入IDA,找到该函数:
8.PNG
该函数的实现算法为:计算输入的注册码长度,并提取注册码中的每个字符,然后对每个字符进行查表的方式,获得一个新的字符,并添加到字符串"http://www.d8soft.com/userc/checkID.asp?key=''"中的Key参数中。

9.PNG

10.PNG

11.PNG
关于该算法的详细注释,我会打包到附件中,另外也可以通过动态调试的方式,获得该函数的算法。
下面对另一个函数regetkeyafter()进行分析,其实该函数的实现是比较简单的,具体为:将查询结果与”true“进行比较,如果成功,则将返回值赋值为字符6,否则赋值为字符a。如下:
12.PNG
上面便是整个软件的注册机制的实现和算法讲解。
在了解了注册机制后,对与该软件的破解应该是很简单的了,下面简单的介绍两种破解方法。
--------------------------------------------------------------
二        软件多种思路破解篇
--------------------------------------------------------------

此处我会提供两种新的破解思路
1、第一种破解思路
通过前面的分析,发现其实只需要使regetkeyafter()的返回值为字符6即可实现破解。而最简单的方法就是修改src(即字符a)处的原始字符为6即可,如下地址
13.PNG

14.PNG

利用WinHex将61改为36即可。然后打包,签名,注册->找回注册即可,注册成功。
2、第二种破解思路
既然软件需要访问服务器获得查询结果(true或者false),那同样在获得了完整的访问网址及参数后,可以自己搭建服务器,实现离线验证,此方法复杂,在此不在细讲,只提供一个思路。
另外此种方法适用于复杂的认证过程中,通过抓包获得地址,然后搭建伪服务器验证即可。


到此,本文的讲解就结束了。


pic.rar (63.7 KB, 下载次数: 159)





免费评分

参与人数 22威望 +2 吾爱币 +4 热心值 +22 收起 理由
william37 + 1 + 1 我很赞同!
maoxiaosen + 1 + 1 我很赞同!
smith_k + 1 + 1 我很赞同!
不要二分法 + 1 + 1 我很赞同!
木天狼星 + 1 热心回复!
610100 + 1 佩服大神
州哥在江湖 + 1 我很赞同!
borpubi + 1 谢谢@Thanks!
Amanda小黑 + 1 热心回复!
熊大猫来了 + 1 我很赞同!
myoldid + 1 只看懂一个大概思路
微博2016 + 1 谢谢@Thanks!
asdnasiudn + 1 我很赞同!
Creo + 1 谢谢@Thanks!
cr7890 + 1 谢谢@Thanks!
wanttobeno + 1 谢谢@Thanks!
superu + 1 我很赞同!
a5112075 + 1 谢谢@Thanks!
ljrlove2008 + 1 膜拜大牛……
Tortoise + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
qtfreet00 + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
临轩听雨 + 1 没学会,但是感谢分享

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

手写连笔王 发表于 2015-7-26 08:48
思路清晰,方法得当,值得学习。谢谢楼主提供范例。
甲乙丙丁 发表于 2016-3-9 09:09
大神,有个问题请教一下,我这有个软件跟这个注册机制差不多,但是查找不到提示的字符,怎么办?
具体是  打开软件后会显示  特征串:****-****-****-****-****然后提示剩余时间为0,联系作者充值,所有字符都搜索不到
caleb110 发表于 2015-7-25 16:04
小米粥吖 发表于 2015-7-26 00:19
先看看,大神
头像被屏蔽
我宠我爱 发表于 2015-7-26 03:57
学习了,大神就是不一样1
3LLL 发表于 2015-7-26 07:07 来自手机
学习了,谢谢
头像被屏蔽
czy 发表于 2015-7-26 07:15
分析的比较透彻
q243363184 发表于 2015-7-26 07:18 来自手机
多谢,长见识了
Super817 发表于 2015-7-26 07:23
学习了,讲解详细。{:1_930:}
yunfeng 发表于 2015-7-26 07:36
没学会,楼主最好做个视频讲解一下。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-23 20:14

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表