因为看到论坛有人需要这个软件的算法分析,所以无聊就写下这篇文章和大家一起交流学习,这篇算法分析比较适合新手学习,因为算法比较简单。
该软件是一个易语言软件,所以直接下易语言按钮事件断下,找关键的算法call
004A802A /. 55 push ebp ; 注册算法
004A802B |. 8BEC mov ebp,esp
004A802D |. 81EC 34000000 sub esp,0x34
004A8033 |. C745 FC 00000>mov[local.1],0x0
004A803A |. C745 F8 00000>mov[local.2],0x0
004A8041 |. C745 F4 00000>mov[local.3],0x0
004A8048 |. 6A 01 push 0x1
004A804A |. B8 ED6F6D00 mov eax,生辰八字.006D6FED ; wenyuhao
004A804F |. 8945 F0 mov [local.4],eax
004A8052 |. 8D45 F0 lea eax,[local.4]
004A8055 |. 50 push eax
004A8056 |. 68 D0C38A00 push 生辰八字.008AC3D0 ; 8}Z\t
004A805B |. 68 84C48A00 push 生辰八字.008AC484
上面这段就是算法的开始,我们一步一步分析,因为这个算法比较简单,适合新手去学习练手!!
004A812C |. 83C4 04 add esp,0x4
004A812F |> 58 pop eax
004A8130 |. 8945 FC mov [local.1],eax
004A8133 |. 6A FF push -0x1
004A8135 |. 6A 08 push 0x8
004A8137 |. 68 0F940216 push 0x1602940F
004A813C |. 68 27540152 push 0x52015427
004A8141 |. E8 82E40800 call 生辰八字.005365C8 ; 获取我输入的假码
004A8146 |. 83C4 10 add esp,0x10
004A8149 |. 8945 F0 mov [local.4],eax
004A814C |. 68 04000080 push 0x80000004
004A8151 |. 6A 00 push 0x0
004A8153 |. 8B45 F0 mov eax,[local.4]
004A8156 |. 85C0 test eax,eax
004A8158 |. 75 05 jnz short 生辰八字.004A815F
004A8182 |. 83C4 04 add esp,0x4
004A8185 |> 68 45C26300 push 生辰八字.0063C245 ; '
004A818A |. FF75 EC push [local.5]
004A818D |. 68 3BDB6E00 push 生辰八字.006EDB3B ; pass='
004A8192 |. B9 03000000 mov ecx,0x3
004A8197 |. E8 B292F5FF call 生辰八字.0040144E
004A819C |. 83C4 0C add esp,0xC
004A819F |. 8945 E8 mov [local.6],eax
004A81A2 |. 8B5D EC mov ebx,[local.5]
004A81A5 |. 85DB test ebx,ebx
“Pass=”和假码合并
pass='123456789'
然后一直下去会进行一些没关紧要的操作,这些可以忽略不理。
004A8234 |. 83C4 04 add esp,0x4
004A8237 |> 58 pop eax
004A8238 |. 8945 F8 mov [local.2],eax
004A823B |. 6A FF push -0x1
004A823D |. 6A 08 push 0x8
004A823F |. 68 0F940216 push 0x1602940F
004A8244 |. 68 27540152 push 0x52015427
004A8249 |. E8 7AE30800 call 生辰八字.005365C8 继续取出假码
004A824E |. 83C4 10 add esp,0x10
004A8251 |. 8945 F0 mov [local.4],eax
004A8254 |. 68 04000080 push 0x80000004
004A8259 |. 6A 00 push 0x0
004A825B |. 8B45 F0 mov eax,[local.4]
004A825E |. 85C0 test eax,eax
004A8260 |. 75 05 jnz short 生辰八字.004A8267
----------------------------------------------
004A828A |. 83C4 04 add esp,0x4
004A828D |> 68 45C26300 push 生辰八字.0063C245 ; '
004A8292 |. FF75 EC push [local.5]
004A8295 |. 68 3BDB6E00 push 生辰八字.006EDB3B ; pass='
004A829A |. B9 03000000 mov ecx,0x3
004A829F |. E8 AA91F5FF call 生辰八字.0040144E
004A82A4 |. 83C4 0C add esp,0xC
004A82A7 |. 8945 E8 mov [local.6],eax
004A82AA |. 8B5D EC mov ebx,[local.5]
004A82AD |. 85DB test ebx,ebx
继续“Pass=”和假码合并
pass='123456789'
----------------------------------------------
004A833C |. 83C4 04 add esp,0x4
004A833F |> 58 pop eax
004A8340 |. 8945 F4 mov [local.3],eax
004A8343 |. 68 04000080 push 0x80000004
004A8348 |. 6A 00 push 0x0
004A834A |. A1 D4C38A00 mov eax,dword ptr ds:[0x8AC3D4] ; 机器码序列号,请记下这个全局变量[0x8AC3D4]
004A834F |. 85C0 test eax,eax
我这里的机器码为:2018682084
004A8368 |. 83C4 10 add esp,0x10
004A836B |. 8945 E4 mov [local.7],eax
004A836E |. 8955 E8 mov [local.6],edx
004A8371 |. DF6D E4 fild qword ptr ss:[ebp-0x1C]
004A8374 |. DD5D E4 fstp qword ptr ss:[ebp-0x1C]
004A8377 |. DD45 E4 fld qword ptr ss:[ebp-0x1C]
004A837A |. DC0D 09C46300 fmul qword ptrds:[0x63C409] ; 机器码×323 注意这里的操作都是以10进制操作
004A8380 |. DD5D DC fstp qword ptr ss:[ebp-0x24]
004A8383 |. 68 01060080 push 0x80000601
004A8388 |. FF75 E0 push [local.8]
004A838B |. FF75 DC push [local.9]
004A838E |. 6801000000 push 0x1
004A8393 |. BB 907A5300 mov ebx,生辰八字.00537A90
这里就是机器码*323
2018682084*323= hex (D0460BAC)
004A839D |. 83C4 10 add esp,0x10
004A83A0 |. 68 01030080 push 0x80000301
004A83A5 |. 6A 00 push 0x0
004A83A7 |. 50 push eax
004A83A8 |. 68 01000000 push 0x1
004A83AD |. BB E08C5300 mov ebx,生辰八字.00538CE0
004A83B2 |. E8 F9E10800 call 生辰八字.005365B0 ; 将结果转换为10进制
004A83B7 |. 83C4 10 add esp,0x10
004A83BA |. 8945 D4 mov [local.11],eax
经典的易语言文本比较
004A83D0 |. 83C4 10 add esp,0x10
004A83D3 |. 8945 D0 mov [local.12],eax
004A83D6 |. 8B45 D4 mov eax,[local.11]
004A83D9 |. 50 push eax
004A83DA |. FF75 D0 push [local.12]
004A83DD |. E8 648FF5FF call 生辰八字.00401346
004A83E2 |. 83C4 08 add esp,0x8
004A83E5 |. 83F8 00 cmp eax,0x0
004A83E8 |. B8 00000000 mov eax,0x0
004A83ED |. 0F94C0 sete al
004A83F0 |. 8945 CC mov [local.13],eax
004A83F3 |. 8B5D D0 mov ebx,[local.12]
004A83F6 |. 85DB test ebx,ebx
爆破的话修改下面跳转就可以了,我们现在是学算法分析,所以我们不玩爆破。
总结:注册码=机器码* 323
知道了注册码怎么计算出来的,现在我们来找出机器码的算法。
刚才叫大家记下这个全局变量[0x8AC3D4]
现在我们搜索这个常量
全部都下上断点
00401F16 . 5E pop esi ; 057ACA30
00401F17 . 8BF8 mov edi,eax
00401F19 . F3:A4 rep movs byte ptr es:[edi],byte ptrds:[>
00401F1B > 50 push eax
00401F1C . 8B1D D4C38A00 mov ebx,dword ptrds:[0x8AC3D4]
00401F22 . 85DB test ebx,ebx
00401F24 . 74 09 je short 生辰八字.00401F2F
00401F26 . 53 push ebx
00401F27 . E8 7E461300 call 生辰八字.005365AA
00401F2C . 83C4 04 add esp,0x4
我们发现在这里断下,这时候,eax已经出现了机器码,我们往上找,看看机器码怎么计算出来的。
00401DDD . 6A 00 push 0x0
00401DDF . 6A 00 push 0x0
00401DE1 . 6A 00 push 0x0
00401DE3 . 68 07000700 push 0x70007
00401DE8 . 6A 00 push 0x0
00401DEA . FF35 CCC38A00 push dword ptrds:[0x8AC3CC]
00401DF0 . 68 02000000 push 0x2
00401DF5 . B8 06000000 mov eax,0x6
00401DFA . BB 60965C00 mov ebx,生辰八字.005C9660
00401DFF . E8 B8471300 call 生辰八字.005365BC
00401E04 . 83C4 1C add esp,0x1C
00401E07 . 8B1D CCC38A00 mov ebx,dword ptr ds:[0x8AC3CC]
00401E0D . 83C3 08 add ebx,0x8
00401E10 . 895D FC mov dword ptr ss:[ebp-0x4],ebx
00401E13 . 68 04000080 push 0x80000004
00401E18 . 6A 00 push 0x0
00401E1A . 8B5D FC mov ebx,dword ptr ss:[ebp-0x4]
00401E1D . 8B03 mov eax,dword ptr ds:[ebx]
00401E1F . 85C0 test eax,eax
00401E21 . 75 05 jnz short 生辰八字.00401E28
00401E23 . B8 44C26300 mov eax,生辰八字.0063C244
00401E28 > 50 push eax
00401E29 . 68 01000000 push 0x1
00401E2E . BB 10845300 mov ebx,生辰八字.00538410
这里是取硬盘序列号
我这里是 S248NXAH110569Z
00401E51 > \50 push eax
00401E52 . 68 01000000 push 0x1
00401E57 . B8 0E000000 mov eax,0xE
00401E5C . BB 20E65D00 mov ebx,生辰八字.005DE620
00401E61 . E8 56471300 call 生辰八字.005365BC
00401E66 . 83C4 10 add esp,0x10
00401E69 . 8945 F4 mov dword ptr ss:[ebp-0xC],eax
00401E6C . 8B5D F8 mov ebx,dword ptr ss:[ebp-0x8]
00401E6F . 85DB test ebx,ebx ; 生辰八字.005DE620
将硬盘序列号进行MD5操作
00401E93 > \58 pop eax
00401E94 . A3 D0C38A00 mov dword ptr ds:[0x8AC3D0],eax
00401E99 . 68 00000000 push 0x0
00401E9E . BB F0CC5300 mov ebx,生辰八字.0053CCF0
00401EA3 . E8 08471300 call 生辰八字.005365B0
00401EA8 . 83C4 04 add esp,0x4
00401EAB . 8945 F4 mov dword ptr ss:[ebp-0xC],eax
00401EAE . DB45 F4 fild dword ptr ss:[ebp-0xC]
00401EB1 . DD5D F4 fstp qword ptr ss:[ebp-0xC]
00401EB4 . DD45 F4 fld qword ptr ss:[ebp-0xC]
00401EB7 . DC05 F2C36300 fadd qword ptrds:[0x63C3F2]
00401EBD . DD5D EC fstp qword ptr ss:[ebp-0x14]
00401EC0 . 68 01060080 push 0x80000601
00401EC5 . FF75 F0 push dword ptr ss:[ebp-0x10]
00401EC8 . FF75 EC push dword ptr ss:[ebp-0x14] ; 生辰八字.008B8680
00401ECB . 68 01000000 push 0x1
00401ED0 . BB E08C5300 mov ebx,生辰八字.00538CE0
这段其实就是易语言的取硬盘特征字命令,我在这里浪费了不少时间才得知是这个命令
00401EA3 . E8 08471300 call 生辰八字.005365B0 F7进入
百度了一下上图圈出的关键字,得出是取硬盘信息相关的命令。
上图这段就是进行各种硬盘信息操作,得出最后的取硬盘特征字
把硬盘模型号的ASCII进行相加
拿出硬盘版本 EMT41B6Q 进行ASCII相加
其他几个就不一一说了,都是拿下面这些信息进行运算。
硬盘模型号 Samsung SSD 850 EVO mSATA250GB
版本 EMT41B6Q
硬盘序列号 S248NXAH110569Z
磁头数 16
柱面数 266305
容量 131071
缓存大小 0
每磁道扇区数 63
第一硬盘特征字是:1079414944
最后得出第一硬盘特征字是:1079414944
然后将盘特征字和3086910975进行相加操作,最后就得出机器码。
附上软件和KeyGen
链接:https://share.weiyun.com/89dd392ddbbb753f64c10dcb21a7e758 (密码:NYXK9I)
--官方论坛
www.52pojie.cn
--推荐给朋友
公众微信号:吾爱破解论坛
或搜微信号:pojie_52