Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

awsc: 开发讨论和进度 #19

Open
HenryWu01 opened this issue Jul 26, 2023 · 6 comments · May be fixed by #47
Open

awsc: 开发讨论和进度 #19

HenryWu01 opened this issue Jul 26, 2023 · 6 comments · May be fixed by #47
Labels
wip Work in progress

Comments

@HenryWu01
Copy link

HenryWu01 commented Jul 26, 2023

目前使用 225 或者 226 的脚本输入都会出现以下的错误:

Unexpected parent type: UnaryExpression
Unexpected parent type: UnaryExpression
Unexpected parent type: UnaryExpression
Unexpected parent type: UnaryExpression
Unexpected parent type: UnaryExpression
Unexpected parent type: SequenceExpression

测试版多了以下一些输出:

prase while _u1142v failed
prase while _u1077v failed
prase while _u1088v failed
prase while _u1103v failed
prase while _u1116v failed
prase while _u1125v failed
prase while _u1062v failed
prase while _u1066v failed
prase while _u1086v failed
prase while _u1091v failed

大佬会完善这个插件吗

@echo094
Copy link
Owner

echo094 commented Jul 26, 2023

现阶段我没有时间去完善,但是我可以分享一些思路。

这种混淆最关键的就是把打散的分支语句拼接回去,但目前以纯静态分析的方式来搞有点陷入了僵局(目前的进度是能够合并90%左右的选择语句)。现在拼接的逻辑是当对应的代码块只被引用1次时,就将它合并到上一个代码块。但是这个混淆策略中有一些干扰,让引用计数大于1,从而阻止上述操作:

  • 混淆脚本里有一些常量选择分支,需要将干扰项去除以修正实际引用计数。但是部分常量语句是隐式的,比如通过测试是否含有浏览器才有的内部方法
  • 你会发现那个最长的函数存在嵌套调用,说明这个函数将原始代码的多个函数整合到了1个switch中,这就导致有些if语句需要使用传入值判断,也就是需要根据传入值将这个函数拆分为多个函数。

我目前不知道还有没有别的坑点,但这两个问题是实现静态分析所必须要解决的,只是目前我没有足够的精力去完成。

你也可以使用插桩来动态分析这个脚本,随后将其还原:某宝登录bx-ua参数逆向思路(fireyejs 225算法),我这个插件一开始也是按照这个帖子做的,只是我不想用动态分析,这种可能会漏掉情况。

sml2h3/ast_tools 也是针对这种混淆的,你也可以参考一下。

最后关于那个while的问题,在这种混淆下,一个含有String.fromCharCode的while语句实际上对应一个字符串,即在语句上方一定有一个混淆后的字符串,通过这个while解混淆。但是由于上面提到的问题,这两个代码块没有被合并,于是这个while就没法被还原了。

然后,while语句在混淆后的脚本中特征非常明显,就是出现自引。但是有些自引不再第一个if语句中,说明存在未被删除的无效代码。对于这种情况,目前没有强行将其还原。

@echo094 echo094 pinned this issue Jul 26, 2023
@HenryWu01
Copy link
Author

谢谢大佬的思路,正在学习中

@echo094 echo094 added the wip Work in progress label Aug 8, 2023
@HenryWu01
Copy link
Author

今天看到一篇文章不知道对大佬有没有帮助 https://www.52pojie.cn/forum.php?mod=viewthread&tid=1818486&highlight=226

@echo094
Copy link
Owner

echo094 commented Aug 8, 2023

今天看到一篇文章不知道对大佬有没有帮助 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检测(这种检测在其它公开的混淆工具里也有),不把这些去掉始终是个隐患。

@HenryWu01
Copy link
Author

今天看到一篇文章不知道对大佬有没有帮助 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 还在导致分析起来还是有点困难

@echo094
Copy link
Owner

echo094 commented Aug 8, 2023

是的,我目前在适用大佬的另外一个分支配合动态调试,但是最大的那个 switch 还在导致分析起来还是有点困难

根据动态调试的结果就能合并代码了。

@echo094 echo094 linked a pull request Oct 16, 2023 that will close this issue
@echo094 echo094 changed the title 大佬好,awsc 插件 (draft) 版本报错 awsc: 开发讨论和进度 Nov 6, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
wip Work in progress
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants