知识巩固之 精装友情通讯录 算法详细分析 与注册机编写
本帖最后由 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
a7816995 发表于 2019-8-2 11:47
突然之间发觉我也看得懂代码了,你发的这个通俗易懂哈哈。
咳咳这个顶多算asm汇编版的伪代码。。。
哪有这么些的。。。
下面两个+1全都没有推入call。。。(貌似可以说是直接用寄存器传值【我好机智2333】)
不过汇编看起来是真的脑壳疼。。。
现在正看着一个呢,头疼,来刷一会论坛23333 建议楼主对源码进行截图或是扔到论坛的代码块里。。。看着脑壳疼。
;可以像这样
push 楼主666
add 好评,1
add cb,1
call 免费评分
;这样好看一点。。。
;不然还要复制到本地查看。。。
没有cb了。晚些时候评分(如果没忘的话) 学习了, 非常感谢!!! 受教了受教了{:1_921:} 学习了。感谢分享 感谢分享,学习了,谢谢! 感谢找了很久 谢谢分享,学习学习 感谢分享 学习了。感谢分享 发现现在的人都是由专业性人才发展成全方位人才,666.