其实黑客字典II是不用破解的,在作者网上已经有密码了。写此文,只是看看它的注册方式而已。
1、输入用户名和注册码后,启动TRW2000,设中断BPX HMEMCPY 再回到程序中,按确定,拦截成功。
2、按F10直到第二次回到程序中是慢走。看到如下程序。
0167:00401BC6 CALL 00420016
0167:00401BCB MOV EAX,[EBP+78]
0167:00401BCE LEA ESI,[EBP+5C]
0167:00401BD1 PUSH EBX
0167:00401BD2 PUSH BYTE -01
0167:00401BD4 PUSH DWORD B1
0167:00401BD9 PUSH EAX
0167:00401BDA CALL EDI
0167:00401BDC MOV ECX,[ESI+1C]
0167:00401BDF PUSH EBX
0167:00401BE0 PUSH EBX
0167:00401BE1 PUSH DWORD B7
0167:00401BE6 PUSH ECX
0167:00401BE7 CALL EDI
0167:00401BE9 LEA EDX,[ESP+84]
0167:00401BF0 PUSH BYTE +64
0167:00401BF2 PUSH EDX
0167:00401BF3 MOV ECX,ESI
0167:00401BF5 CALL 00420016
0167:00401BFA LEA EDI,[ESP+20]
0167:00401BFE OR ECX,BYTE -01
0167:00401C01 XOR EAX,EAX
0167:00401C03 REPNE SCASB
0167:00401C05 NOT ECX
0167:00401C07 DEC ECX
0167:00401C08 JZ NEAR 00401E24
0167:00401C0E LEA EDI,[ESP+84]
0167:00401C15 OR ECX,BYTE -01
0167:00401C18 REPNE SCASB
0167:00401C1A NOT ECX
0167:00401C1C DEC ECX
0167:00401C1D JZ NEAR 00401E24
0167:00401C23 LEA EDI,[ESP+20]
0167:00401C27 OR ECX,BYTE -01
0167:00401C2A XOR ESI,ESI
0167:00401C2C REPNE SCASB
0167:00401C2E NOT ECX
0167:00401C30 DEC ECX
0167:00401C31 JZ 00401CAC
重点是下文
0167:00401C33 MOVSX EDI,BYTE [ESP+ESI+20] 取用户名中的一个字节,
0167:00401C38 MOV EAX,EDI 做为被除数
0167:00401C3A MOV ECX,0A 除数
0167:00401C3F CDQ
0167:00401C40 IDIV ECX
0167:00401C42 MOV ECX,EDX 余数传给ECX。
0167:00401C44 AND EDX,80000001 进行与运算,
0167:00401C4A JNS 00401C51 不为负就跳。
0167:00401C4C DEC EDX
0167:00401C4D OR EDX,BYTE -02
0167:00401C50 INC EDX
0167:00401C51 JNZ 00401C69 不为零就跳
0167:00401C53 MOV EAX,EDI 否则重新赋值再次进行计算。
0167:00401C55 MOV ECX,1A 此次除数被换成1A。
0167:00401C5A CDQ
0167:00401C5B IDIV ECX
0167:00401C5D ADD DL,41 余数与DL相加得出注册码
0167:00401C60 MOV [ESP+ESI+0148], DL把注册码存入[ESP+ESI+0148]中。
0167:00401C67 JMP SHORT 00401C97
0167:00401C69 MOV EAX,ECX 把余数传给EAX
0167:00401C6B MOV EBX,03
0167:00401C70 CDQ
0167:00401C71 IDIV EBX
0167:00401C73 TEST EDX,EDX
0167:00401C75 JNZ 00401C8D 不为零就跳,用上面的结果ECX+31得出注册码。
0167:00401C77 MOV EAX,EDI 如果为零重新赋值计算。
0167:00401C79 MOV ECX,1A 除数
0167:00401C7E CDQ
0167:00401C7F IDIV ECX
0167:00401C81 ADD DL,61 余数DL与61相加得出注册码
0167:00401C84 MOV [ESP+ESI+0148],DL
0167:00401C8B JMP SHORT 00401C97
0167:00401C8D ADD CL,31 得出注册码
0167:00401C90 MOV [ESP+ESI+0148],CL
0167:00401C97 LEA EDI,[ESP+20] 你所输入的用户名串地址。
0167:00401C9B OR ECX,BYTE -01
0167:00401C9E XOR EAX,EAX
0167:00401CA0 INC ESI
0167:00401CA1 REPNE SCASB
0167:00401CA3 NOT ECX
0167:00401CA5 DEC ECX
0167:00401CA6 CMP ESI,ECX ESI 是循环的次数。 ECX是用户名的总的位数,
0167:00401CA8 JC 00401C33 有进位(也就是没有循环完毕)就跳进行下一轮计算。
0167:00401CAA XOR EBX,EBX
0167:00401CAC PUSH EBP
0167:00401CAD LEA ECX,[ESP+EC]
0167:00401CB4 MOV [ESP+ESI+014C],BL
0167:00401CBB CALL 00401EB0
0167:00401CC0 MOV [ESP+01B4],EBX
0167:00401CC7 LEA ESI,[ESP+84] 假码。
0167:00401CCE LEA EAX,[ESP+0148] 真码
至此就可以结束了,下文是进行比较。
0167:00401CD5 MOV DL,[EAX]
0167:00401CD7 MOV CL,DL
0167:00401CD9 CMP DL,[ESI]
0167:00401CDB JNZ 00401CF9
0167:00401CDD CMP CL,BL
0167:00401CDF JZ 00401CF5
0167:00401CE1 MOV DL,[EAX+01]
0167:00401CE4 MOV CL,DL
0167:00401CE6 CMP DL,[ESI+01]
0167:00401CE9 JNZ 00401CF9
0167:00401CEB ADD EAX,BYTE +02
0167:00401CEE ADD ESI,BYTE +02
0167:00401CF1 CMP CL,BL
0167:00401CF3 JNZ 00401CD5
0167:00401CF5 XOR EAX,EAX
0167:00401CF7 JMP SHORT 00401CFE
0167:00401CF9 SBB EAX,EAX
0167:00401CFB SBB EAX,BYTE -01
总结:用户名有几位,注册码就有几位。举例。
用户名:66666
密码:88888
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)