[Trykle MaxScript 混淆器设计] 名称混淆

名称混淆就是改变用户变量的名字
它是混淆器的一项基础功能

示例

fn test = 1

输出

fn dcfghieefgfffgfgabab = 1

或者

fn ii1lliiili1i1iii11i11iiiiii = 1

fn ⠅⠢⠡⠄⠤⠄⠣⡂⠠⠠⠅⠠⠠ = 1

fn  '>>>>>>>ゅ°' = 1

在这几种名字变化中,它们的强度都是一致的
不管你是用中文,日文,还是盲文、鱼尾纹,只要改变了原有变量的名字,目的就达到了
而入侵者总是可以变成利于他们阅读的变量
比如fn var01 = 1

如果使用AI参与,还原后的变量名甚至比原始的更好

认知误区

由于mxs的标识符名字设计允许任意符号,有的人一看到花里胡哨的变量名就觉得混淆得好
比如,我们的源代码中有一个readFile的函数名,它的功能是读取文件内容
现在,有如下几种混淆名字示例

  1. 'B $+@&/*#)@$_ '

  2. a9d8567807e5

  3. ii1iii1lililliilii1llii1lli1i1l1i1li

  4. a1

  5. getUserName

这几种名字中,最好的混淆效果是 getUserName
其余几种方式都是第一眼就直接的告诉入侵者,这个名字我改过了
getUserName这个看起来正常的名字,不会第一眼就让入侵者感觉这个名字被改过

迷惑人的永远是你熟悉的东西,欺负的就是有文化的

字符串里面的变量

fn test = 1
print "test"
execute "test()"

在这个示例中,只有fn后的test会被改变,而字符串里的变量将不会被改变
不管是否改变字符串内的名字,这都将导致一种错误,因为我们无法分析出开发者的意图究竟是表达外部的函数名,还是单纯的字符串内容
这种情况,需要交给用户去决断
或者,启用全字符串扫描,降低混淆覆盖率,直接将这种出错的情况宽泛的排除掉

是当前变量,又是外部属性的名字

fn DoEvents =
(
	(dotNetClass "System.Windows.Forms.Application").DoEvents()
)

在这个示例中,DoEvents既是当前定义的一个函数名字,也是一个外部类中的成员名字,
如果进行了改变,则代码变成类似这种情况

fn _2ffd35b8 =
(
	(dotNetClass "System.Windows.Forms.Application")._2ffd35b8()
)

此时执行函数将会报错,这种情况需要用户主动进行排除,或者自动扫描规则来排除

posted @ 2023-09-30 15:28  trykle  阅读(124)  评论(0编辑  收藏  举报