本帖最后由 baitang36 于 2022-6-20 08:57 编辑
判断注册码是否正确,很多人这么写:
 - (defun zhuce ()
- (if (= reg1 reg2)
- (princ "注册成功!")
- (progn (princ "注册失败") (exit))
- )
- )
这函数编译后的代码用winhex查看,是这样的:
Offset 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
00000032 14 00 00 00 00 03 07
00000048 00 03 06 00 35 02 05 00 03 67 0D 00 00 00 09 04
00000064 00 35 01 03 00 03 57 0E 00 00 00 09 02 00 35 01
00000080 03 00 03 0A 35 00 01 00 03 16
手工反编译一下:
14 00 00 00 00 函数开始
03 07 00 REG1
03 06 00 REG2
35 02 05 00 03 (= reg1 reg2)
67 0D 00 00 00 IF
09 04 00 "注册成功!"
35 01 03 00 03 (princ "注册成功!")
57 0E 00 00 00 跳过14个字节
09 02 00 "注册失败"
35 01 03 00 03 0A (princ "注册失败")
35 00 01 00 03 (EXIT)
16 函数结束
破解方法非常简单,查找67,找到后把67后面的字节改成0.这样无论reg1和reg2是否相等,都会显示“注册
成功”。
如果把程序改写一下,功能不变,改成这样:
 - (defun zhuce ()
- (setq aa1(abs (- reg1 reg2)))
- (repeat aa1
- (princ "注册失败")
- (exit)
- )
- (princ "注册成功!")
- )
- ;以下是试验代码
- (setq reg1 1 reg2 8)
- (zhuce)
函数编译后是这样的
Offset 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
00000032 24 14 01 00 00 00 03
00000048 09 00 03 08 00 35 02 07 00 03 35 01 06 00 03 06
00000064 05 00 03 05 00 5D 00 00 5C 00 00 32 00 4B 67 1B
00000080 00 00 00 5C 00 00 50 5D 00 00 09 04 00 35 01 03
00000096 00 03 0A 35 00 02 00 03 0A 57 DA FF FF FF 09 01
00000112 00 35 01 03 00 03 16
如果还用上面的破解办法,查找67,找到后把67后面的字节改成0.
你会发现,还是会显示"注册失败",破解失败了。
这种把if变成repeat来完成跳转的方法是有效的,破解方法我就不说了,有兴趣者自己研究吧 :-)
|