wbz_007 发表于 2019-8-1 14:06

知识巩固之 精装友情通讯录 算法详细分析 与注册机编写

本帖最后由 wbz_007 于 2019-8-1 14:22 编辑

知识巩固之 精装友情通讯录 算法详细分析 与注册机编写
此软件是一款老软件,为明码比较,追码太简单,不过一味想追明码,破解提高不了,现在软件越来算法越复杂,根本看不到明码,所以分析算法编写注册机,才是硬道理,并且搞懂算法编写注册机,软件才可以达到完美破解,毕竟有些软件爆破后不稳定,有些功能会丧失,ok,废话不说了,此分析仅供学习,一起努力!:lol
根据弹窗提示来到如下:


00514CA4    55            push    ebp
00514CA5    8BEC            mov   ebp, esp
00514CA7    B9 17000000   mov   ecx, 0x17
00514CAC    6A 00         push    0x0
00514CAE    6A 00         push    0x0
00514CB0    49            dec   ecx
00514CB1^ 75 F9         jnz   short jzyq.00514CAC
00514CB3    53            push    ebx
00514CB4    56            push    esi
00514CB5    8BD8            mov   ebx, eax
00514CB7    33C0            xor   eax, eax
00514CB9    55            push    ebp
00514CBA    68 294F5100   push    jzyq.00514F29
00514CBF    64:FF30         push    dword ptr fs:
00514CC2    64:8920         mov   dword ptr fs:, esp
00514CC5    68 80000000   push    0x80
00514CCA    8D85 7BFFFFFF   lea   eax, dword ptr ss:
00514CD0    50            push    eax
00514CD1    E8 D625EFFF   call    <jmp.&kernel32.GetSystemDirector>
00514CD6    8D45 FC         lea   eax, dword ptr ss:
00514CD9    8D95 7BFFFFFF   lea   edx, dword ptr ss:
00514CDF    B9 81000000   mov   ecx, 0x81
00514CE4    E8 07FFEEFF   call    jzyq.00404BF0
00514CE9    8D95 74FFFFFF   lea   edx, dword ptr ss:
00514CEF    8B83 34030000   mov   eax, dword ptr ds:
00514CF5    E8 2AD8F2FF   call    jzyq.00442524                  ; 取注册码长度
00514CFA    83BD 74FFFFFF 0>cmp   dword ptr ss:, 0x0   ; 判断是否输入注册码
00514D01    74 1A         je      short jzyq.00514D1D
00514D03    8D95 70FFFFFF   lea   edx, dword ptr ss:
00514D09    8B83 10030000   mov   eax, dword ptr ds:
00514D0F    E8 10D8F2FF   call    jzyq.00442524                  ; 取订单号长度
00514D14    83BD 70FFFFFF 0>cmp   dword ptr ss:, 0x0   ; 看是否输入订单号
00514D1B    75 0F         jnz   short jzyq.00514D2C
00514D1D    B8 404F5100   mov   eax, jzyq.00514F40               ; 注册信息没有填写齐全
00514D22    E8 F169F2FF   call    jzyq.0043B718
00514D27    E9 80010000   jmp   jzyq.00514EAC
00514D2C    8D95 6CFFFFFF   lea   edx, dword ptr ss:
00514D32    8B83 34030000   mov   eax, dword ptr ds:
00514D38    E8 E7D7F2FF   call    jzyq.00442524                  ; 取注册码长度
00514D3D    8B85 6CFFFFFF   mov   eax, dword ptr ss:   ; 注册码给eax
00514D43    50            push    eax
00514D44    8D95 60FFFFFF   lea   edx, dword ptr ss:
00514D4A    8B83 10030000   mov   eax, dword ptr ds:
00514D50    E8 CFD7F2FF   call    jzyq.00442524                  ; 取订单号长度
00514D55    8B85 60FFFFFF   mov   eax, dword ptr ss:   ; 订单号给eax
00514D5B    E8 9447EFFF   call    jzyq.004094F4                  ; 订单号取十六进制给eax,订单号给ecx
00514D60    B9 D3000000   mov   ecx, 0xD3                        ; d3给ecx
00514D65    99            cdq
00514D66    F7F9            idiv    ecx                              ; 给假订单号的十六进制除以d3,商给eax,余数给edx
00514D68    8BC2            mov   eax, edx                         ; eax=edx
00514D6A    8D95 64FFFFFF   lea   edx, dword ptr ss:
00514D70    E8 1B47EFFF   call    jzyq.00409490
00514D75    FFB5 64FFFFFF   push    dword ptr ss:
00514D7B    8D95 54FFFFFF   lea   edx, dword ptr ss:
00514D81    8B83 10030000   mov   eax, dword ptr ds:
00514D87    E8 98D7F2FF   call    jzyq.00442524                  ; 取订单号长度
00514D8C    8B85 54FFFFFF   mov   eax, dword ptr ss:   ; 假订单号给eax
00514D92    E8 5D47EFFF   call    jzyq.004094F4                  ; 假订单号的十六进制给eax,订单号给ecx
00514D97    8D95 58FFFFFF   lea   edx, dword ptr ss:
00514D9D    E8 C6FCFFFF   call    jzyq.00514A68                  ; 算法call
00514DA2    8B85 58FFFFFF   mov   eax, dword ptr ss:   ; 十进制字符串连接上1,2位3,4位计算的结果,组成新的字符串给eax
00514DA8    E8 4747EFFF   call    jzyq.004094F4
00514DAD    8D95 5CFFFFFF   lea   edx, dword ptr ss:
00514DB3    E8 90FDFFFF   call    jzyq.00514B48                  ; 算法call
00514DB8    FFB5 5CFFFFFF   push    dword ptr ss:          ; 在四个位置分辨加上计算后的字符,压入字符串
00514DBE    68 604F5100   push    jzyq.00514F60                  ; 压入预设1
00514DC3    8D85 68FFFFFF   lea   eax, dword ptr ss:
00514DC9    BA 03000000   mov   edx, 0x3                         ; 3给edx
00514DCE    E8 2DFFEEFF   call    jzyq.00404D00
00514DD3    8B95 68FFFFFF   mov   edx, dword ptr ss:   ; 假订单号的十六进制除以d3,取余数的值,并且取是进制,将十进制的值放在已经计算补位后的字符串前面,后面加预设1,就是真注册码了
00514DD9    58            pop   eax
00514DDA    E8 A5FFEEFF   call    jzyq.00404D84                  ; 比较kall
00514DDF    0F85 A3000000   jnz   jzyq.00514E88                  ; 爆破点,不等就挂啦
00514DE5    B8 6C4F5100   mov   eax, jzyq.00514F6C               ; 注册码正确,感谢你的注册!


=========================================================================================================================================


f7进入第一算法call:


00514A6D    51            push    ecx
00514A6E    51            push    ecx
00514A6F    51            push    ecx
00514A70    51            push    ecx
00514A71    53            push    ebx
00514A72    56            push    esi
00514A73    8BF2            mov   esi, edx
00514A75    8BD8            mov   ebx, eax                         ; ebx等于eax位假订单号
00514A77    33C0            xor   eax, eax                         ; eax清零
00514A79    55            push    ebp
00514A7A    68 384B5100   push    jzyq.00514B38
00514A7F    64:FF30         push    dword ptr fs:
00514A82    64:8920         mov   dword ptr fs:, esp
00514A85    81F3 F1250B00   xor   ebx, 0xB25F1                     ; 假订单号十六进制和b25f1异或
00514A8B    8BC3            mov   eax, ebx                         ; 结果给eax
00514A8D    33D2            xor   edx, edx                         ; edx清零
00514A8F    52            push    edx
00514A90    50            push    eax
00514A91    8D45 FC         lea   eax, dword ptr ss:
00514A94    E8 274AEFFF   call    jzyq.004094C0                  ; 对假订单号十六进制和b25f1异或后的结果取十进制
00514A99    8B45 FC         mov   eax, dword ptr ss:      ; 十进制的结果给eax
00514A9C    0FB600          movzx   eax, byte ptr ds:         ; 开始取十进制字符串第一位的十六进制给eax
00514A9F    8B55 FC         mov   edx, dword ptr ss:      ; 十进制字符串给edx
00514AA2    0FB652 01       movzx   edx, byte ptr ds:       ; 取第二位十六进制给edx
00514AA6    03C2            add   eax, edx                         ; eax=eax+edx 第一位十六进制和第二位十六进制相加
00514AA8    B9 05000000   mov   ecx, 0x5                         ; 5给ecx
00514AAD    99            cdq
00514AAE    F7F9            idiv    ecx                              ; eax除以5,商给eax,余数给edx
00514AB0    80C2 34         add   dl, 0x34                         ; edx=edx+34 余数加34给edx
00514AB3    8855 F8         mov   byte ptr ss:, dl      ; edx给0018faf8这个地址
00514AB6    8B45 FC         mov   eax, dword ptr ss:      ; 十进制字符串给eax
00514AB9    0FB640 02       movzx   eax, byte ptr ds:       ; 取第三位十六进制给eax
00514ABD    8B55 FC         mov   edx, dword ptr ss:      ; 字符串给edx
00514AC0    0FB652 03       movzx   edx, byte ptr ds:       ; 第四位十六进制给edx
00514AC4    03C2            add   eax, edx                         ; 三位和四位十六进制相加
00514AC6    B9 05000000   mov   ecx, 0x5                         ; 5给ecx
00514ACB    99            cdq
00514ACC    F7F9            idiv    ecx                              ; eax除以5,商给eax,余数给edx
00514ACE    8BDA            mov   ebx, edx                         ; ebx=edx 把余数给ebx
00514AD0    80C3 33         add   bl, 0x33                         ; ebx=ebx+33
00514AD3    885D F9         mov   byte ptr ss:, bl      ; ebx给0018faf9地址
00514AD6    8D45 F4         lea   eax, dword ptr ss:
00514AD9    8A55 F8         mov   dl, byte ptr ss:      ; 把十进制字符串的前两位计算结果给edx 在0018faf8这个地址
00514ADC    E8 8700EFFF   call    jzyq.00404B68
00514AE1    8B45 F4         mov   eax, dword ptr ss:      ; 取结果为字符 给eax
00514AE4    8D55 FC         lea   edx, dword ptr ss:      ; 十进制字符串给edx地址
00514AE7    B9 1B000000   mov   ecx, 0x1B                        ; 1b给ecx
00514AEC    E8 2F04EFFF   call    jzyq.00404F20
00514AF1    8D45 F0         lea   eax, dword ptr ss:
00514AF4    8BD3            mov   edx, ebx                         ; edx=ebx 为十进制字符串3位和4位十六进制计算后的余数加33
00514AF6    E8 6D00EFFF   call    jzyq.00404B68
00514AFB    8B45 F0         mov   eax, dword ptr ss:   ; 取计算结果后的十六进制转化成字符,给eax
00514AFE    8D55 FC         lea   edx, dword ptr ss:      ; 字符串给edx 地址,在字符串连接上第1位和第2位的计算结果的余数加33 对结果取字符
00514B01    B9 19000000   mov   ecx, 0x19                        ; 19 给ecx
00514B06    E8 1504EFFF   call    jzyq.00404F20                  ; 3位和4 位计算的结果 取字符给edx
00514B0B    8BC6            mov   eax, esi
00514B0D    8B55 FC         mov   edx, dword ptr ss:      ; 十进制字符串连接上1位和2位,3位和4位计算的结果,给edx
00514B10    E8 C7FEEEFF   call    jzyq.004049DC
00514B15    33C0            xor   eax, eax                         ; 清零 eax
00514B17    5A            pop   edx


=============================================================================================================================


继续进入第二个算法call


00514B4D    51            push    ecx
00514B4E    51            push    ecx
00514B4F    51            push    ecx
00514B50    51            push    ecx
00514B51    51            push    ecx
00514B52    51            push    ecx
00514B53    53            push    ebx
00514B54    56            push    esi
00514B55    8BF2            mov   esi, edx
00514B57    8BD8            mov   ebx, eax
00514B59    33C0            xor   eax, eax
00514B5B    55            push    ebp
00514B5C    68 944C5100   push    jzyq.00514C94
00514B61    64:FF30         push    dword ptr fs:
00514B64    64:8920         mov   dword ptr fs:, esp
00514B67    81F3 8776FBDD   xor   ebx, 0xDDFB7687                  ; 上一个call的计算结果异或预设ddfb7687
00514B6D    8BC3            mov   eax, ebx                         ; eax=ebx
00514B6F    33D2            xor   edx, edx                         ; 清零
00514B71    52            push    edx
00514B72    50            push    eax
00514B73    8D45 FC         lea   eax, dword ptr ss:
00514B76    E8 4549EFFF   call    jzyq.004094C0                  ; 上一个call的计算结果异或预设ddfb7687,结果取十进制
00514B7B    8B45 FC         mov   eax, dword ptr ss:      ; 给eax
00514B7E    0FB600          movzx   eax, byte ptr ds:         ; 取十进制字符第一位十六进制给eax
00514B81    8B55 FC         mov   edx, dword ptr ss:      ; 字符串给edx
00514B84    0FB652 01       movzx   edx, byte ptr ds:       ; 取第二位十六进制给edx
00514B88    03C2            add   eax, edx                         ; eax=eax+edx 第一位十六进制和第二位十六进制相加
00514B8A    B9 05000000   mov   ecx, 0x5                         ; 5给ecx
00514B8F    99            cdq
00514B90    F7F9            idiv    ecx                              ; eax除以5,商给eax,余数给edx
00514B92    80C2 66         add   dl, 0x66                         ; edx 余数加66,给edx
00514B95    8855 F8         mov   byte ptr ss:, dl      ; 对edx 计算结果取字符 放在0018faf8 地址中
00514B98    8B45 FC         mov   eax, dword ptr ss:      ; 字符串给eax
00514B9B    0FB640 02       movzx   eax, byte ptr ds:       ; 取第三位十六进制给eax
00514B9F    8B55 FC         mov   edx, dword ptr ss:      ; 字符串给edx
00514BA2    0FB652 03       movzx   edx, byte ptr ds:       ; 取第四位十六进制给edx
00514BA6    03C2            add   eax, edx                         ; eax=eax+edx 第三位十六进制和第四位十六进制相加
00514BA8    B9 05000000   mov   ecx, 0x5                         ; 5给ecx
00514BAD    99            cdq
00514BAE    F7F9            idiv    ecx                              ; eax除以5,商放在eax,余数放在edx
00514BB0    80C2 75         add   dl, 0x75                         ; 余数加75 给edx
00514BB3    8855 F9         mov   byte ptr ss:, dl      ; 将计算结果给0018faf9 地址
00514BB6    8B45 FC         mov   eax, dword ptr ss:      ; 字符串给eax
00514BB9    0FB640 04       movzx   eax, byte ptr ds:       ; 取第五位给eax
00514BBD    8B55 FC         mov   edx, dword ptr ss:      ; 字符串给edx
00514BC0    0FB652 05       movzx   edx, byte ptr ds:       ; 取第六位给edx
00514BC4    03C2            add   eax, edx                         ; eax=eax+edx 第五位十六进制和第六位十六进制相加
00514BC6    B9 05000000   mov   ecx, 0x5                         ; 5给ecx
00514BCB    99            cdq
00514BCC    F7F9            idiv    ecx                              ; eax除以5,商给eax,余数给edx
00514BCE    80C2 7A         add   dl, 0x7A                         ; 余数加7a
00514BD1    8855 FA         mov   byte ptr ss:, dl      ; 结果取字符给0018fafa地址里
00514BD4    8B45 FC         mov   eax, dword ptr ss:
00514BD7    0FB640 06       movzx   eax, byte ptr ds:       ; 第7位给eax
00514BDB    8B55 FC         mov   edx, dword ptr ss:
00514BDE    0FB652 07       movzx   edx, byte ptr ds:       ; 第8位给edx
00514BE2    03C2            add   eax, edx                         ; 7位和8位相加给eax
00514BE4    8B55 FC         mov   edx, dword ptr ss:
00514BE7    0FB652 08       movzx   edx, byte ptr ds:       ; 第9为给edx
00514BEB    03C2            add   eax, edx                         ; 7位和8位相加给eax 在加上第9位
00514BED    B9 05000000   mov   ecx, 0x5                         ; 5给ecx
00514BF2    99            cdq
00514BF3    F7F9            idiv    ecx                              ; eax除以5,商给eax,余数给edx
00514BF5    80C2 69         add   dl, 0x69                         ; 余数加69 给edx
00514BF8    8855 FB         mov   byte ptr ss:, dl      ; 计算结果取字符给0018fafb地址
00514BFB    8D45 F4         lea   eax, dword ptr ss:
00514BFE    8A55 F8         mov   dl, byte ptr ss:      ; 1和2位结果给edx
00514C01    E8 62FFEEFF   call    jzyq.00404B68                  ; 对十六进制转化成字符
00514C06    8B45 F4         mov   eax, dword ptr ss:      ; 给eax
00514C09    8D55 FC         lea   edx, dword ptr ss:      ; 字符串给edx
00514C0C    B9 07000000   mov   ecx, 0x7                         ; 7给ecx
00514C11    E8 0A03EFFF   call    jzyq.00404F20                  ; 在字符串第七位插入1,2位的计算结果的字符
00514C16    8D45 F0         lea   eax, dword ptr ss:
00514C19    8A55 FB         mov   dl, byte ptr ss:      ; 3和4位计算结果字符给edx
00514C1C    E8 47FFEEFF   call    jzyq.00404B68
00514C21    8B45 F0         mov   eax, dword ptr ss:   ; 结果的字符给eax
00514C24    8D55 FC         lea   edx, dword ptr ss:      ; 把加过1,2位结果的字符串给edx地址
00514C27    B9 03000000   mov   ecx, 0x3                         ; 3给ecx
00514C2C    E8 EF02EFFF   call    jzyq.00404F20                  ; 将3和4位的结果字符插入在字符串的第三位
00514C31    8D45 EC         lea   eax, dword ptr ss:
00514C34    8A55 F9         mov   dl, byte ptr ss:      ; 5,6位结果给edx
00514C37    E8 2CFFEEFF   call    jzyq.00404B68                  ; 取结果字符
00514C3C    8B45 EC         mov   eax, dword ptr ss:   ; 结果字符给eax
00514C3F    8D55 FC         lea   edx, dword ptr ss:
00514C42    B9 05000000   mov   ecx, 0x5                         ; 5给ecx
00514C47    E8 D402EFFF   call    jzyq.00404F20                  ; 在第五位插入3,4位结果的字符
00514C4C    8D45 E8         lea   eax, dword ptr ss:
00514C4F    8A55 FA         mov   dl, byte ptr ss:      ; 7,8,9位结果字符给edx
00514C52    E8 11FFEEFF   call    jzyq.00404B68
00514C57    8B45 E8         mov   eax, dword ptr ss:
00514C5A    8D55 FC         lea   edx, dword ptr ss:
00514C5D    B9 09000000   mov   ecx, 0x9                         ; 9给ecx
00514C62    E8 B902EFFF   call    jzyq.00404F20                  ; 字符串第九位插入7,8,9位结果的字符
00514C67    8BC6            mov   eax, esi
00514C69    8B55 FC         mov   edx, dword ptr ss:      ; 把所有字符串给edx(这里注册码基本完成,还有一部分跳出call后计算)
00514C6C    E8 6BFDEEFF   call    jzyq.004049DC


===============================================================================================================================


跳出call后,来到


00514DD3    8B95 68FFFFFF   mov   edx, dword ptr ss:   ; 假订单号的十六进制除以d3,取余数的值,并且取是进制,将十进制的值放在已经计算补位后的字符串前面,后面加预设1,就是真注册码了

算法分析:
1、将假订单号作为十进制和730609( B25F1)异或,结果取十进制
2、对十进制结果 取前两位十六进制的和再除以5,取余数,再用余数加34
3、对十进制结果,取第3位和第4位十六进制的和再除以5,取余数,再用余数加33
4、将以上两个结果的十进制取字符,分别放在上面1的后面,成为一串字符
5、对4的结果和3724244615(ddfb7687)做异或,取十进制。
6、对5的结果1,2位十六进制取和,除以5,取余数加66,对结果取字符,将字符插入上面5得到的十进制字符串的第7位
   对5的结果3,4位十六进制取和,除以5,取余数加75,对结果取字符,将字符查入上面5得到的十进制字符串的第5位   
   对5的结果5,6位十六进制取和,除以5,取余数加7a,对结果取字符,将字符插入上面5得到的十进制字符串的第9位   
   对5的结果7,8,9位十六进制取和,除以5,取余数加69,对结果取字符,将字符查入上面5得到的十进制字符串的第3位   


7、最后在6的结果,字符串前面加上,假订单号除以预设211(十六进制d3)的余数值的十进制,再在末尾加上预设1,就是注册码。



几组注册码:


订单号:1234
注册码:17936l5w137{f28931


订单号:8888
注册码:2636k5x256|f24721








涛之雨 发表于 2019-8-2 16:01

a7816995 发表于 2019-8-2 11:47
突然之间发觉我也看得懂代码了,你发的这个通俗易懂哈哈。

咳咳这个顶多算asm汇编版的伪代码。。。
哪有这么些的。。。
下面两个+1全都没有推入call。。。(貌似可以说是直接用寄存器传值【我好机智2333】)
不过汇编看起来是真的脑壳疼。。。
现在正看着一个呢,头疼,来刷一会论坛23333

涛之雨 发表于 2019-8-2 08:03

建议楼主对源码进行截图或是扔到论坛的代码块里。。。看着脑壳疼。
;可以像这样
push 楼主666
add 好评,1
add cb,1
call 免费评分
;这样好看一点。。。
;不然还要复制到本地查看。。。
没有cb了。晚些时候评分(如果没忘的话)

sedaling 发表于 2019-8-1 14:09

学习了, 非常感谢!!!

javaCover 发表于 2019-8-1 14:13

受教了受教了{:1_921:}

daymissed 发表于 2019-8-1 14:18

学习了。感谢分享

7086pp 发表于 2019-8-1 14:20

感谢分享,学习了,谢谢!

baki 发表于 2019-8-1 15:11

感谢找了很久

xinwuzui21 发表于 2019-8-1 15:27

谢谢分享,学习学习

lm180180 发表于 2019-8-1 15:59

感谢分享         

hjkerty 发表于 2019-8-1 16:01

学习了。感谢分享

dtkevin 发表于 2019-8-1 16:05

发现现在的人都是由专业性人才发展成全方位人才,666.
页: [1] 2 3 4
查看完整版本: 知识巩固之 精装友情通讯录 算法详细分析 与注册机编写