学破解论坛

 ★找回密码★
 ★立即注册★

QQ登录

只需一步,快速开始

查看: 1689|回复: 61

[原创破解图文] GiliSoftVideoEditorcn 注册算法分析

  [复制链接] |关注本帖

  离线 

签到天数: 2

该用户今日未签到

马上注册,深入学习!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
[软件名称]  :  GiliSoftVideo Editor 7.4.0
[编译类型]  :  Delphi
[是否有壳]  :  无壳
[注册类型]  :  注册码注册
[作者信息]  :  LYQingYe
[FBI Warning]  :    学到东西的别忘记评分!

@Shark恒  这回我解释了关键CALL找法.

PS:再此之前已经 @Bu弃 发过爆破教程了.我再次补一补算法分析.爆破帖地址


关键CALL找法分析 , 先bp MessageBoxA
2.png

//回溯返回到
3.png

//往上翻到子程序头就是关键CALL -> Sub_004AC8CC  

//第一部分-参数校验
[Asm] 纯文本查看 复制代码
004AC8CC  />push ebp
004AC8CD  |>mov ebp,esp
004AC8CF  |>mov ecx,0x11
004AC8D4  |>/push 0x0
004AC8D6  |>|push 0x0
004AC8D8  |>|dec ecx                                 ;  ntdll.7C93005D
004AC8D9  |>\jnz short videoedi.004AC8D4
004AC8DB  |>push ecx                                 ;  ntdll.7C93005D
004AC8DC  |>push ebx
004AC8DD  |>push esi                                 ;  videoedi.004BD70C
004AC8DE  |>mov ebx,eax
004AC8E0  |>mov esi,dword ptr ds:[0x4B97B8]          ;  videoedi.004BD70C
004AC8E6  |>xor eax,eax
004AC8E8  |>push ebp
004AC8E9  |>push videoedi.004ACF56
004AC8EE  |>push dword ptr fs:[eax]
004AC8F1  |>mov dword ptr fs:[eax],esp
004AC8F4  |>lea edx,[local.6]
004AC8F7  |>mov eax,dword ptr ds:[ebx+0x374]
004AC8FD  |>call videoedi.00449AB4                   ;  GetEmailAddress获取输入输入的Email 地址
004AC902  |>mov eax,[local.6]                        ;  Eax-> Email
004AC905  |>lea edx,[local.2]                        ;  Edx - >NewBuffer
004AC908  |>call videoedi.00409160                          ;  Trim(const S: string): string; overload; 从给定字串中去除首尾空格和控制符
004AC90D  |>cmp [local.2],0x0                                  ;  判断是新字符串地址是否合法,若非法则提示NoName
004AC911  |>jnz short videoedi.004AC963              ;  Check New Str Point Invalid
004AC913  |>push 0x40
004AC915  |>lea edx,[local.7]
004AC918  |>mov eax,dword ptr ds:[0x4B9638]          ;  凑K
004AC91D  |>mov eax,dword ptr ds:[eax]
004AC91F  |>call videoedi.00466464
004AC924  |>mov eax,[local.7]
004AC927  |>call videoedi.00404E70
004AC92C  |>push eax
004AC92D  |>lea eax,[local.8]
004AC930  |>push eax
004AC931  |>mov eax,dword ptr ds:[0x4B93C0]
004AC936  |>mov eax,dword ptr ds:[eax]
004AC938  |>mov ecx,videoedi.004ACF6C                ;  strNoName
004AC93D  |>mov edx,dword ptr ds:[ebx+0x3C4]
004AC943  |>call videoedi.004A52F4
004AC948  |>mov eax,[local.8]
004AC94B  |>call videoedi.00404E70
004AC950  |>push eax
004AC951  |>mov eax,ebx
004AC953  |>call videoedi.004515EC
004AC958  |>push eax                                 ; |hOwner = 00000001
004AC959  |>call <jmp.&user32.MessageBoxA>           ; \MessageBoxA
004AC95E  |>jmp videoedi.004ACF01
004AC963  |>cmp dword ptr ds:[esi],0x4
004AC966  |>je short videoedi.004AC9C4
004AC968  |>mov eax,[local.2]                        ;  EAX ->Email
004AC96B  |>call videoedi.004A4D10
004AC970  |>test eax,eax                                
004AC972  |>jnz short videoedi.004AC9C4                  ;若输入的Email非法则提示strErrorEmail
004AC974  |>push 0x40
004AC976  |>lea edx,[local.9]
004AC979  |>mov eax,dword ptr ds:[0x4B9638]          ;  凑K
004AC97E  |>mov eax,dword ptr ds:[eax]
004AC980  |>call videoedi.00466464
004AC985  |>mov eax,[local.9]
004AC988  |>call videoedi.00404E70
004AC98D  |>push eax
004AC98E  |>lea eax,[local.10]
004AC991  |>push eax
004AC992  |>mov eax,dword ptr ds:[0x4B93C0]
004AC997  |>mov eax,dword ptr ds:[eax]
004AC999  |>mov ecx,videoedi.004ACF80                ;  strErrorEmail
004AC99E  |>mov edx,dword ptr ds:[ebx+0x3C4]
004AC9A4  |>call videoedi.004A52F4
004AC9A9  |>mov eax,[local.10]
004AC9AC  |>call videoedi.00404E70
004AC9B1  |>push eax
004AC9B2  |>mov eax,ebx
004AC9B4  |>call videoedi.004515EC
004AC9B9  |>push eax                                 ; |hOwner = 00000001
004AC9BA  |>call <jmp.&user32.MessageBoxA>           ; \MessageBoxA
004AC9BF  |>jmp videoedi.004ACF01
004AC9C4  |>lea edx,[local.11]
004AC9C7  |>mov eax,dword ptr ds:[ebx+0x370]
004AC9CD  |>call videoedi.00449AB4                   ;  GetKey , 获取我们输入的Key
004AC9D2  |>mov eax,[local.11]                       ;  Eax ->Key
004AC9D5  |>lea edx,[local.1]                        ;  Edx ->NewBuffer
004AC9D8  |>call videoedi.00409160                          ; Trim(const S: string): string; overload; 从给定字串中去除首尾空格和控制符。        
004AC9DD  |>cmp [local.1],0x0                        ;  Check New Str Key Point Invalid
004AC9E1  |>jnz short videoedi.004ACA33                  ;  若 指针非法则提示 ‘strNoKey’
004AC9E3  |>push 0x40
004AC9E5  |>lea edx,[local.12]
004AC9E8  |>mov eax,dword ptr ds:[0x4B9638]          ;  凑K
004AC9ED  |>mov eax,dword ptr ds:[eax]
004AC9EF  |>call videoedi.00466464
004AC9F4  |>mov eax,[local.12]
004AC9F7  |>call videoedi.00404E70
004AC9FC  |>push eax
004AC9FD  |>lea eax,[local.13]
004ACA00  |>push eax
004ACA01  |>mov eax,dword ptr ds:[0x4B93C0]
004ACA06  |>mov eax,dword ptr ds:[eax]
004ACA08  |>mov ecx,videoedi.004ACF98                ;  strNoKey
004ACA0D  |>mov edx,dword ptr ds:[ebx+0x3C4]
004ACA13  |>call videoedi.004A52F4
004ACA18  |>mov eax,[local.13]
004ACA1B  |>call videoedi.00404E70
004ACA20  |>push eax
004ACA21  |>mov eax,ebx
004ACA23  |>call videoedi.004515EC
004ACA28  |>push eax                                 ; |hOwner = 00000001
004ACA29  |>call <jmp.&user32.MessageBoxA>           ; \MessageBoxA
004ACA2E  |>jmp videoedi.004ACF01
004ACA33  |>cmp dword ptr ds:[esi],0x4
004ACA36  |>jnz short videoedi.004ACA45
004ACA38  |>lea eax,[local.1]
004ACA3B  |>mov edx,videoedi.004ACFAC                ;  -11111
004ACA40  |>call videoedi.00404C78
004ACA45  |>mov eax,[local.1]                        ;  Eax - >Key
004ACA48  |>test eax,eax
004ACA4A  |>je short videoedi.004ACA51               ;  判断指针是否合法
004ACA4C  |>sub eax,0x4                              ;  Eax = Eax - 4 -> KeyLength 
004ACA4F  |>mov eax,dword ptr ds:[eax]               ;  Eax = KeyLength ,获取Key的长度
004ACA51  |>cmp eax,0x23                             ;  Check Key length == 0X23 (35)
004ACA54  |>je short videoedi.004ACAA6               ;  Key的长度要为 35 ,否则失败


//参数校验相对简单,对输入的 Email 和 Key 用Sysutils::Trim(const S: string)函数处理 ->去除首尾空格和控制符.然后判断输入的Email和Key是否为空,若为空则失败,最后对Key的长度做了校验,要求Key长度为0x23 -> 35

//下面看第二层校验, 测试用的Email 为 xuepojie@lyqingye.com ,Key 为01234567890123456789012345678912345

[Asm] 纯文本查看 复制代码
004ACAA6  |>lea eax,[local.4]
004ACAA9  |>push eax
004ACAAA  |>mov ecx,0x5                              ;  ECX = 0X5
004ACAAF  |>mov edx,0xD                              ;  EDX = 0XD
004ACAB4  |>mov eax,[local.1]                        ;  EAX ->Key
004ACAB7  |>call videoedi.00404ED0                          ; 分割字符串->从 EDX的位置 , 分割ecx大小的字符串
004ACABC  |>xor edx,edx
004ACABE  |>mov eax,[local.4]                                  : 上面分割的字符串是key的13~17位
004ACAC1  |>call videoedi.00409444                   ;  CharToHex,将字符串转换为整数
004ACAC6  |>cmp eax,dword ptr ds:[ebx+0x3C8]          ; 和一个常量比较, 0x555B,一定要相等,否则失败
004ACACC  |>je videoedi.004ACB77
004ACAD2  |>lea eax,[local.16]
004ACAD5  |>push eax
004ACAD6  |>mov eax,dword ptr ds:[0x4B93C0]
004ACADB  |>mov eax,dword ptr ds:[eax]
004ACADD  |>mov ecx,videoedi.004ACFD8                ;  strRegFailed
004ACAE2  |>mov edx,dword ptr ds:[ebx+0x3C4]
004ACAE8  |>call videoedi.004A52F4
004ACAED  |>push [local.16]
004ACAF0  |>push videoedi.004ACFF0                   ;  \n
004ACAF5  |>lea eax,[local.17]
004ACAF8  |>push eax
004ACAF9  |>mov eax,dword ptr ds:[0x4B93C0]
004ACAFE  |>mov eax,dword ptr ds:[eax]
004ACB00  |>mov ecx,videoedi.004ACFFC                ;  strRegFailedReason1
004ACB05  |>mov edx,dword ptr ds:[ebx+0x3C4]
004ACB0B  |>call videoedi.004A52F4
004ACB10  |>push [local.17]
004ACB13  |>push videoedi.004ACFF0                   ;  \n
004ACB18  |>lea eax,[local.18]
004ACB1B  |>push eax
004ACB1C  |>mov eax,dword ptr ds:[0x4B93C0]
004ACB21  |>mov eax,dword ptr ds:[eax]
004ACB23  |>mov ecx,videoedi.004AD018                ;  CompanyHomePage
004ACB28  |>mov edx,videoedi.004AD030                ;  Product
004ACB2D  |>call videoedi.004A52F4
004ACB32  |>push [local.18]
004ACB35  |>lea eax,[local.3]
004ACB38  |>mov edx,0x5
004ACB3D  |>call videoedi.00404D30
004ACB42  |>push 0x30
004ACB44  |>lea edx,[local.19]
004ACB47  |>mov eax,dword ptr ds:[0x4B9638]          ;  凑K
004ACB4C  |>mov eax,dword ptr ds:[eax]
004ACB4E  |>call videoedi.00466464
004ACB53  |>mov eax,[local.19]
004ACB56  |>call videoedi.00404E70
004ACB5B  |>push eax
004ACB5C  |>mov eax,[local.3]
004ACB5F  |>call videoedi.00404E70
004ACB64  |>push eax
004ACB65  |>mov eax,ebx
004ACB67  |>call videoedi.004515EC
004ACB6C  |>push eax                                 ; |hOwner = 00000001
004ACB6D  |>call <jmp.&user32.MessageBoxA>           ; \MessageBoxA
004ACB72  |>jmp videoedi.004ACF01
004ACB77  |>cmp dword ptr ds:[esi],0x4
004ACB7A  |>je videoedi.004ACCF8
004ACB80  |>mov eax,[local.1]
004ACB83  |>call videoedi.00404E70
004ACB88  |>push eax
004ACB89  |>mov eax,dword ptr ds:[esi]
004ACB8B  |>push eax                                          : EAX -> KEY 
004ACB8C  |>call <jmp.&MagicSkin.MS_CheckSN>         ; 最后一个验证在DLL里面

//这个校验调用了这个函数 call videoedi.00404ED0 ,作用是 : 从字符串的某一个位置开始分割字符串,分割制定大小的字符串.

004ACAAA |>mov ecx,0x5                              ;  ECX = 0X5
004ACAAF  |>mov edx,0xD                              ;  EDX = 0XD
004ACAB4  |>mov eax,[local.1]                        ;  EAX ->Key
004ACAB7  |>call videoedi.00404ED0  

//所以在这,首先获取了Key 的13~17位,调用CharToHex (atoi),将字符串转换为整数数据 , 随即与常量0x555B 比较,一定要相等,否则失败. 0x555b -> 21851 所以13~17位只能为21851 .否则失败 .我认为这个常量应该是编译版本吧!


//且看DLL验证部分004A8FD4  jmp dword ptrds:[<&MagicSkin.MS_CheckSN>; magicski.MS_CheckSN]

[Asm] 纯文本查看 复制代码
10001760 >push ebp
10001761  mov ebp,esp
10001763  sub esp,0x84
10001769  call magicski.1000476D
1000176E  push eax
1000176F  lea ecx,dword ptr ss:[ebp-0x14]
10001772  call <jmp.&MFC42.#6467>
10001777  mov eax,dword ptr ss:[ebp+0xC]           ; videoedi.00484C4E
1000177A  push eax
1000177B  lea ecx,dword ptr ss:[ebp-0xC]
1000177E  call <jmp.&MFC42.#537>
10001783  lea ecx,dword ptr ss:[ebp-0xC]
10001786  call magicski.100041F0
1000178B  cmp eax,0x23
1000178E  jge short magicski.100017AF
10001790  mov dword ptr ss:[ebp-0x2C],0x0
10001797  lea ecx,dword ptr ss:[ebp-0xC]
1000179A  call <jmp.&MFC42.#800>
1000179F  lea ecx,dword ptr ss:[ebp-0x14]
100017A2  call magicski.10004340
100017A7  mov eax,dword ptr ss:[ebp-0x2C]
100017AA  jmp magicski.10001D16
100017AF  push magicski.10006044                   ; ASCII "MS_CheckSN"
100017B4  call dword ptr ds:[<&KERNEL32.OutputDebu>; kernel32.OutputDebugStringA
100017BA  push 0x5
100017BC  push 0x0                                        ; 拷贝Key的1~5位
100017BE  lea ecx,dword ptr ss:[ebp-0x30]
100017C1  push ecx                                 ; 
100017C2  lea ecx,dword ptr ss:[ebp-0xC]
100017C5  call <jmp.&MFC42.#4278>                  ; CString::Mid 拷贝字符串,根据拷贝位置和大小这里拷贝1~5位
100017CA  mov ecx,eax
100017CC  call magicski.10004230
100017D1  push eax
100017D2  call dword ptr ds:[<&MSVCRT.atoi>]       ; msvcrt.atoi ,将1~5位字符串转换为整数
100017D8  add esp,0x4
100017DB  mov dword ptr ss:[ebp-0x4],eax                ;存放到 ebp-0x4
100017DE  lea ecx,dword ptr ss:[ebp-0x30]
100017E1  call <jmp.&MFC42.#800>
100017E6  push 0x5                                        ;拷贝Key的 7~11位,因为有一位 是 ‘-’ 注册码分隔符
100017E8  push 0x6
100017EA  lea edx,dword ptr ss:[ebp-0x34]
100017ED  push edx
100017EE  lea ecx,dword ptr ss:[ebp-0xC]
100017F1  call <jmp.&MFC42.#4278>                        ; CString::Mid 拷贝字符串,根据拷贝位置和大小这里拷贝7~11位
100017F6  mov ecx,eax
100017F8  call magicski.10004230
100017FD  push eax
100017FE  call dword ptr ds:[<&MSVCRT.atoi>]       ; msvcrt.atoi 将7~11位 字符串转换为整数
10001804  add esp,0x4
10001807  mov dword ptr ss:[ebp-0x8],eax                ;存放到 ebp-0x8
1000180A  lea ecx,dword ptr ss:[ebp-0x34]
1000180D  call <jmp.&MFC42.#800>
10001812  push 0x5                                        
10001814  push 0xC                                        ;拷贝Key的13~17位
10001816  lea eax,dword ptr ss:[ebp-0x38]
10001819  push eax
1000181A  lea ecx,dword ptr ss:[ebp-0xC]
1000181D  call <jmp.&MFC42.#4278>                        ; CString::Mid 拷贝字符串根据拷贝位置和大小这里拷贝13~17位

10001822  mov ecx,eax
10001824  call magicski.10004230
10001829  push eax
1000182A  call dword ptr ds:[<&MSVCRT.atoi>]       ; msvcrt.atoi 将13~17字符串转换为整数
10001830  add esp,0x4
10001833  mov dword ptr ss:[ebp-0x1C],eax                ;存放到 ebp-0x1c
10001836  lea ecx,dword ptr ss:[ebp-0x38]
10001839  call <jmp.&MFC42.#800>
1000183E  push 0x5        
10001840  push 0x12                                        ;拷贝Key 19~23位
10001842  lea ecx,dword ptr ss:[ebp-0x3C]
10001845  push ecx                                 ; ntdll.7C93005D
10001846  lea ecx,dword ptr ss:[ebp-0xC]
10001849  call <jmp.&MFC42.#4278>                        ; CString::Mid 拷贝字符串根据拷贝位置和大小这里拷贝19~23位
1000184E  mov ecx,eax
10001850  call magicski.10004230
10001855  push eax
10001856  call dword ptr ds:[<&MSVCRT.atoi>]       ; msvcrt.atoi,将19~23位字符串转换为整数
1000185C  add esp,0x4
1000185F  mov dword ptr ss:[ebp-0x20],eax                 ;存放到ebp -0x20
10001862  lea ecx,dword ptr ss:[ebp-0x3C]
10001865  call <jmp.&MFC42.#800>
1000186A  push 0x5
1000186C  push 0x18                                        ; 拷贝Key 25~29位
1000186E  lea edx,dword ptr ss:[ebp-0x40]
10001871  push edx
10001872  lea ecx,dword ptr ss:[ebp-0xC]
10001875  call <jmp.&MFC42.#4278>                        ; CString::Mid 拷贝字符串根据拷贝位置和大小这里拷贝25~29位
1000187A  mov ecx,eax
1000187C  call magicski.10004230
10001881  push eax
10001882  call dword ptr ds:[<&MSVCRT.atoi>]       ; msvcrt.atoi,将25~29位转换为整数
10001888  add esp,0x4
1000188B  mov dword ptr ss:[ebp-0x18],eax                ;存放到 ebp-0x18位置
1000188E  lea ecx,dword ptr ss:[ebp-0x40]
10001891  call <jmp.&MFC42.#800>
10001896  push 0x5
10001898  push 0x1E                                           ;拷贝Key31~35位
1000189A  lea eax,dword ptr ss:[ebp-0x44]
1000189D  push eax
1000189E  lea ecx,dword ptr ss:[ebp-0xC]
100018A1  call <jmp.&MFC42.#4278>                        ; CString::Mid 拷贝字符串根据拷贝位置和大小这里拷贝31~35位
100018A6  mov ecx,eax
100018A8  call magicski.10004230
100018AD  push eax
100018AE  call dword ptr ds:[<&MSVCRT.atoi>]       ; msvcrt.atoi,将31~35位转换为整数
100018B4  add esp,0x4
100018B7  mov dword ptr ss:[ebp-0x24],eax                ;存放到 ebp-0x24
100018BA  lea ecx,dword ptr ss:[ebp-0x44]
100018BD  call <jmp.&MFC42.#800>

//上面为准备工作.
Key的格式应该是这样的 "12345-12345-21851-12345-12345-12345"
5个字符作为一部分,上面就是 依次取每一部分, 然后转换为整数,存放起来.以便下面的校验.
//接下来先检测输入的Key的版本是否过期,开始我觉得这是Key黑名单,但想想也不完全对,觉得更像是版本key,且看分析,我简化了代码

[Asm] 纯文本查看 复制代码
100018C8  cmp dword ptr ss:[ebp-0x1C],0x555C        ;比较13~17位是否为 “0x555C” ,现在版本key应为21851,所以不能等
100018CF  jnz short magicski.10001907
100018D1  lea ecx,dword ptr ss:[ebp-0xC]
100018D4  push ecx                                 ; ntdll.7C93005D
100018D5  push magicski.10006050                   ; ASCII "36705-37470-21852-34575-89053-34773"
100018DA  call magicski.10004240
1000190D  cmp dword ptr ss:[ebp-0x1C],0x554F        ;比较13~17位是否为 “0x554F” 应该是旧版本Key,不能等
1000191A  push magicski.10006074                   ; ASCII "79013-37470-21839-54075-56843-33173"
1000191F  call magicski.10004240
1000195B  cmp dword ptr ss:[ebp-0x1C],0x5545        ;比较13~17位是否为 “0x5545” 应该是旧版本Key,不能等
10001968  push magicski.10006098                   ; ASCII "54075-24075-21829-89053-33519-33173"
1000196D  call magicski.10004240
1000199E  jnz short magicski.100019DF
100019A0  cmp dword ptr ss:[ebp-0x1C],0x5545       ; ;比较13~17位是否为 “0x5545” 应该是旧版本Key,不能等
100019A7  jnz short magicski.100019DF
D
100019AD  push magicski.100060BC                   ; ASCII "61136-34215-21829-45496-12953-23173"
100019B2  call magicski.10004240
100019E5  cmp dword ptr ss:[ebp-0x1C],0x555A        ; ;比较13~17位是否为 “0x555A” 应该是旧版本Key,不能等
100019F2  push magicski.100060E0                   ; ASCII "91136-36575-21850-74501-56437-27093"
10001A2A  cmp dword ptr ss:[ebp-0x1C],0x5556        ;比较13~17位是否为 “0x5556” 应该是旧版本Key,不能等 
10001A37  push magicski.10006104                   ; ASCII "20537-36705-21846-37470-54277-97243"
10001A6F  cmp dword ptr ss:[ebp-0x1C],0x555E        ;//同上 依旧不能等
10001A7C  push magicski.10006128                   ; ASCII "86505-79013-21854-24075-89053-56843"
10001A81  call magicski.10004240
10001B02  cmp dword ptr ss:[ebp-0x1C],0x555B        ;到这就为我们的版本Key 21851
10001B09  jnz short magicski.10001B41
10001B0B  lea eax,dword ptr ss:[ebp-0xC]
10001B0E  push eax
10001B0F  push magicski.10006170                   ; ASCII "20931-34575-21851-01466-79950-27093"
//7~13位 我认为应该是版本Key,如有错误请指正。
//最终验证 部分

10001CA3  mov eax,dword ptr ss:[ebp+0x8]
10001CA6  push eax                  ;DLL验证CALL传入的参数
10001CA7  call magicski.100040AC                   ; 从表挑选一个常量

//之所以说13~17位是版本key,是因为这个DLL验证CALL会传入一个参数, call magicski.100040AC    这个CALL就用到了这个参数,参数为 表中的索引, 传入的 为0 ,我猜 代表最新版本 .看下这个表

100040C8 mov dword ptr ss:[ebp-0x4],0xC3BC
100040D1  mov dword ptr ss:[ebp-0x4],0xC7A4
100040DA  mov dword ptr ss:[ebp-0x4],0xCB8C
100040E3  mov dword ptr ss:[ebp-0x4],0xCF74
100040EC  mov dword ptr ss:[ebp-0x4],0x138EC
100040F5  mov dword ptr ss:[ebp-0x4],0xD35C
100040FE  mov dword ptr ss:[ebp-0x4],0xD744
10004107  mov dword ptr ss:[ebp-0x4],0xDB2C
10004110  mov dword ptr ss:[ebp-0x4],0xDF14
10004119  mov dword ptr ss:[ebp-0x4],0xC3BC

//因为索引为0 ,所以获得常量 “0xC3BC” 我们将它命名为 local,这个常量值校验的时候用到
[Asm] 纯文本查看 复制代码
10001CA7  call magicski.100040AC                   ; 从表挑选一个常量[/align]
10001CAC  add esp,0x4
10001CAF  mov dword ptr ss:[ebp-0x28],eax                ;常量给 ebp-0x28
10001CB2  mov eax,dword ptr ss:[ebp-0x8]                ;EAX ->Key 7~11位的整数值,
10001CB5  add eax,dword ptr ss:[ebp-0x28]                ; 7~11位 + local
10001CB8  xor edx,edx
10001CBA  mov ecx,0x1869F                                ; Ecx = 0x1869f (99999)
10001CBF  div ecx                                  ; 余数 = (7~11 + local) % 0x1869f
10001CC1  cmp dword ptr ss:[ebp-0x20],edx                ;将key 19~23位 与 余数比较,一定要相等,否则失败
10001CC4  jnz short magicski.10001CDA
10001CC6  mov eax,dword ptr ss:[ebp-0x4]                ; eax  -> Key 1~5位 
10001CC9  add eax,dword ptr ss:[ebp-0x28]                ; 1~5 + local
10001CCC  xor edx,edx        
10001CCE  mov ecx,0x1869F                                ; ECX = 0X1869F
10001CD3  div ecx                                  ; 余数 = (1~5 + local) % 0x1869f
10001CD5  cmp dword ptr ss:[ebp-0x18],edx                ;将key 25~29位与余数比较,一定要相等,否则失败
10001CD8  je short magicski.10001CF6


//上面的校验也很简单,首先根据版本 (猜测)->从 表中 获取一个常量值local
然后,取key 7~11位 和 key 1~5位做运算,最后拿key19~23位和 25~29位做校验,一定要相等,在这 我们就得到了 19~23的和25~29的来源
(7~11+ local) % 0x1869f = 19~23
(1~5+ local) % 0x1869f = 25~29

//知道了,校验过程,下面来手动算码.
初始化假码格式 应该为这样, 78888-67890-12345-12345-12345-12345。
78888和 67890 是随便写的,因为(1~5 + local) 要取 99999(0x1869f)的余数,所以数字得大一点
根据第一次校验 13~17位应该为 常量 “21851”,所以注册码变为
78888-67890-21851-12345-12345-12345
根据DLL校验部分
(7~11+ local) % 0x1869f = 19~23
(1~5+ local) % 0x1869f = 25~29
//得到
(0x10932+ 0xc3bc) % 0x1869f = 0x464F (17999)
(7~11bit+ local) % 0x1869F = 19~23bit (17999)

(0x13428+ 0xc3bc) % 0x1869f = 0x7145 (28997)
(1~5bit  + local) % 0x1869f = 25~29bit (28997)

//所以最终的注册码应该是78888-67890-21851-17999-28997-12345
我们注册下测试

QQ截图20160804181719.png

评分

参与人数 25威望 +1 HB +71 THX +17 收起 理由
zhy1994 + 1 评分=感恩!简单却充满爱!感谢您的作品!
pinsy + 1 吃水不忘打井人,给个评分懂感恩!
yllgq + 1 分享精神,是最值得尊敬的!
爱阴湿毯 + 1 + 1 眼睛疼 咋整?
学一学丶 + 1 + 1 分享精神,是最值得尊敬的!
DiskGenius + 1 吃水不忘打井人,给个评分懂感恩!
lable + 3 + 1 评分=感恩!简单却充满爱!感谢您的作品!
没没没没没 + 1 吃水不忘打井人,给个评分懂感恩!
hyeh612 + 1 + 1 吃水不忘打井人,给个评分懂感恩!
tianzhiya + 1 吃水不忘打井人,给个评分懂感恩!
hemingjun + 1 吃水不忘打井人,给个评分懂感恩!
cqr2287 + 1 终于有分析算法的了
victor520 + 5 + 1 分享精神,是最值得尊敬的!
小时候可帅 + 1 + 1 分享精神,是最值得尊敬的!
菜鸟中的菜鸟 + 6 + 1 待我学成之日,必是高手之时。
zlyqwe456 + 1 + 1 分享精神,是最值得尊敬的!
蓝色贝雷帽 + 1 + 1 吃水不忘打井人,给个评分懂感恩!
泪落尘埃 + 1 + 1 吃水不忘打井人,给个评分懂感恩!
液絡朦涳 + 1 + 1 吃水不忘打井人,给个评分懂感恩!
rgbwcwmd + 2 + 1 吃水不忘打井人,给个评分懂感恩!
笔尖下的日子 + 1 + 1 分享精神,是最值得尊敬的!
yanshifei888 + 1 + 1 分享精神,是最值得尊敬的!
wswwj + 2 + 1 吃水不忘打井人,给个评分懂感恩!
Bu弃 + 5 + 1 表哥真6 ,搞得我也重新下载了下,玩玩算法
Shark恒 + 1 + 30 + 1 评分=感恩!简单却充满爱!感谢您的作品!

还有更多人参与评分,点击查看全部!

学破解论坛关注PC软件安全与移动软件安全领域。学习破解方法,使软件开发者能够更好的弥补软件缺陷,修复软件漏洞,提升软件安全,将损失降为最低。大量的软件加密解密教程,使软件开发者与代码逆向分析爱好者受益颇多,因此被连连称赞。保护开发者的利益与版权是我们持之以恒的动力!学破解论坛将竭尽全力为软件安全领域献出微薄之力!

  离线 

签到天数: 19

今日第278个签到

我认为算法分析要比爆破更好玩,更有意思。但是需要大量的时间去跟踪分析。。

评分

参与人数 3HB +3 收起 理由
爱阴湿毯 + 1 本站任何内容出于学习研究的目的,禁止用于任何非法途径,否则一切后果请用户自负!
职业伸手Dan_i + 1 被选中“最佳答案”荣耀+1,感谢你的热心解答!同时也感谢其他热心人!
cqr2287 + 1 前排

还有更多人参与评分,点击查看全部!

学破解论坛关注PC软件安全与移动软件安全领域。学习破解方法,使软件开发者能够更好的弥补软件缺陷,修复软件漏洞,提升软件安全,将损失降为最低。大量的软件加密解密教程,使软件开发者与代码逆向分析爱好者受益颇多,因此被连连称赞。保护开发者的利益与版权是我们持之以恒的动力!学破解论坛将竭尽全力为软件安全领域献出微薄之力!
回复

使用道具 举报

  离线 

签到天数: 3

该用户今日未签到

沙发

点评

你这是伪沙发。。。我的才是真沙发  详情 回复 发表于 2016-8-4 20:08
学破解论坛关注PC软件安全与移动软件安全领域。学习破解方法,使软件开发者能够更好的弥补软件缺陷,修复软件漏洞,提升软件安全,将损失降为最低。大量的软件加密解密教程,使软件开发者与代码逆向分析爱好者受益颇多,因此被连连称赞。保护开发者的利益与版权是我们持之以恒的动力!学破解论坛将竭尽全力为软件安全领域献出微薄之力!
回复

使用道具 举报

  离线 

签到天数: 19

今日第278个签到


你这是伪沙发。。。我的才是真沙发
学破解论坛关注PC软件安全与移动软件安全领域。学习破解方法,使软件开发者能够更好的弥补软件缺陷,修复软件漏洞,提升软件安全,将损失降为最低。大量的软件加密解密教程,使软件开发者与代码逆向分析爱好者受益颇多,因此被连连称赞。保护开发者的利益与版权是我们持之以恒的动力!学破解论坛将竭尽全力为软件安全领域献出微薄之力!
回复

使用道具 举报

  离线 

签到天数: 3

该用户今日未签到

膜拜表哥,这个算法我都没去看的。有时间一定要玩玩。看看能不能写个注册机出来。
学破解论坛关注PC软件安全与移动软件安全领域。学习破解方法,使软件开发者能够更好的弥补软件缺陷,修复软件漏洞,提升软件安全,将损失降为最低。大量的软件加密解密教程,使软件开发者与代码逆向分析爱好者受益颇多,因此被连连称赞。保护开发者的利益与版权是我们持之以恒的动力!学破解论坛将竭尽全力为软件安全领域献出微薄之力!
回复

使用道具 举报

  离线 

签到天数: 3

该用户今日未签到

Shark恒 发表于 2016-8-4 20:08
你这是伪沙发。。。我的才是真沙发

一定是网络的原因。我进来的时候,没人回复,所以就认为自己是沙发。没想到,还是慢了恒大一步。这种帖子,就得加精啊。恒大

点评

我靠,你不说我没注意,我还以为加入精华了,原来没有。。  详情 回复 发表于 2016-8-4 20:11
学破解论坛关注PC软件安全与移动软件安全领域。学习破解方法,使软件开发者能够更好的弥补软件缺陷,修复软件漏洞,提升软件安全,将损失降为最低。大量的软件加密解密教程,使软件开发者与代码逆向分析爱好者受益颇多,因此被连连称赞。保护开发者的利益与版权是我们持之以恒的动力!学破解论坛将竭尽全力为软件安全领域献出微薄之力!
回复

使用道具 举报

  离线 

签到天数: 19

今日第278个签到

Bu弃 发表于 2016-8-4 20:09
一定是网络的原因。我进来的时候,没人回复,所以就认为自己是沙发。没想到,还是慢了恒大一步。这种帖子 ...

我靠,你不说我没注意,我还以为加入精华了,原来没有。。
学破解论坛关注PC软件安全与移动软件安全领域。学习破解方法,使软件开发者能够更好的弥补软件缺陷,修复软件漏洞,提升软件安全,将损失降为最低。大量的软件加密解密教程,使软件开发者与代码逆向分析爱好者受益颇多,因此被连连称赞。保护开发者的利益与版权是我们持之以恒的动力!学破解论坛将竭尽全力为软件安全领域献出微薄之力!
回复

使用道具 举报

  离线 

签到天数: 3

该用户今日未签到

发表于 2016-8-4 20:13 |取消关注该作者的回复
本帖最后由 Bu弃 于 2016-8-4 21:20 编辑
Shark恒 发表于 2016-8-4 20:11
我靠,你不说我没注意,我还以为加入精华了,原来没有。。

   恒大我知道错了。感谢放过一次
学破解论坛关注PC软件安全与移动软件安全领域。学习破解方法,使软件开发者能够更好的弥补软件缺陷,修复软件漏洞,提升软件安全,将损失降为最低。大量的软件加密解密教程,使软件开发者与代码逆向分析爱好者受益颇多,因此被连连称赞。保护开发者的利益与版权是我们持之以恒的动力!学破解论坛将竭尽全力为软件安全领域献出微薄之力!

  离线 

签到天数: 2

该用户今日未签到

 楼主| 发表于 2016-8-4 20:32 | 显示全部楼层 |取消关注该作者的回复
Bu弃 发表于 2016-8-4 20:08
膜拜表哥,这个算法我都没去看的。有时间一定要玩玩。看看能不能写个注册机出来。

注册机 可以的
学破解论坛关注PC软件安全与移动软件安全领域。学习破解方法,使软件开发者能够更好的弥补软件缺陷,修复软件漏洞,提升软件安全,将损失降为最低。大量的软件加密解密教程,使软件开发者与代码逆向分析爱好者受益颇多,因此被连连称赞。保护开发者的利益与版权是我们持之以恒的动力!学破解论坛将竭尽全力为软件安全领域献出微薄之力!
回复

使用道具 举报

  在线 

该用户从未签到

膜拜会算法 的 好牛呀   
学破解论坛关注PC软件安全与移动软件安全领域。学习破解方法,使软件开发者能够更好的弥补软件缺陷,修复软件漏洞,提升软件安全,将损失降为最低。大量的软件加密解密教程,使软件开发者与代码逆向分析爱好者受益颇多,因此被连连称赞。保护开发者的利益与版权是我们持之以恒的动力!学破解论坛将竭尽全力为软件安全领域献出微薄之力!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明

本站中所有被研究的素材与信息全部来源于互联网,版权争议与本站无关。本站所发布的任何软件的逆向分析文章、逆向分析视频、破解补丁、注册机和注册信息,仅限用于学习和研究软件安全的目的。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。学习逆向分析技术是为了更好的完善软件可能存在的不安全因素,提升软件安全意识,所以您如果喜欢某程序,请购买注册正版软件,获得正版优质服务!不得将上述内容私自传播、销售或者其他任何非法用途!否则,一切后果请用户自负!


联系QQ|联系Email|手机版|小黑屋|FAQ|Vip破解教程|学破解论坛 ( 京公网安备 11011502002737号 | 京ICP备14042738号-2 )  

GMT+8, 2017-2-20 17:18

快速回复 返回顶部 返回列表