开贴解释一下为什么不建议使用If Not IsDeclared("GENERIC_READ") Then ...
本帖最后由 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没有声明这个常量!
不知这样是否表达清楚了?又或我语文功底太差,不能解释明白!
混淆后的代码越不能在编辑器中正常执行越好。 楼上两位都是高人,都为au3的混淆做了不少贡献。在此感谢两位前辈。
afan 发表于 2022-4-9 13:16
混淆后的代码越不能在编辑器中正常执行越好。
先 先
贝
大写的赞送给你
现在懂了吗?这两句不报是因为其它的UDF没有声明这个常量!
我是后面去找了这句没有报错的,才知道它没有被另外定义,才明白的。 到现在我也没找到一个好的混淆程序!反正是程序尽量自用,不发布。
16新版刚出时,发现某个反编译程序对新版已编译的EXE文件无效!这样好像心宽了些。 学习了,今天又学了新知识
页:
[1]