最近,上网找到了一款手机辅助软件,在工作中很有用处(具体什么就不说了),作者使用说明中显示因使用AutoJS打包插件,可能会误报为病毒. 所以本人的题目就这样起了.其实对autojs及泡椒云卡密也是第一次听说.
此软件,启用后,先是显示输入卡密界面,正确后再显示具体的使用界面,卡密如何获取呢?关注作者公众号,输入特定内容,会反馈卡密.
鉴于此软件在工作中确实很有用处,可以帮我节省一部分时间,所以本人是肯定要用的,同时,虽然作者是声称卡密是免费的,再加上这几天作者可能有事,没有更新卡密,还是以前的老卡密,输入后,显示卡密已期,用不成了~~
为防以后,本人打算破解他的卡密验证过程.
-----在破解之前,本人对泡椒云是第一次听说.对autojs也是作者说明中提到了,所以下面我会罗列我的尝试过程.新手就是不断的尝试尝试.....大佬勿喷
0x01: 反编译成smali (过程不说)
0x02:查看反编译后的内容.
逛了一圈,在常用的smali文件夹中,没发现有用的东西,倒是在assets文件夹中,有大量的文件,其中的project文件夹中有.js .dex等文件.后面证实, autojs的代码就在这里面
但在几个 main.js/UI.jst等文件中,没有js代码, 都是 runtime.loadDex("joy.dex")new Packages["joy.XXXXXX"]()() 这样的代码. 应该是调用了joy.dex里面的代码.. 于是 反编译joy.dex文件
0x03:查看joy.dex的内容.
首先, 反编译后的joy.dex的文件名的确是js中 joy.XXXXXX后面的部分, 证实了 js文件的确是调用了里面的文件. 打开几个查看,发现里面的字符都是混淆了的,例如下面这种:(文件名也是随机的感觉)
------文字版没截图------------
const-string v6, "307465646273653064742F6D7068"
invoke-static {v6}, Ljoy/utils;->d(Ljava/lang/String;)Ljava/lang/String;
move-result-object v6
invoke-static {v4, v5, v6, p1, v3}, Lorg/mozilla/javascript/optimizer/OptRuntime;->call1(Lorg/mozilla/javascript/Callable;Lorg/mozilla/javascript/Scriptable;Ljava/lang/Object;Lorg/mozilla/javascript/Context;Lorg/mozilla/javascript/Scriptable;)Ljava/lang/Object;
move-result-object v1
.line 27
const-string v4, "676A6D6674"
invoke-static {v4}, Ljoy/utils;->d(Ljava/lang/String;)Ljava/lang/String;
---------------------------------
这会的任务就是,查清楚,卡密界面在哪个文件中,使用的界面在哪个文件中.所以,先要对字符进行解密.
从这里面可以看出Ljoy/utils;->d(Ljava/lang/String;)Ljava/lang/String;代码是解混淆的,如果会JAVA ,可以直接写出一个解字串程序. 因本人不会JAVA 也不会xposed,使用了比较笨拙的一个方法,在utils文件中,加入一段写出字符的smali代码(这个在本论坛中一位大神的原代码,可以直接使用),然后在d(Ljava/lang/String;)Ljava/lang/String;函数中前后调用,让其写出 混淆后和解混淆后的字符.如下:
------文字版没截图------------
.method public static d(Ljava/lang/String;)Ljava/lang/String;
.registers 2
#invoke-static {p0}, Ljoy/utils;->put_log(Ljava/lang/String;)V
invoke-static {p0}, Ljoy/utils;->a(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v0
check-cast v0, Ljava/lang/String;
#invoke-static {v0}, Ljoy/utils;->put_log(Ljava/lang/String;)V
return-object v0
.end method
#号两句为写出前后的字符.在最后,本人禁用了,不用写了,不然文件会越来越大.
软件运行后, 写出的内容如下:
------文字版没截图------------
6F642F6B74
nc.js
716B7A74656C
pjysdk
62717160746664736675
app_secret
627171606C667A
app_key
514B5A54454C
PJYSDK
766A
ui
766A
ui
594E4D
------------
第一行是混淆后的,第二行是解密后的.凑合着看吧.所以,搜索时,先在这个里面搜索字符,再对照上一行的混淆字符,在samli中查找.
根据卡密界面和使用界面不同的内容,确定了对应的文件,下面是破解的设想和过程:
一: 能不能直接让它运行使用界面呢?
查看 main.js UI.js 中的内容,都是runtime.loadDex("joy.dex")new Packages["joy.XXXXXX"]()() 这一句
每个后面的 joy.XXXXXX的XXXXX正好是卡密的文件名, 然后本人直接改成使用界面的文件名.
结论:不行,还是会出现卡密界面.
二:能不能修改跳转卡密验证结果,让其不论输入什么,都认为是正确的(这类似于修改爆破)
不停的搜索字符,也找到了一些与卡密按钮单击的相关地方,但就是看不懂,在没有看到泡椒云的时候,我一直以为,是作者自己写了个JS的卡密程序.
结果:不成功,因为代码太乱,并且后来我知道这是用泡椒云的卡密验证,本地就没有.
三.能不能修改泡椒云的卡密验证结果呢?让程序认为卡密正确?
到泡椒云官网上看了些资料,它是如何调用的,如何返回结果的,返回什么样的结果.但看来看去,在程序中找不到入手地地方
试了一些地方,也没成功.
四.能不能直接让它运行使用界面呢? 回到第一个解决的方面上来
最后, 我还是回到了第一个方法上来,原因是,看了作者的说明,是因为有人盗用卖钱,才加上了卡密,说明之前的版本可能没有这个功能.我找了一个旧版本,果然没有.但功能是没有现在这个好.所以,最终是想调过卡密界面
既然修改main.js UI.js不行,那么说明,程序中肯定有一些地方还是调用了 卡密界面. 在joy的全文件中搜索, main.js UI.js 字符(用混淆后的查),找到了一处.直接改了.
结论:有了不同的提示
...哈哈,看来有眉目了 .运行后,提示:"你使用的版本已经被人恶意修改...”
继续,查找这个字符所在位置,禁用了它的调用函数.
最后,完美运行.
--------------
最后心得:
1.内容较乱,一没截图,因为没时间.二是没有给出具体的文件名代码啥的.因为这个软件每个版本反编译后的文件名是不同的.这可以是autojs的混淆方法吧.所以,给出了没说明不了啥
2.多上百度,本人在反编译过程中,也不停的搜索autojs的卡密破解内容,当然没用上.但其中有一个帖子中提到了在autojs中如何使用泡椒云进行卡密验证,进去看了一下代码,突然发现,它里面的一些关键字和我写出的那个字符中有很多一样啊,最后本人一看,PJYSDK这样的字符,才知道这里面有个泡椒云.
3.多尝试,这个改的地方不多,只有三四处,至于哪个地方真正起了作用了,谁知道哟.反正目的实现了.
4.最后,本人贴上 一直用的一个打印字符的smali代码: 对于不会调试的人来说,写出来看也是 一种方法,就是麻烦些.
-----------写出字符串值的smali代码:
.method public static put_log(Ljava/lang/String;)V
.registers 8
.prologue
:try_start_0
#这是写到哪个文件中?
const-string v3, "/sdcard/1/log.txt"
new-instance v2, Ljava/io/FileOutputStream;
#这个V5j是用来说明,是覆盖还是追加, 0x1的话, 是追加,内容不断的加到文件末尾. 0的话就是覆盖.
const/4 v5, 0x1
invoke-direct {v2, v3, v5}, Ljava/io/FileOutputStream;-><init>(Ljava/lang/String;Z)V
.line 19
new-instance v4, Ljava/io/OutputStreamWriter;
const-string v5, "gb2312"
invoke-direct {v4, v2, v5}, Ljava/io/OutputStreamWriter;-><init>(Ljava/io/OutputStream;Ljava/lang/String;)V
.line 21
invoke-virtual {v4, p0}, Ljava/io/OutputStreamWriter;->write(Ljava/lang/String;)V
const-string v5, "\r\n"
invoke-virtual {v4, v5}, Ljava/io/OutputStreamWriter;->write(Ljava/lang/String;)V
.line 23
invoke-virtual {v4}, Ljava/io/OutputStreamWriter;->flush()V
.line 25
invoke-virtual {v4}, Ljava/io/OutputStreamWriter;->close()V
.line 27
invoke-virtual {v2}, Ljava/io/FileOutputStream;->close()V
:try_end_20
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_20} :catch_21
.line 37
:goto_20
return-void
.line 30
:catch_21
move-exception v0
.line 34
const-string v5, "imei"
const-string v6, "file write error"
invoke-static {v5, v6}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
goto :goto_20
.end method
|