明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 663|回复: 30

[经验] 【原创】and函数的深入研究 用and代替if

  [复制链接]
发表于 2024-7-3 09:04 | 显示全部楼层 |阅读模式
本帖最后由 baitang36 于 2024-7-4 09:14 编辑

先看一下桌子关于and这个函数的说明:
And
Returns the logical AND of the supplied arguments ;返回所提供参数的逻辑AND
(and [expr ...])
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的结果就不对了







评分

参与人数 6明经币 +6 收起 理由
zhoupeng220 + 1 很给力!
hubeiwdlue + 1 赞一个!
ssyfeng + 1 赞一个!
xtjd + 1 很给力!
cghdy + 1 很给力!
p-3-ianlcc + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2024-7-3 11:08 | 显示全部楼层
黄翔 发表于 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语句是破解者重点关注的语句,改了它往往就破解成功了。
 楼主| 发表于 2024-7-3 09:30 | 显示全部楼层
自贡黄明儒 发表于 2024-7-3 09:20
其实其它语言的and or 及其三元什么的,是一个意思 。倒是您这句话,有重要意义。

(and (setq a 1)(progn(setq b 2)(setq c nil)(setq d 4)))反编译后progn没了,d的结果就不对了
发表于 2024-7-3 09:20 | 显示全部楼层
baitang36 发表于 2024-7-3 09:15
这个可以用来对抗反编译,and表达式里面加progn,可以让反编译的结果混乱,不能运行。

其实其它语言的and or 及其三元什么的,是一个意思 。倒是您这句话,有重要意义。
发表于 2024-7-3 09:07 | 显示全部楼层
谢谢哥的分享!
赞~~
发表于 2024-7-3 09:14 | 显示全部楼层
使用if更清晰一些。相反的,是or
 楼主| 发表于 2024-7-3 09:15 | 显示全部楼层
自贡黄明儒 发表于 2024-7-3 09:14
使用if更清晰一些。相反的,是or

这个可以用来对抗反编译,and表达式里面加progn,可以让反编译的结果混乱,不能运行。

评分

参与人数 1明经币 +1 收起 理由
自贡黄明儒 + 1 有价值的,是这句话。

查看全部评分

发表于 2024-7-3 09:16 | 显示全部楼层
类似于  &&  和&
发表于 2024-7-3 09:53 | 显示全部楼层
大佬深入研究,感谢热心分享
发表于 2024-7-3 10:06 | 显示全部楼层
都能反编译出来了.还不会加progn吗?
发表于 2024-7-3 10:18 | 显示全部楼层
黄翔 发表于 2024-7-3 10:06
都能反编译出来了.还不会加progn吗?

几千行代码中时不时加几个这种赋值,没人能查的出

点评

我能查的出,但非常麻烦,需要阅读fas的代码  发表于 2024-7-3 10:23
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-7-7 01:31 , Processed in 0.176691 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表