大神的链接:https://www.52pojie.cn/thread-613691-1-1.html
太难了….搞不定…..看了答案都搞不定…..注册机写不出来…..
一、爆破
找到关键函数和关键跳转即可爆破,简单略
二、破解算法
1、进入点击注册键的程序入口点,进入关键函数
进入0x442FB9处的关键函数,查看算法
004429A8 /$ 55 push ebp
004429A9 |. 8BEC mov ebp,esp
004429AB |. 83C4 F4 add esp,-0xC
004429AE |. 53 push ebx
004429AF |. 56 push esi
004429B0 |. 57 push edi
004429B1 |. 894D F8 mov [local.2],ecx ; [local.2] = 用户名
004429B4 |. 8955 FC mov [local.1],edx ; edx = [local.1]
004429B7 |. 8BF8 mov edi,eax ; edi = eax = 182a
004429B9 |. 8B45 F8 mov eax,[local.2]
004429BC |. E8 2712FCFF call aLoNg3x_.00403BE8
004429C1 |. 33C0 xor eax,eax
004429C3 |. 55 push ebp
004429C4 |. 68 7A2A4400 push aLoNg3x_.00442A7A
004429C9 |. 64:FF30 push dword ptr fs:[eax]
004429CC |. 64:8920 mov dword ptr fs:[eax],esp
004429CF |. 8B45 F8 mov eax,[local.2]
004429D2 |. E8 5D10FCFF call aLoNg3x_.00403A34
004429D7 |. 83F8 04 cmp eax,0x4
004429DA |. 0F8E 82000000 jle aLoNg3x_.00442A62
004429E0 |. 33DB xor ebx,ebx ; ebx清零
004429E2 |. 8B45 F8 mov eax,[local.2]
004429E5 |. E8 4A10FCFF call aLoNg3x_.00403A34
004429EA |. 85C0 test eax,eax
004429EC |. 7E 38 jle short aLoNg3x_.00442A26
004429EE |. 8945 F4 mov [local.3],eax ; [local.3] = 长度
004429F1 |. BE 01000000 mov esi,0x1 ; esi = 1
004429F6 |> 8B45 F8 /mov eax,[local.2] ; eax = 用户名
004429F9 |. E8 3610FCFF |call aLoNg3x_.00403A34
004429FE |. 83F8 01 |cmp eax,0x1 ; eax = 长度
00442A01 |. 7C 1D |jl short aLoNg3x_.00442A20
00442A03 |> 8B55 F8 |/mov edx,[local.2] ; edx = 用户名
00442A06 |. 0FB65432 FF ||movzx edx,byte ptr ds:[edx+esi-0x1] ; 取第一个字母“5”
00442A0B |. 8B4D F8 ||mov ecx,[local.2]
00442A0E |. 0FB64C01 FF ||movzx ecx,byte ptr ds:[ecx+eax-0x1] ; 取最后一个字母“n"
00442A13 |. 0FAFD1 ||imul edx,ecx ; edx * ecx = 16c6
00442A16 |. 0FAFD7 ||imul edx,edi ; edx = edx * edi
00442A19 |. 03DA ||add ebx,edx ; ebx = 0
00442A1B |. 48 ||dec eax ; 长度-1
00442A1C |. 85C0 ||test eax,eax
00442A1E |.^ 75 E3 |\jnz short aLoNg3x_.00442A03
00442A20 |> 46 |inc esi ; esi + 1
00442A21 |. FF4D F4 |dec [local.3] ; 长度-1
00442A24 |.^ 75 D0 \jnz short aLoNg3x_.004429F6
00442A26 |> 8BC3 mov eax,ebx ; eax = 0
00442A28 |. 99 cdq
00442A29 |. 33C2 xor eax,edx
00442A2B |. 2BC2 sub eax,edx ; eax = 0
00442A2D |. B9 2A2C0A00 mov ecx,0xA2C2A ; ecx = 0xA2CAA
00442A32 |. 99 cdq
00442A33 |. F7F9 idiv ecx ; eax/ecx = eax ...edx
00442A35 |. 8BDA mov ebx,edx
00442A37 |. 8B45 FC mov eax,[local.1] ; 算法
00442A3A |. B9 59000000 mov ecx,0x59
00442A3F |. 99 cdq
00442A40 |. F7F9 idiv ecx ; [local.1]/59取整
00442A42 |. 8BC8 mov ecx,eax
00442A44 |. 8B45 FC mov eax,[local.1]
00442A47 |. BE 50000000 mov esi,0x50
00442A4C |. 99 cdq
00442A4D |. F7FE idiv esi ; [local.1]/50取余
00442A4F |. 03CA add ecx,edx ; 加上刚[local.1]/59取整的结果
00442A51 |. 41 inc ecx ; +1= A4
00442A52 |. 894D FC mov [local.1],ecx
00442A55 |. 3B5D FC cmp ebx,[local.1] ; 结果与ebx作比较
00442A58 |. 75 04 jnz short aLoNg3x_.00442A5E ; 关键跳转
00442A5A |. B3 01 mov bl,0x1
00442A5C |. EB 06 jmp short aLoNg3x_.00442A64
00442A5E |> 33DB xor ebx,ebx
00442A60 |. EB 02 jmp short aLoNg3x_.00442A64
发现程序是,对用户名进行一定的运算后,与[local.1]/0x59取整 + [local.1]/0x50取余 + 1的结果进行比较,如果相同则隐藏按钮,否则不隐藏。
但是算法写不出来…..巨麻烦……日后再写吧…..
2、先直接爆破,将0x442a58处代码nop掉,运行,则成功隐藏register按钮,同时出现again按钮,保存文件。
对again按钮点击事件下断,发现关键函数和register按钮的关键函数相同,那就不用对他研究了。
3、仔细研究register关键函数的代码发现,最后算法实现时发现
(edi 老是为0,导致后面的eax老是为0,然后后面整个算法都不懂了,看了大神写的才发现自己太急躁啦,就不能耐心点好好追溯吗??)
而edi是由eax赋值而来:
而eax是在函数外被ds:[0x445838]赋值:
找ds:[0x445838]的来源,发现上次被赋值竟然是在输入注册码不正确时,被跳过了!所以……..考虑是不是得输入错误一次注册码(太难想了吧!!膜拜大神!!服气服气!!)
经过测试果然如此,先输入错误一次注册码(不是全数字即可),程序进入
4、那么,对于0x442F86处 mov ds:[0x445838],eax 中的eax是多少呢?所以进入0x442F81函数查看
python实现这个算法:
# -*- coding:utf-8 -*-
# 1、根据注册码(字符串)计算eax的值
string = raw_input("请输入注册码:")# 例如:abc123
i = 1
sum = 891 # 0x37B
while i < len(string):
a = ord(string[i]) % 17 + 1
b = ord(string[i-1]) * a
sum = sum + b
#print sum
i += 1
print sum # 6186=0x182a
然后运行,输入正确形式的注册码,则再次断在register入口处,但是这次跳过了非正确输入的代码段,进入关键函数,但是太复杂,搞不懂…..
python实现一点点:
name = raw_input("请输入用户名:")
i = 0
temp = 0
while i < len(name):
j = len(name) - 1
while j >= 0:
temp = temp + ord(name[i]) * ord(name[j]) * sum
j -= 1
#print temp
i += 1
print temp