Python使用execjs对小程序加密js进行解密!吐血分享!

首先声明: 此次逆向Js只为学习交流使用,切勿用于其他非法用途,关键代码均打码

之前两篇主要是针对把小程序从手机解密出来,通过微信开发者工具打开,运行, 接着前两篇继续往下进行使用python 的execjs模块来破解mryx app 加密代码,分享片段有些是之前分享过的, 如果还在思考这个小程序的代码是怎么来的, 又是怎么在微信开发者工具上运行起来的。可以看 一下之前的分享。

 

 

使用到的环境:

  • Python3.7
  • execjs
  • md5(js原生)
  • node js
  • 微信开发者工具

execjs

先进行安装(这个前提是要有node环境。具体咋用自行百度吧,就不墨迹了,节奏要快!!)

pip3 install execjs

开始逆向:

  • 抓包分析:运行微信开发者工具,开始抓包,发现请求有个mfsig是不能改变是实时生成的,因为微信开发者工具不是一个小程序,所以请求是没有数据的,但是会去执行js加密模块生成了mfsig, 我们可以先分析mfsig是如何生成的。如何拿到破解好的mfsig去请求小程序真实接口。
  • js调试:搜索misig,发现只有commo.js 中使用到mfsig这个变量, 函数名都进行了混淆,但是具体代码没有混淆,可以直接定位到加密代码。一下都是混淆后的函数看起来如果比较费劲,可以按照标题看,我会把几个重要的变量都弄成一个标题。

  • 看到以下代码, 有参数t,a,r,o,n,l,p。 咱们想要的mfsig加密就是对p进行了一个字符串相加并做了一个base64。代码比较清晰,接下来只需要debug看看这些变量是怎么生成的, 和传进来的e到底是个什么玩意儿。看到这个传进来的e,结合上面咱们抓包看到的请求信息,大概就能清楚,传进来的e就是一些请求信息,url, 和param, 然后看到 t变量好像对e做了一些处理,往后看看这个i函数都做了什么操作。

t变量:

看到i函数对传进来的e,是一个map字典, 这里面包含了请求地址, 和post请求头,进行了各种操作, 往下一行一行的debug发现, 前面的各种骚操作大概理解是,判断了一下是否为get请求,如果是get请求会对参数排序xxxx,post返回编码结果。但是!!! 如果是单纯的去读js就没有execjs的意义了,而且如果js不好的小伙伴到这里应该就已经开始懵逼了,因为这个函数里还嵌套了n多其他的函数,想要全部读明白并破解,其实有些费劲,咱们只看大概意思 所以我们直接用最省事的方法,直接整段扣出来执行!!从上面的代码看出i函数做了n多个操作,但是咱们调试发现, 很多操作是针对GET请求的, 咱们用不到(抓包发现,爬虫需要的数据都是post请求),所以我们要给js代码来个瘦身 让代码可读性更好一些,对于无用调用,咱们也给删除一下, 因为上图看到代码只是,对e.data进行一个编码然后返回,如果理解了这段代码,那就可以很好的删除代码, 这样一看是不是简洁了很多!

先执行一下,在里面发现还调用了I 函数, 那我们去把=="I"函数给扣出来==

把"I"代码扣出来以后,发现还有其他的函数调用,我把其他的代码也扣出来了以后。就了解了大概的调用流程,看这个调用其实比较复杂,其实我扣的时候也是一步步执行, 看是否还缺少其他函数,也是本文较难的一个点,不是一个单独的加密点,是依靠上下文进行传输加密。基本都是复制粘贴的,如h函数 我是在其他的类中找到的,如果在本类种没有找到相关函数,我建议debug一下,看具体执行到哪一步函数,然后拿出来执行就好了, 下面是一个调用流程 i>l>o>h,t执行一下, 因为这个js调试输出的参数一截图就没了,我复制到了pycharm 上。对比一下发现执行结果是一样的, 如果执行到这一步,恭喜你已经把其中的一个参数破解完成。给你点个赞66666666666666

a变量:

t变量完成,然后继续往下走, 看看a变量到底都经历了什么~!!!!debug 发现a变量就是对 t + y 做了一个md5操作。但是,这个js的md5咋处理的都不一样,所以可以先进去看看,他是怎么做的。通过debug调试发现调用这个里面的r函数,又从r函数调用了n多其他的函数,那我们索性把这些都扣出来然后换个名字。

执行一下,这里我就不拿调试出的对比了,图太大了也不好看,反正这个加密就是对的了, t和a变量咱们就弄完了,函数名改成了md5. 

变量r:

r=13位时间戳,over~

变量o:

o = r/1e4 然后向上取整。也就是10位时间戳 这个也不多说了。继续往下走,

变量n:

通过代码发现,n变量调用了b函数,返回了一个数字, 我们先把b函数给扣出来, 看一下b函数都做了什么。把b喊出拿出来我们看到, 是调用了o函数,这个o函数咱们之前 t函数 用到了o函数,所以这个函数我们就有, 然后我们直接看 一下o函数,这个o函数的大概逻辑是: 返回一个字符串的unicode数组。然后b函数返回这个数组的长度。这里有点啰嗦, 如果不明白的话,就可以理解为,b函数返回了传进来e的字符串长度就好了。

l变量and P变量:

为什么要把两个变量写在一起呢, 因为P直接就是一个base64.没什么可说的,说完I这篇文章就完成了。(我也快吐了), L调用了s函数,现在去看一下s函数都做了什么。

在这里有个p.default 这个函数,跳转不到函数里, debug也进不函数,不知道default是从哪来来的,这个时候可以用console.log() 模块直接输出

控制台就会先输出具体代码,可以直接点击跳转因为代码经过混淆,S函数里的default就是输出的这段代码了,可以扣出来改个名字自己用一下。ok到这基本上,就已经破解完成了, 想要的参数全部都获取到了,再做个md5就好了。最终代码。执行结果:

Python 调用:

# coding=utf8
import hashlib
import execjs
import json

class MissFresh(object):

    def __init__(self):
        with open("temp_mryx.js") as fp:
            content = fp.read()
        self.parser = execjs.compile(content)
        # self.m = hashlib.md5()

    def mf_code(self, temp_par):
        ssq = self.parser.call('demo', json.dumps(temp_par))
        # print(ssq)
        print(ssq)




if __name__ == '__main__':
	temp_par = {}
    mf_object = MissFresh()
    mf_object.mf_code()

接下来我们抓个包看一下, 把post数据拿出来,我们来进行一个加密


使用刚才写好的python程序来进行加密,把拿出来的加密结果放到charles替换请求。


OK,请求完成,基本整个破解流程到这里就结束了, 上面写的比较啰嗦,主要是针对一些对js破解和不知道从哪里入手,一看到这么多js代码就晕头转向的同学一个整理,也是自己做一个网站的记录。这个只是思路,其实难点主要是在于如何把一个小城完美的在微信开发者工具上运行。这个比较重要。js代码就是需要比较有耐心的去扣了。以后会持续分享一些爬虫的奇淫巧技。比如app的frida-hook大法。新手调试so的方法。app脱壳工具。和一些pc端数据加密的解密的一些东西。我创建了一个公众号,我会定时在上面分享这些东西

文章里的一些工具啥的  都可以免费分享的哈  源码涉及面积广就不分享的,工具软件群:1136192749

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Frida是个轻量级so级别的hook框架,它可以帮助逆向人员对指定的进程的so模块进行分析。它主要提供了功能简单的python接口和功能丰富的js接口,使得hook函数和修改so编程化,值得一提的是接口中包含了主控端与目标进程的交互接口,由此我们可以即时获取信息并随时进行修改。使用frida可以获取进程的信息(模块列表,线程列表,库导出函数),可以拦截指定函数和调用指定函数,可以注入代码,总而言之,使用frida我们可以对进程模块进行手术刀式剖析。 它主要的工作方式是将脚本库注入到目标进程,在目标进程执行脚本。这里需要注意的是,它是将脚本库注入到已经启动的进程,但并不是说,对于进程初始化所做的动作,frida无能为力,frida提供了一个接口spawn,可以启动并暂时挂起进程,然后待我们布置好hook代码后再恢复进程运行,但是这个时间很短,大概2秒,也可能是我的使用姿势不对,求大佬指正。 此外,frida提供了相关的文档,但是frida官网提供的关于python接口的文档实在是少的可怜,连工具命令行的参数都没有,这点需要下载frida的python接口的源代码自己去分析了。值得高兴的一点是,Frida官网提供的js接口的文档稍微详细一些,并附有一些可喜的例子。 除了用于脚本编程的接口外,frida还提供了一些简单的工具,比如查看进程列表,追踪某个库函数等。 剩下就是关于frda学习路线了,Frida的学习还是蛮简单的,只需要了解两方面的内容: 1)主控端和目标进程的交互(message) 2)Python接口和js接口(查文档)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值