Comments (6)
现阶段我没有时间去完善,但是我可以分享一些思路。
这种混淆最关键的就是把打散的分支语句拼接回去,但目前以纯静态分析的方式来搞有点陷入了僵局(目前的进度是能够合并90%左右的选择语句)。现在拼接的逻辑是当对应的代码块只被引用1次时,就将它合并到上一个代码块。但是这个混淆策略中有一些干扰,让引用计数大于1,从而阻止上述操作:
- 混淆脚本里有一些常量选择分支,需要将干扰项去除以修正实际引用计数。但是部分常量语句是隐式的,比如通过测试是否含有浏览器才有的内部方法
- 你会发现那个最长的函数存在嵌套调用,说明这个函数将原始代码的多个函数整合到了1个switch中,这就导致有些if语句需要使用传入值判断,也就是需要根据传入值将这个函数拆分为多个函数。
我目前不知道还有没有别的坑点,但这两个问题是实现静态分析所必须要解决的,只是目前我没有足够的精力去完成。
你也可以使用插桩来动态分析这个脚本,随后将其还原:某宝登录bx-ua参数逆向思路(fireyejs 225算法),我这个插件一开始也是按照这个帖子做的,只是我不想用动态分析,这种可能会漏掉情况。
sml2h3/ast_tools 也是针对这种混淆的,你也可以参考一下。
最后关于那个while的问题,在这种混淆下,一个含有String.fromCharCode
的while语句实际上对应一个字符串,即在语句上方一定有一个混淆后的字符串,通过这个while解混淆。但是由于上面提到的问题,这两个代码块没有被合并,于是这个while就没法被还原了。
然后,while语句在混淆后的脚本中特征非常明显,就是出现自引。但是有些自引不再第一个if语句中,说明存在未被删除的无效代码。对于这种情况,目前没有强行将其还原。
from decode-js.
谢谢大佬的思路,正在学习中
from decode-js.
今天看到一篇文章不知道对大佬有没有帮助 https://www.52pojie.cn/forum.php?mod=viewthread&tid=1818486&highlight=226
from decode-js.
今天看到一篇文章不知道对大佬有没有帮助 https://www.52pojie.cn/forum.php?mod=viewthread&tid=1818486&highlight=226
文章里在真正还原控制流上面的部分和这边的做法是类似的,对应这边FlattenSwitch函数阶段dfs2
及之前的部分。
后面主要的区别在于他对于虚假分支的判断比较主观和大胆:
虚假分支会有两种表现形式:
- 第一种就是上面第一二行,我也看不太懂,利用的是一些 undefined 或者布尔变量来计算的,if 条件永远为真
- 第二种就是上面第三四行,是用自身 * 自身,这样数字永远是大于等于0,而且右边数字永远是一个随机负数,所以 if 也是永远为真
我这里识别很简单,因为他的虚假分支都是使用的固定变量,比如:go fe Fo te ti fe xe K ,然后判断 if 条件是否存在这些变量即可
如果不确定 是永为真,还是永为假的话,可以在 else部分加个 throw,抛出异常(这个是可牛大佬指导的,可牛yyds),然后在生成的代码去调试下,没有任何异常就代表是正确了。
也就是说对于一个全新的脚本,你都需要手动看一下都有哪些变量,大胆地删除虚假分支。
如果运行中抛出异常了,再把这个分支还原回来。
这种做法在全自动插件里是没法使用的,我要是这样做,到时候会有一大堆解混淆出问题的。
其实做这类分析的大都是学习一下里面的算法,不会直接把解混淆后的脚本直接拿去替换,毕竟文章里也说了代码中存在toString
或stack
检测(这种检测在其它公开的混淆工具里也有),不把这些去掉始终是个隐患。
from decode-js.
今天看到一篇文章不知道对大佬有没有帮助 https://www.52pojie.cn/forum.php?mod=viewthread&tid=1818486&highlight=226
文章里在真正还原控制流上面的部分和这边的做法是类似的,对应这边FlattenSwitch函数阶段
dfs2
及之前的部分。 后面主要的区别在于他对于虚假分支的判断比较主观和大胆:虚假分支会有两种表现形式:
- 第一种就是上面第一二行,我也看不太懂,利用的是一些 undefined 或者布尔变量来计算的,if 条件永远为真
- 第二种就是上面第三四行,是用自身 * 自身,这样数字永远是大于等于0,而且右边数字永远是一个随机负数,所以 if 也是永远为真
我这里识别很简单,因为他的虚假分支都是使用的固定变量,比如:go fe Fo te ti fe xe K ,然后判断 if 条件是否存在这些变量即可
如果不确定 是永为真,还是永为假的话,可以在 else部分加个 throw,抛出异常(这个是可牛大佬指导的,可牛yyds),然后在生成的代码去调试下,没有任何异常就代表是正确了。也就是说对于一个全新的脚本,你都需要手动看一下都有哪些变量,大胆地删除虚假分支。 如果运行中抛出异常了,再把这个分支还原回来。 这种做法在全自动插件里是没法使用的,我要是这样做,到时候会有一大堆解混淆出问题的。
其实做这类分析的大都是学习一下里面的算法,不会直接把解混淆后的脚本直接拿去替换,毕竟文章里也说了代码中存在
toString
或stack
检测(这种检测在其它公开的混淆工具里也有),不把这些去掉始终是个隐患。
是的,我目前在适用大佬的另外一个分支配合动态调试,但是最大的那个 switch 还在导致分析起来还是有点困难
from decode-js.
是的,我目前在适用大佬的另外一个分支配合动态调试,但是最大的那个 switch 还在导致分析起来还是有点困难
根据动态调试的结果就能合并代码了。
from decode-js.
Related Issues (20)
- 大佬,麻烦抽空看看看看这个啥原因吧。 HOT 1
- 由于删除未使用变量导致的代码decode后无法运行 HOT 4
- obfuscator类型解除环境限制规则有点宽松 HOT 5
- jjencode: 尚未支持的基于eval的编码器 HOT 2
- 我可以提一个PR把esmodule模式改成cjs模式吗 HOT 4
- 全局简单混淆嵌套局部V7混淆 HOT 5
- 大佬有空看看这个吧,解密不完全。 HOT 1
- sojson类型解除自卫模式和禁止控制台调试失效 HOT 8
- obfuscator: 解由旧版本混淆的代码时出现异常 HOT 2
- obfuscator: Fallback模式无法正确分离排序函数及其它细节上的bug HOT 2
- sojsonv7: 排序函数模版更新后无法识别 HOT 1
- other: @babel/parser RangeError: Maximum call stack size exceeded HOT 2
- other: 关于二次封装 HOT 2
- obfuscator: 在 #55 后失效 HOT 2
- sojsonv7: 版本更新后无法识别rotateFunction HOT 14
- sojsonv7: rotateFunction出现新特征 HOT 1
- sojsonv7出错 HOT 3
- sojsonv7: string-array与version在一行定义中时出错 HOT 6
- sojsonv7: Cannot find string list HOT 1
- other: 混淆方式定位问题 HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from decode-js.