赞
踩
通过抓包分析得,此数据包为homefeed
观察载荷得
并没有什么加密参数。那就要看看请求头,cookie
请求头中有三个参数很像目标值
X-S,X-S-Common,X-B3-Tracied
下面还有一个X-t,就是时间戳
全局搜索可以找到加密位置
可以看出是中间的函数进行加密
在断点的时候发现会在很多干扰项断住,此时我们就可以加一个条件断点
如果c中有homefeed关键词,就断住,否则一律不断住
进入源码得,这是一段VMP代码
什么是VMP?
VMP(Virtual Machine Protection)是一种软件保护技术,用于保护应用程序或软件的代码免受逆向工程、修改和盗版等威胁。VMP通过在程序中引入虚拟机(Virtual Machine)的概念,将原始的机器码转换为虚拟指令集,并在虚拟机中执行这些指令。
VMP的核心思想是将原始的可执行代码转换为一种只能在虚拟机环境中运行的形式,这样可以增加对代码的保护性。通过使用虚拟指令集,VMP使得对原始代码的静态分析和动态调试变得更加困难,因为攻击者无法直接理解和操作虚拟指令。
VMP通常会对程序进行以下操作:
代码加密:VMP会对原始的机器码进行加密,以防止代码被简单地提取和分析。只有在虚拟机环境中进行解密后,才能运行加密的代码。
虚拟指令集:VMP会将原始的机器码转换为虚拟指令集,这些指令集是一种与底层硬件和操作系统无关的抽象指令。虚拟指令集使得代码的执行逻辑更加复杂,难以进行逆向工程。
控制流混淆:VMP会对代码中的控制流进行混淆,使得代码的执行流程变得难以理解。通过添加无用的控制流指令、条件分支和跳转,VMP增加了代码的复杂性,使得分析和修改代码变得更加困难。
运行时检测:VMP会在程序运行时对代码进行检测,以防止代码被修改或篡改。如果检测到代码被修改,VMP可以采取相应的措施,如中断程序执行或清除关键数据。
VMP是一种常见的软件保护技术,被广泛应用于商业软件和游戏等领域,以保护知识产权和防止软件盗版。然而,VMP并非绝对安全,高级的逆向工程技术仍然可以绕过VMP的保护措施。因此,为了实现更高级的软件保护,通常需要采用多层次的保护策略和技术组合。
现在我们进入了源码区域,可以先进行测试一下,看看是不是这个文件生成的加密值
新添加一个代码段,通过调用上述加密函数,对相应的参数进行加密,看看结果是否一致
可以看出结果与目标一致
在这个函数中有一个sanji函数
根据上图可以发现他先执行之后,后面又跟了一个括号传了参数,这就说明sanji函数的调用返回的又是一个函数,而返回的这个函数调用了后面的参数
那我们来看看sanji函数返回了什么函数
发现返回的函数需要是三个参数,第一个参数传入了window,第二个参数传入了一个object对象
第三个参数就是undefined
什么是插桩分析?
插桩(Instrumentation)是一种软件技术,用于在程序执行期间向代码中插入额外的指令或代码片段,以收集信息、监视程序行为、修改程序逻辑或进行性能分析等目的。
插桩通常在应用程序的源代码或目标代码级别进行,可以通过静态插桩或动态插桩的方式实现。静态插桩是在编译时或链接时修改代码,而动态插桩是在运行时通过修改内存中的程序指令实现。
插桩技术可以用于多种用途,包括但不限于以下几个方面:
监视和调试:插桩可以用于收集程序执行期间的运行时信息,如函数调用、变量值、异常处理等,以帮助调试和排除错误。
性能分析:插桩可以用于收集程序的性能数据,如函数执行时间、内存使用情况等,以进行性能优化和瓶颈分析。
安全检测:插桩可以用于在程序执行期间检测潜在的安全漏洞或恶意行为,如检查输入验证、访问控制等。
动态修改程序行为:插桩可以用于在程序执行期间动态修改程序的行为,如替换函数调用、修改参数值等,以实现特定的功能或修复bug。
插桩技术在软件开发、测试、分析和安全等领域都有广泛的应用。它提供了一种灵活和强大的手段,可以对程序进行深入的观察和干预,帮助开发人员和研究人员更好地理解和改进软件系统。
对每一个插桩不现实,所以插桩的关键是找准位置插桩,
接下来应该对哪几个地方进行插桩呢?
插桩应该遵循:
先看首尾,再看中间
首位部没有有效信息,再从中间找
首先尝试入口
在这儿插桩发现拿不到什么有效信息
我们可以hook json.stringify后,进行插桩
对apply函数这儿进行插桩,为什么要对apply这儿插桩呢?
因为apply是js中某函数传入某参数的指令。可以看看函数的调用以及函数的传参
可以在传入的参数中寻找有效信息
当遇到大量的数据内容的时候要注意观察了,尝试找到数据的出处
看前面的代码发现这些数据没有生成的操作,像是直接提取的,所以这些数据有可能是直接返回的
返回的数据可能藏在哪里呢?
1.cookie
2.html文档中
不出所料,果然是在cookie当中
建议先提取出被调用的数据,以便后续观察
看见random可以直接跳过,随机值对我们没用
插桩分析的过程中要有耐心
发现了此函数调用了我们post请求的数据
也是我们的i参数
这也是一个非常重要的信息,看看后续他对这个参数做了怎样的操作?
在这儿我们发现他将参数拼接了起来,但是之后拿不到任何有效信息,所以暂时舍弃此插桩点
我们发现所有的命令类型的操作都在这个数组里面,我们不妨在这个数组内找找插桩点
在这个函数中,他进行了文本操作,有加法,这是我吗值得注意的,因为,字符串的拼接需要用到加法,所以我们在此处插桩,因为输出的内容过于庞大,所以我加入了if判断,只输出一部分日志
发现关键点,现在看看它对这个拼接的字符串做什么操作
继续往下翻,发现了一堆数字,应该是和加密有关的数字,再往下翻得到
看看这像MD5吗?16位长度,不妨测试一下
果然不出所料,是一个MD5标准算法加密的参数为:
url=/api/sns/web/v1/homefeed{"cursor_score":"","num":35,"refresh_type":1,"note_index":34,"unread_begin_note_id":"","unread_end_note_id":"","unread_note_count":0,"category":"homefeed.psychology_v1","search_key":"","need_num":10,"image_formats":["jpg","webp","avif"],"need_filter_image":false}
也就是一个上述说的拼接的一个字符串
下面直接对md5的结果进行一个搜索看看后续做了什么操作
直接选中最后一条得到结果
发现拼接了x1-x4
x1=d60ef0f9033dc85f63cad124cf53605a;
x2=0|0|0|1|0|0|1|0|0|0|1|0|0|0|0;
x3=18d3c0413b3299r5ys308jva95fot1nnuj44025a650000131542;
x4=1714894394066;
我们来依次看看这个值
x1是对拼接的字符串做的md5值
x2是固定字符串
x3是cookie的a1值
x4是时间戳
继续往下翻:
发现它尝试拼接一个类似于b64的字符串
难道是对这个x1-x4的字符串进行b64?
测试一下
测试得,果然是这样!
接下来它难道又会对b64字符串进行操作?
继续往下翻
出现关键词encrypt,看来是对这个字符串又做了加密
果然做了加密,但不知道是什么加密,看这个结果应该是个摘要算法,要不先测试一下?
测试失败,长度超过了摘要算法的长度
继续往下翻:
发现是这个payload就是对b64编码的数据进行了加密操作
现在找到加密函数大功就告成了
现在这个插桩位置已经没有什么有价值的东西了,现在换个插桩点
在这个大的位运算数组中存放了很多很多细微的函数
现在可以看看,里面这个数组中的函数谁调用的最多?
因为调用的最多的函数更有可能参加整个流程,也就是我们需要插桩的位置
几乎在数组中的每个函数都有这个函数的运用,我们不妨找到这个函数定义的地方进行一个插桩
这个函数虽然就一句话 ,但他的核心功能其实是另外一个函数,所以我们要找到另外一个函数的位置
在此处插桩,让其输出参数,为什么不输入这个函数?,输出函数的话就反复出现一个函数没用。所以就输出参数
通过观察可得,这四个参数最有用的就是_ace_7e97a这个参数
所以再次改插桩代码,只输出_ace_7e97a参数
由于输出日志过大(超过100w条了)、
所以加个条件判断限制输入
一直翻日志:发现这里将b64编码结果完成
下一步就是encrypt步骤
这一大串数字都是算法的核心,我们可以百度一下看看是什么算法
注意 直接百度可能百度不到,要将此数字从10进制转换成16进制
显而易见,是一个DES算法,现在要找到这个加密的key
key一般是32位和64位或者这个倍数
秘钥是这个
key找到了,加密算法也找到了。逆向到此结束
测试成功 逆向完成
需要源码+我VX
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。