找回密码
 加入
搜索
查看: 1292|回复: 6

[AU3基础] 开贴解释一下为什么不建议使用If Not IsDeclared("GENERIC_READ") Then ...

[复制链接]
发表于 2022-4-9 11:16:30 | 显示全部楼层 |阅读模式
本帖最后由 tubaba 于 2022-4-9 11:27 编辑

昨天有网友私聊我,关于au3encode混淆脚本出现了问题。看到样本,我立刻明白又是那个If Not IsDeclared("GENERIC_READ") Then Global Const $GENERIC_READ = 0x80000000 之类的问题。以下是私聊记录,我以为我解释的已经足够清楚。汗
Discuz! X 短消息记录(此消息记录不支持重新导入)

================================================================
消息对象: smooth
================================================================

smooth 2022-4-7 11:43
关于您在“修改了下最新版的AutoIt3Wrapper.au3,姑且算是原创吧”的帖子

用你的混淆工具,会自动跑出来几十个多余的变量。精简后的没有问题,就是混淆后的有问题。

tubaba 2022-4-8 08:49
如果可以,请提取出问题的行,做为样本发给我看看

smooth 2022-4-8 11:01
If Not $JA7NWq233($izoX__N_) Then Global Const $pT_M3NEH043 = $WIy0w_Q2g__U

If Not $JA7NWq233($O6I__0Y2R9) Then Global Const $MA_sOFH = $s_xRcKsjyo8S

If Not $JA7NWq233($Ve_h_3lk) Then Global Const $NqtY_y8_yH__ = $p_4_qo

If Not $JA7NWq233($f___6gq6_8o_) Then Global Const $Sq_RZ_u = $K_Ie4k_P

If Not $JA7NWq233($d95g_9t__5W) Then Global Const $X_A2l1c_3Ux = $TQ4_93C_z

If Not $JA7NWq233($e8_H1O) Then Global Const $Sa_7_1_I = $b_G9mUO_VX

If Not $JA7NWq233($bO7_77_P_4O) Then Global Const $U6k_mt = $v_69__0j__a_

If Not $JA7NWq233($FM1BH7) Then Global Const $Cq9C_s_3nhk4 = $XB_Uq0FY

If Not $JA7NWq233($O_3_f_p) Then Global Const $re_4h3v_8__ = $w_tqEz_

If Not $JA7NWq233($e0AP2t71nC) Then Global Const $K_Q26ud9H_5f = $I8K_y31zPK

If Not $JA7NWq233($Ki9_k5RM) Then Global Const $I9__8roEXa = $J_V9oX5wMk

If Not $JA7NWq233($Z_F2t6) Then Global Const $pnZ64M_S__ = $k5VU_JJR7___

If Not $JA7NWq233($uwa_NS) Then Global Const $H_fj3_7g = $E84___wPx

If Not $JA7NWq233($W8_dSm_O_S45) Then Global Const $N4G3B7_k_49 = $S1__Ql_A_2

If Not $JA7NWq233($KgGPt0qE_) Then Global Const $q9f___1____ = $d__71jnq

If Not $JA7NWq233($A50Vd_sJb) Then Global Const $eKI9m14 = $XvqC_nb_Y_

If Not $JA7NWq233($Q4Ll_7_O9) Then Global Const $y2fe_H_H = $F4dbZKL5dx

If Not $JA7NWq233($tp_g3_QrH_F) Then Global Const $o_Z_oEH1_6 = $n_R8r_u3

If Not $JA7NWq233($X_dIs_X) Then Global Const $K_J_m__L = $L_dIIV_N8

If Not $JA7NWq233($f__3g__) Then Global Const $Ig8V_E = $H4_UWojLP9_

If Not $JA7NWq233($by_V_6JQr) Then Global Const $u2___L_V = $DBNe0ke_COr

If Not $JA7NWq233($gSErsx6) Then Global Const $H_KFct_1_GSs = $lVz2ImEZ

If Not $JA7NWq233($p_2V_8C_9) Then Global Const $bV0_9l__143p = $U_A_Qn582_P_

If Not $JA7NWq233($d__A_r) Then Global Const $Dq_4y32 = $GU9Nv_j

If Not $JA7NWq233($ZFFA__221) Then Global Const $zT78RZ62q5s = $oP6_g161C

If Not $JA7NWq233($PI_74qMjdTDf) Then Global Const $k178_6_s = 0x80

If Not $JA7NWq233($yNE4hupbefp9) Then Global Const $dmlmdS_ = 0x40

If Not $JA7NWq233($X___W1_) Then Global Const $B_p8uT1J7 = 0x20

If Not $JA7NWq233($k4K2TA) Then Global Const $YHCc_F4_Ql = 0x100

If Not $JA7NWq233($TT_118R9Pm_) Then Global Const $itqgeexe = 0x01

If Not $JA7NWq233($Oo3Ji__I29__) Then Global Const $Rc__J8 = 0x2

If Not $JA7NWq233($v88q_YmbgA_) Then Global Const $G_E_unS_G2z = 0x20000

If Not $JA7NWq233($Xlg_I7__i) Then Global Const $y8hhKJ78E0lJ = 0x4

If Not $JA7NWq233($MKBy_4E1T__) Then Global Const $Q141K73Wc_o_ = 0x8

If Not $JA7NWq233($f_mP_u) Then Global Const $eH0R_DJ_V = 0x10

If Not $JA7NWq233($C75U_3f) Then Global Const $I2t1zLQ = 0x20008

If Not $JA7NWq233($K61cp__) Then Global Const $tU56t__OA = 0x200e0

If Not $JA7NWq233($w7_22__) Then Global Const $P4Y5k0rO4V_M = 0xF01FF

If Not $JA7NWq233($sV3mc_3f1oZ9) Then Global Const $NTSBfHJ_7_8 = 0x80000000

If Not $JA7NWq233($xF_BY__o6_) Then Global Const $c3vN___ = 0x40000000

If Not $JA7NWq233($G9_e_4C3u_) Then Global Const $t_R_EmV = 0x20000000

If Not $JA7NWq233($I1_5n_Cn_) Then Global Const $hp8e_E__39 = 0x10000000

If Not $JA7NWq233($s6_C3HyQ) Then Global Const $tQ6lWTn__087 = 0x20000

If Not $JA7NWq233($sjk__4xsk_6) Then Global Const $f5jj5SV_ = 0x40000

If Not $JA7NWq233($Ud_Or0_N7) Then Global Const $ADYzQ7x = 0x80000

If Not $JA7NWq233($J9HY6_) Then Global Const $h3F_9_13 = 0x1000000



这些都是多出来的,运行提示重复声明变量,但是Merger文件是正常的。本来想截图,发现这里传不了图片。

tubaba 2022-4-8 12:04
这种情况不可能发生,au3encode不会自动添加类似上述代码。建议查看日志,比如If Not $JA7NWq233($f_mP_u) Then Global Const $eH0R_DJ_V = 0x10,去找日志里变量$eH0R_DJ_V替换前是什么名称,再去meger脚本中ctrl+F查找看看

tubaba 2022-4-8 13:29
加入编译指令 #AutoIt3Wrapper_Run_AU3Check=n



因为If Not IsDeclared("ERROR_SUCCESS") Then Global Const $ERROR_SUCCESS = 0x00000000 不能通过较新版本的au3check检查

smooth 2022-4-8 15:40
1、我在日志里查过,没有找到替换之前的变量;

2、我加入了编译指令 #AutoIt3Wrapper_Run_AU3Check=n,结果还是一样的会多出那些行。

smooth 2022-4-8 16:25
If Not IsDeclared("ERROR_INVALID_SID") Then Global Const $ERROR_INVALID_SID = 1337

If Not IsDeclared("SE_CREATE_TOKEN_NAME") Then Global Const $SE_CREATE_TOKEN_NAME = "SeCreateTokenPrivilege"

If Not IsDeclared("SE_ASSIGNPRIMARYTOKEN_NAME") Then Global Const $SE_ASSIGNPRIMARYTOKEN_NAME = "SeAssignPrimaryTokenPrivilege"

If Not IsDeclared("SE_LOCK_MEMORY_NAME") Then Global Const $SE_LOCK_MEMORY_NAME = "SeLockMemoryPrivilege"

If Not IsDeclared("SE_INCREASE_QUOTA_NAME") Then Global Const $SE_INCREASE_QUOTA_NAME = "SeIncreaseQuotaPrivilege"

If Not IsDeclared("SE_UNSOLICITED_INPUT_NAME") Then Global Const $SE_UNSOLICITED_INPUT_NAME = "SeUnsolicitedInputPrivilege"

If Not IsDeclared("SE_MACHINE_ACCOUNT_NAME") Then Global Const $SE_MACHINE_ACCOUNT_NAME = "SeMachineAccountPrivilege"

If Not IsDeclared("SE_TCB_NAME") Then Global Const $SE_TCB_NAME = "SeTcbPrivilege"

If Not IsDeclared("SE_SECURITY_NAME") Then Global Const $SE_SECURITY_NAME = "SeSecurityPrivilege"

If Not IsDeclared("SE_TAKE_OWNERSHIP_NAME") Then Global Const $SE_TAKE_OWNERSHIP_NAME = "SeTakeOwnershipPrivilege"

If Not IsDeclared("SE_LOAD_DRIVER_NAME") Then Global Const $SE_LOAD_DRIVER_NAME = "SeLoadDriverPrivilege"

If Not IsDeclared("SE_SYSTEM_PROFILE_NAME") Then Global Const $SE_SYSTEM_PROFILE_NAME = "SeSystemProfilePrivilege"

If Not IsDeclared("SE_SYSTEMTIME_NAME") Then Global Const $SE_SYSTEMTIME_NAME = "SeSystemtimePrivilege"

If Not IsDeclared("SE_PROF_SINGLE_PROCESS_NAME") Then Global Const $SE_PROF_SINGLE_PROCESS_NAME = "SeProfileSingleProcessPrivilege"

If Not IsDeclared("SE_INC_BASE_PRIORITY_NAME") Then Global Const $SE_INC_BASE_PRIORITY_NAME = "SeIncreaseBasePriorityPrivilege"

If Not IsDeclared("SE_CREATE_PAGEFILE_NAME") Then Global Const $SE_CREATE_PAGEFILE_NAME = "SeCreatePagefilePrivilege"

If Not IsDeclared("SE_CREATE_PERMANENT_NAME") Then Global Const $SE_CREATE_PERMANENT_NAME = "SeCreatePermanentPrivilege"

If Not IsDeclared("SE_BACKUP_NAME") Then Global Const $SE_BACKUP_NAME = "SeBackupPrivilege"

If Not IsDeclared("SE_RESTORE_NAME") Then Global Const $SE_RESTORE_NAME = "SeRestorePrivilege"

If Not IsDeclared("SE_SHUTDOWN_NAME") Then Global Const $SE_SHUTDOWN_NAME = "SeShutdownPrivilege"

If Not IsDeclared("SE_DEBUG_NAME") Then Global Const $SE_DEBUG_NAME = "SeDebugPrivilege"

If Not IsDeclared("SE_AUDIT_NAME") Then Global Const $SE_AUDIT_NAME = "SeAuditPrivilege"

If Not IsDeclared("SE_SYSTEM_ENVIRONMENT_NAME") Then Global Const $SE_SYSTEM_ENVIRONMENT_NAME = "SeSystemEnvironmentPrivilege"

If Not IsDeclared("SE_CHANGE_NOTIFY_NAME") Then Global Const $SE_CHANGE_NOTIFY_NAME = "SeChangeNotifyPrivilege"

If Not IsDeclared("SE_REMOTE_SHUTDOWN_NAME") Then Global Const $SE_REMOTE_SHUTDOWN_NAME = "SeRemoteShutdownPrivilege"

If Not IsDeclared("SE_UNDOCK_NAME") Then Global Const $SE_UNDOCK_NAME = "SeUndockPrivilege"

Global Const $SE_KERNEL_OBJECT = 6

If Not IsDeclared("TOKEN_ADJUST_DEFAULT") Then Global Const $TOKEN_ADJUST_DEFAULT = 0x80

If Not IsDeclared("TOKEN_ADJUST_GROUPS") Then Global Const $TOKEN_ADJUST_GROUPS = 0x40

If Not IsDeclared("TOKEN_ADJUST_PRIVILEGES") Then Global Const $TOKEN_ADJUST_PRIVILEGES = 0x20

If Not IsDeclared("TOKEN_ADJUST_SESSIONID") Then Global Const $TOKEN_ADJUST_SESSIONID = 0x100

If Not IsDeclared("TOKEN_ASSIGN_PRIMARY") Then Global Const $TOKEN_ASSIGN_PRIMARY = 0x01

If Not IsDeclared("TOKEN_DUPLICATE") Then Global Const $TOKEN_DUPLICATE = 0x2

If Not IsDeclared("TOKEN_EXECUTE") Then Global Const $TOKEN_EXECUTE = 0x20000

If Not IsDeclared("TOKEN_IMPERSONATE") Then Global Const $TOKEN_IMPERSONATE = 0x4

If Not IsDeclared("TOKEN_QUERY") Then Global Const $TOKEN_QUERY = 0x8

If Not IsDeclared("TOKEN_QUERY_SOURCE") Then Global Const $TOKEN_QUERY_SOURCE = 0x10

If Not IsDeclared("TOKEN_READ") Then Global Const $TOKEN_READ = 0x20008

If Not IsDeclared("TOKEN_WRITE") Then Global Const $TOKEN_WRITE = 0x200e0

If Not IsDeclared("TOKEN_ALL_ACCESS") Then Global Const $TOKEN_ALL_ACCESS = 0xF01FF

If Not IsDeclared("GENERIC_READ") Then Global Const $GENERIC_READ = 0x80000000

If Not IsDeclared("GENERIC_WRITE") Then Global Const $GENERIC_WRITE = 0x40000000

If Not IsDeclared("GENERIC_EXECUTE") Then Global Const $GENERIC_EXECUTE = 0x20000000

If Not IsDeclared("GENERIC_ALL") Then Global Const $GENERIC_ALL = 0x10000000

If Not IsDeclared("READ_CONTROL") Then Global Const $READ_CONTROL = 0x20000

If Not IsDeclared("WRITE_DAC") Then Global Const $WRITE_DAC = 0x40000

If Not IsDeclared("WRITE_OWNER") Then Global Const $WRITE_OWNER = 0x80000

If Not IsDeclared("ACCESS_SYSTEM_SECURITY") Then Global Const $ACCESS_SYSTEM_SECURITY = 0x1000000

我找到混淆之前的代码了,其中:

If Not IsDeclared("ERROR_INVALID_SID") Then Global Const $ERROR_INVALID_SID = 1337

Global Const $SE_KERNEL_OBJECT = 6

这两句混淆之后没问题,其他的都有问题。但是混淆之前运行没有提示重复定义变量,混淆之后提示重复定义。

而且,为什么混淆之后,我删除了,脚本也没有报错?

smooth 2022-4-8 16:32
根据IsDeclared函数,就是检测一个变量是否已经声明,所以未混淆之前运行没有问题,但是混淆之后,就导致重复定义了,所以推测是混淆出了问题。

tubaba 2022-4-8 22:48
这个问题我前面已经回答过了,这是新版au3check的问题,让你加入编译指令的目的就是跳过这些检查,而不是会将if not isdeclared xxx then xxx 的行精简掉

为什么这些语句会存在?因为你的脚本已经声明过某个变量,而这个变量再一次用if not dec…声明,根据精简规则,这句是不会被去除,当然,因为之前已经声明过,因此手动删除不会影响脚本运行,即使不删除,只要在编译时跳过au3check检查,也是可以编译的,而且运行正常。

相信你的Udf函数来自pusofalse.官方的UDF已不会采用这种方式检查一个变量是否声明,若没有则声明它

tubaba 2022-4-8 22:57
你把pusofaulse的UDF跟官方UDF函数混在一起用,就会出现这种情况



纠正下,前面我所说的应该是常量,同一常量,是不可以声明两次的

smooth 2022-4-8 23:07
是的,是P版的函数。精简后在SciTE里面运行可以问题,就是混淆之后就提示重复声明。

smooth 2022-4-8 23:08
是的,是P版的函数。精简后在SciTE里面运行没有问题,就是混淆之后在SciTe里面运行提示重复声明。

tubaba 2022-4-9 09:02
你去开帖提问吧,看问题不能看表象,要找出为什么这样的原因!到此为止,我不想在这个问题浪费时间

tubaba 2022-4-9 10:30
https://www.autoitx.com/forum.ph ... amp;fromuid=7638255

我的结论:谁都没有错,是au3chek程序错了

为什么会出现这个问题?----->P_UDF和官_UDF组合在一起使用.

因为P版的UDF为了尽量脱离官UDF,以If Not IsDeclared("GENERIC_READ") Then Global Const $GENERIC_READ = 0x80000000 这种方式去声明一个常量,其逻辑是若其它UDF没有声明这个常量,那么我来声明它.逻辑上没错,也没问题.但为什么会报错?因为这个常量已经在官UDF中声明过了.

报错是au3check检查所致.因为在scite中按F5执行的话,默认在执行前会先进行au3check检查,若检查出问题,当然会停止.

那au3check是如此愚蠢吗?很遗憾,是的

请测试以下代码
;~ #autoit3Wrapper_Run_AU3Check=n
Global Const $GENERIC_READ = 0x80000000
If Not IsDeclared("GENERIC_READ") Then Global Const $GENERIC_READ = 0x80000000
MsgBox(0,0,$GENERIC_READ)



按F5在scite中运行,你会发现报错了!error: $GENERIC_READ previously declared as a 'Const'.
把第一行的注释去掉.正常运行.
所以此现象有两种解决方法
1.去掉If Not IsDeclared("GENERIC_READ") Then Global Const $GENERIC_READ = 0x80000000 等类似的语句
2.脚本头部加入指令#autoit3Wrapper_Run_AU3Check=n,但是这样无法发现其它的一些错误.


PS:
我找到混淆之前的代码了,其中:

If Not IsDeclared("ERROR_INVALID_SID") Then Global Const $ERROR_INVALID_SID = 1337

Global Const $SE_KERNEL_OBJECT = 6

这两句混淆之后没问题,其他的都有问题。但是混淆之前运行没有提示重复定义变量,混淆之后提示重复定义。

而且,为什么混淆之后,我删除了,脚本也没有报错?

现在懂了吗?这两句不报是因为其它的UDF没有声明这个常量!

不知这样是否表达清楚了?又或我语文功底太差,不能解释明白!




发表于 2022-4-9 13:16:03 | 显示全部楼层
混淆后的代码越不能在编辑器中正常执行越好。
发表于 2022-4-10 01:17:21 | 显示全部楼层
楼上两位都是高人,都为au3的混淆做了不少贡献。在此感谢两位前辈。
发表于 2022-4-10 08:16:28 | 显示全部楼层
afan 发表于 2022-4-9 13:16
混淆后的代码越不能在编辑器中正常执行越好。

    先 先
      贝
大写的赞送给你
发表于 2022-4-10 14:43:25 | 显示全部楼层
现在懂了吗?这两句不报是因为其它的UDF没有声明这个常量!

我是后面去找了这句没有报错的,才知道它没有被另外定义,才明白的。
发表于 2022-4-11 22:39:29 | 显示全部楼层
到现在我也没找到一个好的混淆程序!反正是程序尽量自用,不发布。
16新版刚出时,发现某个反编译程序对新版已编译的EXE文件无效!这样好像心宽了些。
发表于 2022-4-14 15:57:13 来自手机 | 显示全部楼层
学习了,今天又学了新知识
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-4 09:40 , Processed in 0.076397 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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