【原创】and函数的深入研究 用and代替if
本帖最后由 baitang36 于 2024-7-4 09:14 编辑先看一下桌子关于and这个函数的说明:
And
Returns the logical AND of the supplied arguments ;返回所提供参数的逻辑AND(and ...])
Arguments;参数
expr ;表达式Any expression.
Return Values
Nil, if any of the expressions evaluate to nil; otherwise T. If and is issued without arguments, it returns T.
返回值:
如果任何一个表达式的求值结果为Nil,就返回nil;否则返回T。
如果在没有参数的情况下则返回T。
通过跟踪fas内存中的and指令,发现桌子这个说明是不完全的。
完整的应该这样说:and指令是对表达式按顺序进行求值(运行),如果结果是T,会继续对下一个表达式求值,如果结果是nil,结束and指令,返回nil,后面的表达式被跳过,不会被求值。如果最后一个表达式求值完成,结果是t,and指令返回T。
说的比较啰嗦,用代码来说明:
(and (setq a 1)(setq b 2)(setq c nil)(setq d 4)) 加载后返回nil ,但(setq d 4)这个表达式是被跳过了,nil 后面的表达式不会被求值。
在命令行验证一下:
命令: (setq d nil)
nil
命令: (and (setq a 1)(setq b 2)(setq c nil)(setq d 4))
nil
命令: !d
nil
根据上面的原理,我们可以用and来代替if
(if (= a 1)
(setq b 2)
)
可以用
(and (= a 1)(setq b 2))代替,b的结果是一样的
可以用两个and来替换(if testexpr thenexpr elseexpr)
(and testexpr thenexpr )
(and(not testexpr) elseexpr)
或者(or (and a b)c)
and表达式里面加progn,可以让反编译的结果混乱,不能运行。
(defun tt()
(and (setq a 1)
(progn(setq b 2)(setq c nil)(setq d 4))
)
)
;(vlisp-compile 'st "d:/and1.lsp")
编译后再反编译progn没了,d的结果就不对了
本帖最后由 llsheng_73 于 2024-11-7 11:01 编辑
baitang36 发表于 2024-7-3 09:15
这个可以用来对抗反编译,and表达式里面加progn,可以让反编译的结果混乱,不能运行。
(if(progn a b c)(progn e f g)
(progn h i j k))
这样反编译出来是不是直接无法运行了,因为if里边超过判断条件,then,else这三大块结构了?
但这样很容易找到出问题的地方,只是极难猜准到底该怎么加progn才能正确,需要读取大量前后代码,把逻辑基本理得差不多才有可能? 黄翔 发表于 2024-7-3 10:42
按照楼主的意思, and 只能替代 (if testexpr thenexpr ) 情况
不能替换(if testexpr thenexpr elseexpr)
可以用两个and来替换(if testexpr thenexpr elseexpr)
(and testexpr thenexpr )
(and(not testexpr) elseexpr)
这样写有点啰嗦了,但用在对抗反编译和破解还是有点效果的。
if语句是破解者重点关注的语句,改了它往往就破解成功了。 baitang36 发表于 2024-11-8 15:19
是的,现有反编译程序无法完美处理这种情况
这也是一个办法啊,反出来一看源码就有问题,但是一般说来不清楚程序设计者的想法是很难把它搞正确的,但是一定会让人在这种地方花费很大力气,如果这样的地方比较多,估计只能直接放弃了 谢谢哥的分享!
赞~~ 使用if更清晰一些。相反的,是or 自贡黄明儒 发表于 2024-7-3 09:14
使用if更清晰一些。相反的,是or
这个可以用来对抗反编译,and表达式里面加progn,可以让反编译的结果混乱,不能运行。 类似于&&和& baitang36 发表于 2024-7-3 09:15
这个可以用来对抗反编译,and表达式里面加progn,可以让反编译的结果混乱,不能运行。
其实其它语言的and or 及其三元什么的,是一个意思 。倒是您这句话,有重要意义。 自贡黄明儒 发表于 2024-7-3 09:20
其实其它语言的and or 及其三元什么的,是一个意思 。倒是您这句话,有重要意义。
(and (setq a 1)(progn(setq b 2)(setq c nil)(setq d 4)))反编译后progn没了,d的结果就不对了 大佬深入研究,感谢热心分享 都能反编译出来了.还不会加progn吗? 黄翔 发表于 2024-7-3 10:06
都能反编译出来了.还不会加progn吗?
几千行代码中时不时加几个这种赋值,没人能查的出