baitang36 发表于 2020-8-13 09:29:50

把if语句变成repeat

本帖最后由 baitang36 于 2022-6-20 08:57 编辑

判断注册码是否正确,很多人这么写:
(defun zhuce ()
(if (= reg1 reg2)
    (princ "注册成功!")
    (progn (princ "注册失败") (exit))
)
)

这函数编译后的代码用winhex查看,是这样的:
Offset      01234567   89 10 11 12 13 14 15
00000032                               14 00 00 00 00 03 07                  
00000048   00 03 06 00 35 02 05 0003 67 0D 00 00 00 09 04         
00000064   00 35 01 03 00 03 57 0E00 00 00 09 02 00 35 01   
00000080   03 00 03 0A 35 00 01 0003 16
                        
手工反编译一下:
14 00 00 00 00                     函数开始
03 07 00                           REG1
03 06 00                           REG2
35 02 05 0003                      (= reg1 reg2)
67 0D 00 00 00                     IF
09 04 00                           "注册成功!"
35 01 03 00 03                     (princ "注册成功!")   
57 0E00 00 00                      跳过14个字节
09 02 00                           "注册失败"
35 01 03 00 03 0A                  (princ "注册失败")
35 00 01 0003                      (EXIT)
16                                    函数结束
破解方法非常简单,查找67,找到后把67后面的字节改成0.这样无论reg1和reg2是否相等,都会显示“注册
成功”。
如果把程序改写一下,功能不变,改成这样:
(defun zhuce ()
(setq aa1(abs (- reg1 reg2)))
   (repeat aa1
   (princ "注册失败")
   (exit)
    )
(princ "注册成功!")
)
;以下是试验代码
(setq reg1 1reg2 8)
(zhuce)

函数编译后是这样的
Offset      01234567   89 10 11 12 13 14 15
00000032                               24 14 01 00 00 00 03         
00000048   09 00 03 08 00 35 02 0700 03 35 01 06 00 03 06      
00000064   05 00 03 05 00 5D 00 005C 00 00 32 00 4B 67 1B   
00000080   00 00 00 5C 00 00 50 5D00 00 09 04 00 35 01 03   
00000096   00 03 0A 35 00 02 00 030A 57 DA FF FF FF 09 01      
00000112   00 35 01 03 00 03 16      
如果还用上面的破解办法,查找67,找到后把67后面的字节改成0.
你会发现,还是会显示"注册失败",破解失败了。
这种把if变成repeat来完成跳转的方法是有效的,破解方法我就不说了,有兴趣者自己研究吧 :-)


烟盒迷唇 发表于 2020-8-13 19:14:20

如果REG1和REG2不是数值就没法相减了。

baitang36 发表于 2020-8-13 20:38:08

烟盒迷唇 发表于 2020-8-13 19:14
如果REG1和REG2不是数值就没法相减了。

可以想办法变成数字
页: [1]
查看完整版本: 把if语句变成repeat