• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

首先声明: 此次逆向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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap