吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 24194|回复: 39
收起左侧

[Android 原创] 偷梁换柱之计算机二级C语言掌上通注册机编写教程

  [复制链接]
qtfreet00 发表于 2015-6-24 18:37
今天在逛安智的时候看到一个软件,我对注册码验证的程序比较感兴趣哈,- -那个帖子的软件是通过爆破法实现破解的,之前我在这个帖子讲过
http://www.52pojie.cn/thread-376802-1-1.html  爆破法虽然直截了当,不过不利于之后的升级,那我们有没有更好的方法来干掉这个软件,方法当然是有的,也就是我们今天的主题。

原软件地址:http://www.eoemarket.com/soft/232473.html

0x1 爆破软件观察注册机制

QQ截图20150624181417.png

打开软件,找到注册处,点击获取按钮后有几种支付模式,我当然是选择最熟悉的支付宝模式

QQ截图20150624181804.png

我们直接爆破支付,搜索关键词 9000 的十六进制,即0x2328,找到

QQ截图20150624181933.png

在方法开始处添加一行,

QQ截图20150624182007.png

回编译,打开支付宝后直接返回上一级,提示支付成功,注册码也出来了,很明显的md5加密模式

QQ截图20150624182125.png

0x2 寻找加密算法

我们搜索toast提示的文本信息,注意是unicode编码,找到关键点,打开java代码,

QQ截图20150624182334.png

很明显的看到,注册码是调用了cc类的b方法,并将k方法的数据传入,我们点开k方法

QQ截图20150624182507.png

不难发现,该方法通过调用系统设备信息,获取到设备号后在数据前添加“L”,在末尾添加了“8H6”,返回该值,传入到cc类的b方法中,我们点开cc类,我擦

QQ截图20150624182656.png

此处被作者混淆了,jd-gui无法识别,那我们就无法进行下一步了吗,答案当然是否定的,这也是本主题重点,投机取巧偷取加密算法

0x3 编写“假”注册机

打开eclipse,新建一个Android项目,包名最好和原软件相似,方便修改

QQ截图20150624180627.png

其它一切默认即可,

QQ截图20150624180755.png

我们在包下新建一个cc类,写上一个方法,定义一个全局的String方法,直接返回即可,不添加任何代码

QQ截图20150624180939.png

在方法中将该软件获取设备号的方法写入,然后在Oncreate方法中进行调用,并显示在textview上,需要注意的是,我们需要在AndroidManifest文件中添加一个读取设备信息的权限,不然软件是无法获取的

QQ截图20150624181005.png

好了,“假”注册机已经编写好了,我们直接导出为apk文件,这个注册机是什么用都没有的,但截下来我们把它变成真的注册机

0x4 偷梁换柱之真注册机

我们找到导出的apk文件,用改之理反编译,然后将二级考试原软件的cc类复制到我们的反编译工程中替换我们编写的cc类,需要注意的是,我们在最上方需要将包名修改为我们自己设置的包名,保存,回编译

QQ截图20150624181201.png

运行软件,看到了吗

QQ截图20150624183527.png

我们将这段数据复制到软件的注册框中,

QQ截图20150624181354.png

QQ截图20150624181402.png

大功告成。。


免费评分

参与人数 15威望 +2 吾爱币 +2 热心值 +14 收起 理由
jxh0530 + 1 + 1 热心回复!
96936 + 1 + 1 谢谢@Thanks!
皓月长空 + 1 已经使用,谢谢献爱心
wangxd + 1 我很赞同!
烈火 + 1 我很赞同!
本尊至高无上 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩.
Peace + 1 珠玉纷呈
屌丝男 + 1 我很赞同!
elceric + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
soulovess + 1 我很赞同!
吉子 + 1 好牛逼,
左岸麦田 + 1 已答复!
淡然出尘 + 2 赞一个
逍遥枷锁 + 1 谢谢@Thanks!
smile1110 + 1 东西很不错,没有权限置顶

查看全部评分

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

 楼主| qtfreet00 发表于 2015-6-25 12:29 来自手机
淡然出尘 发表于 2015-6-25 00:20
这个方法大赞啊

再遇到Jd-Jui反编译不了的 你可以试试Jeb呀;

小白哪会用那些高大上的东西
taintitly 发表于 2015-7-11 11:40
本帖最后由 taintitly 于 2015-7-11 12:32 编辑

.method public static b(Ljava/lang/String;)Ljava/lang/String;
    .locals 5

    :try_start_0
    const-string v0, "MD5" //加密模式为MD5

    invoke-static {v0}, Ljava/security/MessageDigest;->getInstance(Ljava/lang/String;)Ljava/security/MessageDigest;

    move-result-object v0

    new-instance v1, Ljava/lang/StringBuilder;

    const-string v2, "niatxqh"

    invoke-direct {v1, v2}, Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    invoke-virtual {v1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1 //在Lxxxxxxxxxxx8H6 在这段字符前加入"niatxqh"字符串,变成"niatxqhLxxxxxxxxxxx8H6"形式
    const-string v2, "c2exam86"

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1 //在“niatxqhLxxxxxxxxxxx8H6” 在这段字符后加入"c2exam86"字符串,变成"niatxqhLxxxxxxxxxxx8H6c2exam86"形式

    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v1


    invoke-virtual {v1}, Ljava/lang/String;->getBytes()[B

    move-result-object v1

    invoke-virtual {v0, v1}, Ljava/security/MessageDigest;->update([B)V

    invoke-virtual {v0}, Ljava/security/MessageDigest;->digest()[B

    move-result-object v2

    new-instance v3, Ljava/lang/StringBuffer;//对字符串进行MD5加密,整个加密后的字符串大写压入v3中

    const-string v0, ""

    invoke-direct {v3, v0}, Ljava/lang/StringBuffer;-><init>(Ljava/lang/String;)V

    const/4 v0, 0x0

    move v1, v0


    :goto_0
    array-length v0, v2

    if-lt v1, v0, :cond_0

    invoke-virtual {v3}, Ljava/lang/StringBuffer;->toString()Ljava/lang/String;

    move-result-object v0

    const/4 v1, 0x4 // 取加密字符串的第5位作为开始

    const/16 v2, 0x18 // 取加密字符串的第24位作为结束

    invoke-virtual {v0, v1, v2}, Ljava/lang/String;->substring(II)Ljava/lang/String;

    move-result-object v0

    invoke-virtual {v0}, Ljava/lang/String;->toUpperCase()Ljava/lang/String;

    move-result-object v0

    return-object v0 //将20位注册码返回


==================================================================
这个软件的注册算法很简单:
MD5加密"niatxqhL"+IMEI+"8H6c2exam86"组成的字符串
然后取第5位-24位的20个大写字符作为注册码

完了....
==================================================================
将上述smali代码(部分)还原了一下:
public static string b(string s)
    {
        int i;
        int j;
        object obj;
        try
        {
            obj = messagedigest.getInstance("MD5");
            ((messagedigest) (obj)).update((new StringBuilder("niatxqh")).append(s).append("c2exam86").toString().getBytes());
            s = ((messagedigest) (obj)).digest();
            obj = new stringbuffer("");
        }
        catch(string s)
        i = 0;
        if(i >= s.length)
            return ((stringbuffer) (obj)).toString().substring(4, 24).toUpperCase();   }


免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
smile1110 + 2 + 1

查看全部评分

 楼主| qtfreet00 发表于 2015-6-24 18:40
3yu3 发表于 2015-6-24 18:46
好贴,,学习了。。这方法真心管用 。
凡凡之呗 发表于 2015-6-24 18:52
很好 啊 我的距离还很遥远
cz5420 发表于 2015-6-24 18:55
本帖最后由 cz5420 于 2015-6-24 18:56 编辑

繁华大神,虎奔等考破一下呗http://www.52pojie.cn/thread-376805-1-1.html
我禁止IMEI真的能用,不过还是期待破解爱加密的~

免费评分

参与人数 1热心值 +1 收起 理由
qtfreet00 + 1 很遗憾,看到壳我就懵了

查看全部评分

du8912121 发表于 2015-6-24 18:55
不错啊,支持楼主
黑山走天涯 发表于 2015-6-24 19:11
支持下!谢谢分享!!!
smile1110 发表于 2015-6-24 19:14
世事繁华皆成空 发表于 2015-6-24 18:40
@Hmily @淡然出尘 好不容易写一篇,过来骗分了

我准备给你加 -15分

免费评分

参与人数 1热心值 +1 收起 理由
qtfreet00 + 1 我准备给你-1992个热心

查看全部评分

andi66699 发表于 2015-6-24 22:11 来自手机
谢谢你的分享!
syrmb 发表于 2015-6-24 23:30
大神 厉害~~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-28 04:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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