好友
阅读权限20
听众
最后登录1970-1-1
|
本帖最后由 verber34 于 2021-9-9 11:40 编辑
XX学习网络版作者发布过2个版本,第一版本是0823发布的, 使用了庖丁3.2的加密方式, 第二版本是0830发布的, 使用了庖丁3.5的快照加密;这两版都用过,也都去除了使用限制(虽然作者在第二版中明确永久免费,但每次需要输入口令,有些不便,同时,由于每次运行前需要输入口令,那自动运行功能就失效了). 这样的软件有个能用的就OK了,本篇只是记录分享去除限制的方法,今天先说一下第一个版本的破解:
第一个网络版,作者使用的还是庖丁3.2的加密方式,其加密后的形式如下:
------------dex中随机复制的code----------------
new-array v3, v5, [Ljava/lang/Object;
const-string v4, "55473457dbf2f8f7fcd8d54151d3658d"
aput-object v4, v3, v6
const-string v4, "devo"
invoke-static {v3, v4, p1, v0}, Lorg/mozilla/javascript/optimizer/OptRuntime;->callName([Ljava/lang/Object;Ljava/lang/String;Lorg/mozilla/javascript/Context;Lorg/mozilla/javascript/Scriptable;)Ljava/lang/Object;
move-result-object v3
----------------------------------------------------------
初一看,和之前咱们分析过的那个e函数解密有些像, 其中第一个字符为加密后的密文, 第二个为随机字符,但最后使用这两个字符进行解密,但多看一些代码发现,还是有一些不同的:
1. 所有的密文之后的第二个字符都是 devo,不是随机的
2. 解密调用的函数也不同, 之前那个大家都有印象,就是en.joy 中的 e()函数,而这个不是,是一串串找不到函数的代码.
在解密前,先要了解Lorg/mozilla/javascript/optimizer/OptRuntime;->callName()是个啥? 对于大佬来说,可以分析出这个调用有什么意思,是哪种情况转化来的. 但对于我这样的,没学过程序也不会深入分析的,只能通过对比,猜测这玩意是什么意思?
先在dex中搜索OptRuntime;->callName, 点开几个看看,除了解密的这种,还有一些地方也使用这样的语句,比如:
-------------------dex中随机复制的code---------------]
const-string v4, "random"
invoke-static {v3, v4, p1, v0}, Lorg/mozilla/javascript/optimizer/OptRuntime;->callName([Ljava/lang/Object;Ljava/lang/String;Lorg/mozilla/javascript/Context;Lorg/mozilla/javascript/Scriptable;)Ljava/lang/Object;
move-result-object v3
aput-object v3, v2, v6
const-string v3, "delay"
invoke-static {v2, v3, p1, v0}, Lorg/mozilla/javascript/optimizer/OptRuntime;->callName([Ljava/lang/Object;Ljava/lang/String;Lorg/mozilla/javascript/Context;Lorg/mozilla/javascript/Scriptable;)Ljava/lang/Object;
可以看出,delay,random都是autojs中的方法,加密前的写法就类似:random();delay(1000);这样,由此可以看出,callname这个语句,是用来调用函数或方法的,这样看的话,咱们再看那句解密的语句,可以判断出,它也是调用某一个方法或者函数的,第一个是密文的话,那第二个devo,就表示是一个函数了,由此,可以知道,密文是调用devo这个函数解密的.那么这个devo在哪呢??
搜呗。我们知道,function过程编译成smali文件,就是.method这样开头的,搜一下看看devo有木有这样的定义,还真有,随便复制一个看看:
.method private static _c_devo_42(LEn/aealmtn;Lorg/mozilla/javascript/Context;Lorg/mozilla/javascript/Scriptable;Lorg/mozilla/javascript/Scriptable;[Ljava/lang/Object;)Ljava/lang/Object;
并且不止一个类似于这样的定义,那这个是不是解密函数的定义过程呢,不管它,先假设是,如果是,那它的过程肯定是“先把密文传过来,然后解密,最后返回明文”,如何解密咱不管,咱只知道,这个过程中,既有密文又有明文,那这样就好办了,用我们的老方法,打印出密文和明文的对应表啊,
这个过程较长,重点看这两个部分:
aget-object v6, p4, v9
这是开头的一句,经分析,v6中存储的就是传过来的密文,为什么呢?一是因为这个v6,中间的代码中在没有使用过(中间的是加密过程呗),也没有被重新赋值过,只有最后引用了一次,所以,我再下一句中打印出v6(打印前做一个类型转换)
继续看结为,返回的了什么
invoke-static {v0, v1}, Lorg/mozilla/javascript/ScriptRuntime;->add(Ljava/lang/Object;Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
return-object v0
过程最后返回了v0,是Ljava/lang/CharSequence;类型,百度了一下,这个Ljava/lang/CharSequence;类型,和string类型差不多,我猜测它是解密后的明文了,如何打印出来呢?我们的那个函数只能打印string类型的,所以,打印前需要把Ljava/lang/CharSequence;类型转换成string类型,然后打印,打印后,在转换成原来的类型,确保不出错.根据百度的一些文档,CharSequence;转string需要用tostring()方法,而string转CharSequence;可以强制转换(就咱们用的check-cast),所以,最后这几句可以这样修改:
invoke-static {v0, v1}, Lorg/mozilla/javascript/ScriptRuntime;->add(Ljava/lang/Object;Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
move-result-object v0
#把v0 转成string类型
invoke-interface {v0}, Ljava/lang/CharSequence;->toString()Ljava/lang/String;
#转换后的类型存储到v0中
move-result-object v0
#自行加一句以前用过的put_log函数
………………
#再把v0的类型改回来
check-cast v0, Ljava/lang/CharSequence;
return-object v0
至此,我们的打印密文对应表已修改好,将所有文件中的定义中都这样修改,运行吧……密文对应表就形成了。之后的过程就是搜索该跳转了.
最后看一哈这个devo函数:
这个解密函数,每个文件中都有一个定义,那庖丁的作者为什么不定义一次就行,就像e函数那样,这是因为,每一个文件中的解密时,都需要当前文件的类名,这个文件名和类名是相同的,大家看解密函数中的部分,都有aealmtn123456789这样的字符,那数字前面的就是类名(大家理解成文件名也可以),所以,不同的类名,其解密过程需要不同的字符.
所以,
有些人可能这样去想,我用软件中的提示,自己去写一句autojs代码,然后用相同的加密方法,再打开dex中得到密文,这样是不是可以得出明文对应之后的密文呢?比如:
比如原APK中出来一个提示 " 你的激活码错误",那我自己写一个js文档,最简单的那种 toast("你的激活码错误"), 然后用庖丁的这种加密方法生成一个dex文件,这个dex文件中的密文是不是和作者程序中的密文相同呢?
答案是 :不相同
因为,作者和你虽然使用的相同的加密方法,但这个加密过程中生成的类名不相同啊(也就是文件名),这样,加密后的密文也是不同的.
--至此,第一个网络版分析完成,有人会说,你这没有说怎么破解啊, 其实,你把字符解密了,通过提示搜索定位到关键位置,改跳转就可以. 这个过程是简单的.autojs加密成dex中,改的就是if跳转
修改前,大家可以先搜索MD5, 这是文件验证, 把MD5的地方的跳转改了, 就不会再出现 run fail的错误.然后,运行打印密文表, 只需要找到 点击一键运行时的错误提示(状态ID啥的)就改那一个,就完成去除限制.
----抽空写下一篇内容, 第二个网络版去除验证的方法(即快照加密)
|
免费评分
-
查看全部评分
|