吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9165|回复: 10
收起左侧

[原创] 160 CrackMe 之 06 算法分析及易语言注册机实现

  [复制链接]
wbz_007 发表于 2019-8-17 16:53
本帖最后由 wbz_007 于 2019-8-17 18:10 编辑

160 CrackMe 之 06 算法分析及易语言注册机实现
打开程序,发现ok按钮为灰色按钮,输入无反应,好家伙关于按钮就有四个弹出,太厉害了,内容如下,全是百度翻译,先对软件破解要求进行了解,翻译错了不负责,本人英语天差了
1、The purpose of this CrackMe v. 1.00 by aLoNg3x is to MAKE INVISIBLE the buttons "OK" and "Cancella" "
这个crackme v.1.00 by along3x的目的是使按钮“确定”和“取消”不可见(隐藏)。直接百度翻译的,本人英语太差,错了不负责。
2、if the buttons does NOT become invisible, then you have NOT cracked this Crackme :)
如果按钮没有变为隐形,那么你就没有破解这个程序:)
3、If you need some helps e-mail me or if you solve this protection please write me your solution. Many thanks
如果您需要一些帮助,请给我发电子邮件或解决此保护问题,请给我写下您的解决方案。非常感谢
4、CrackMe v. 1.00 written by "aLoNg3x" E-MAIL: albatro@freemail.it ; member of "Ringzer0" URL: http://ringzer0.cjb.net
crackme v.1.00由“along3x”撰写,电子邮件:albartro@freemail.it;“ringzer0”成员网址:http://ringzer0.cjb.net
由此可看出,只要达到ok按钮和清除这两个按钮最后隐藏,就是完美破解了。
程序为 Borland Delphi 4.0 - 5.0所编,直接运行aLoNg3x.1后,输入用户名和注册码,ok按钮为灰色,不可用,看来这个程序,只有输入正确注册码后,按钮才可以用,通过输入用户名发现最长为十位。载入od,右键字符查血没有发现可用信息,索性载入Delphi 事件到地址转换工具 查找按钮事件,由于发现此程序在输入用户名时有可能已经计算注册码,所以只有数入正确的注册码,灰色按钮才可以,于是载入工具找到输入用户名的代码地址和清除按钮事件的代码地址:如下

20190817163612.png

程序载入od,ctrl+G 在这三个地址上下断,运行程序,输入用户名,直接被段在下面代码:
[Asm] 纯文本查看 复制代码
00442E04    55              push    ebp                              ; 用户名输入 事件地址[/align][align=left]
00442E05    8BEC            mov     ebp, esp
00442E07    6A 00           push    0x0
00442E09    6A 00           push    0x0
00442E0B    53              push    ebx
00442E0C    8BD8            mov     ebx, eax
00442E0E    33C0            xor     eax, eax
00442E10    55              push    ebp
00442E11    68 9B2E4400     push    aLoNg3x_.00442E9B
00442E16    64:FF30         push    dword ptr fs:[eax]
00442E19    64:8920         mov     dword ptr fs:[eax], esp
00442E1C    8B83 D0020000   mov     eax, dword ptr ds:[ebx+0x2D0]
00442E22    8078 47 00      cmp     byte ptr ds:[eax+0x47], 0x0
00442E26    75 0F           jnz     short aLoNg3x_.00442E37
00442E28    B2 01           mov     dl, 0x1
00442E2A    8B83 CC020000   mov     eax, dword ptr ds:[ebx+0x2CC]
00442E30    8B08            mov     ecx, dword ptr ds:[eax]
00442E32    FF51 60         call    near dword ptr ds:[ecx+0x60]
00442E35    EB 49           jmp     short aLoNg3x_.00442E80
00442E37    8D55 FC         lea     edx, dword ptr ss:[ebp-0x4]
00442E3A    8B83 E0020000   mov     eax, dword ptr ds:[ebx+0x2E0]
00442E40    E8 7B04FEFF     call    aLoNg3x_.004232C0
00442E45    8B45 FC         mov     eax, dword ptr ss:[ebp-0x4]
00442E48    50              push    eax
00442E49    8D55 F8         lea     edx, dword ptr ss:[ebp-0x8]
00442E4C    8B83 DC020000   mov     eax, dword ptr ds:[ebx+0x2DC]
00442E52    E8 6904FEFF     call    aLoNg3x_.004232C0
00442E57    8B45 F8         mov     eax, dword ptr ss:[ebp-0x8]
00442E5A    5A              pop     edx
00442E5B    E8 DCFBFFFF     call    aLoNg3x_.00442A3C                ; ok 按钮 是否可用 关键call
00442E60    84C0            test    al, al                           ; 测试,如果al为1,按钮就可用,为0跳过,就不可用
00442E62    74 0F           je      short aLoNg3x_.00442E73          ; 如果这里nop掉或者汇编成jne,按钮即可用状态
00442E64    B2 01           mov     dl, 0x1                          ; dl 赋值 1
00442E66    8B83 CC020000   mov     eax, dword ptr ds:[ebx+0x2CC]
进入关键call  00442E5B    E8 DCFBFFFF     call    aLoNg3x_.00442A3C ,代码如下:这段代码算法:灰色按钮变为可用,算法如下:(用户名大于5位小于10位)  a取用户名第一位十六进制,b取用户名第二位十六进制,a与b相乘,再乘运算的每次次数(第一次乘1,第二次乘2,依次类推)。最后再加上用户名的长度,全部累加起来。对累加结果取十进制再减去29a(十进制666),灰色ok按钮即为可用。
[Asm] 纯文本查看 复制代码
00442A42    53              push    ebx[/align][align=left]00442A43    56              push    esi
00442A44    8955 F8         mov     dword ptr ss:[ebp-0x8], edx      ; 假码放在 地址 [0018F310]=0018F498 中
00442A47    8945 FC         mov     dword ptr ss:[ebp-0x4], eax      ; 用户名放在地址 [0018F314]=002423D0 中
00442A4A    8B45 FC         mov     eax, dword ptr ss:[ebp-0x4]
00442A4D    E8 9611FCFF     call    aLoNg3x_.00403BE8
00442A52    8B45 F8         mov     eax, dword ptr ss:[ebp-0x8]
00442A55    E8 8E11FCFF     call    aLoNg3x_.00403BE8
00442A5A    33C0            xor     eax, eax
00442A5C    55              push    ebp
00442A5D    68 E52A4400     push    aLoNg3x_.00442AE5
00442A62    64:FF30         push    dword ptr fs:[eax]
00442A65    64:8920         mov     dword ptr fs:[eax], esp
00442A68    8B45 FC         mov     eax, dword ptr ss:[ebp-0x4]
00442A6B    E8 C40FFCFF     call    aLoNg3x_.00403A34
00442A70    83F8 05         cmp     eax, 0x5                         ; 用户名大于5位
00442A73    7E 53           jle     short aLoNg3x_.00442AC8
00442A75    8B45 FC         mov     eax, dword ptr ss:[ebp-0x4]
00442A78    E8 B70FFCFF     call    aLoNg3x_.00403A34
00442A7D    8BD8            mov     ebx, eax
00442A7F    8B45 FC         mov     eax, dword ptr ss:[ebp-0x4]
00442A82    E8 AD0FFCFF     call    aLoNg3x_.00403A34
00442A87    8BD0            mov     edx, eax
00442A89    4A              dec     edx
00442A8A    85D2            test    edx, edx
00442A8C    7E 20           jle     short aLoNg3x_.00442AAE
00442A8E    B8 01000000     mov     eax, 0x1                         ; eax 初始化1
00442A93    8B4D FC         mov     ecx, dword ptr ss:[ebp-0x4]      ; 用户名给ecx
00442A96    0FB64C01 FF     movzx   ecx, byte ptr ds:[ecx+eax-0x1]   ; 取用户名每一位十六进制给ecx
00442A9B    8B75 FC         mov     esi, dword ptr ss:[ebp-0x4]      ; 用户名给esi
00442A9E    0FB63406        movzx   esi, byte ptr ds:[esi+eax]       ; 从用户名第二位开始取每一位的十六进制给esi
00442AA2    0FAFCE          imul    ecx, esi                         ; ecx=ecx*esi 用户名两位十六进制相乘
00442AA5    0FAFC8          imul    ecx, eax                         ; ecx=ecx*eax  ecx乘以运算次数
00442AA8    03D9            add     ebx, ecx                         ; ebx=ebx+ecx  ecx加用户名长度,全部累加起来
00442AAA    40              inc     eax                              ; eax+1 取下一位
00442AAB    4A              dec     edx                              ; edx-1用户名后移一位
00442AAC  ^ 75 E5           jnz     short aLoNg3x_.00442A93
00442AAE    8B45 F8         mov     eax, dword ptr ss:[ebp-0x8]      ; 假码给eax
00442AB1    E8 BA4BFCFF     call    aLoNg3x_.00407670                ; 取假码十六进制 给eax
00442AB6    2BD8            sub     ebx, eax                         ; ebx-eax 用户名计算结果和假码十六进制相减 判断
00442AB8    81FB 9A020000   cmp     ebx, 0x29A                       ; 判断相减的结果是否等于29a,不等ok 按钮为不可以,相等就可用,要相等,这里的真码就是用户名运算结果减去29a
00442ABE    75 04           jnz     short aLoNg3x_.00442AC4          ;(关键跳)这里也可以nop,或者 改为jz,ok按钮即为可用。
00442AC0    B3 01           mov     bl, 0x1
00442AC2    EB 06           jmp     short aLoNg3x_.00442ACA
接下来,知道了使灰色ok按钮变为可用按钮的算法,由此得到正确的注册码,重新运行输入计算出的注册码,点击注册,段在下面这里:
[Asm] 纯文本查看 复制代码
00442D64    55              push    ebp
00442D65    8BEC            mov     ebp, esp
00442D67    6A 00           push    0x0
00442D69    53              push    ebx
00442D6A    8BD8            mov     ebx, eax
00442D6C    33C0            xor     eax, eax
00442D6E    55              push    ebp
00442D6F    68 ED2D4400     push    aLoNg3x_.00442DED
00442D74    64:FF30         push    dword ptr fs:[eax]
00442D77    64:8920         mov     dword ptr fs:[eax], esp
00442D7A    8B83 D0020000   mov     eax, dword ptr ds:[ebx+0x2D0]
00442D80    8078 47 01      cmp     byte ptr ds:[eax+0x47], 0x1      ; 这里有个关键值[eax+0x47]=1和1比较 相等不跳,导致失败 ,这里要跳过[eax+0x47]=0即可,不知道这个值来之哪里
00442D84    75 12           jnz     short aLoNg3x_.00442D98          ; 这里很关键,找了几圈,发现不跳不过这里,程序追不到下一步算法,ok按钮虽然可以,但是无法隐藏,于是就强行跳过这里,来到关键call
00442D86    BA 002E4400     mov     edx, aLoNg3x_.00442E00           ; UNICODE "0"
00442D8B    8B83 E0020000   mov     eax, dword ptr ds:[ebx+0x2E0]
00442D91    E8 5A05FEFF     call    aLoNg3x_.004232F0
00442D96    EB 3F           jmp     short aLoNg3x_.00442DD7
00442D98    8D55 FC         lea     edx, dword ptr ss:[ebp-0x4]
00442D9B    8B83 E0020000   mov     eax, dword ptr ds:[ebx+0x2E0]
00442DA1    E8 1A05FEFF     call    aLoNg3x_.004232C0                ; 取假码长度
00442DA6    8B45 FC         mov     eax, dword ptr ss:[ebp-0x4]      ; 假码给eax
00442DA9    E8 C248FCFF     call    aLoNg3x_.00407670                ; 取假码十六进制 给eax
00442DAE    50              push    eax                              ; 压入十六进制
00442DAF    8D55 FC         lea     edx, dword ptr ss:[ebp-0x4]      ; 假码十进制给地址edx
00442DB2    8B83 DC020000   mov     eax, dword ptr ds:[ebx+0x2DC]
00442DB8    E8 0305FEFF     call    aLoNg3x_.004232C0                ; 取用户名长度
00442DBD    8B45 FC         mov     eax, dword ptr ss:[ebp-0x4]      ; 用户名给eax
00442DC0    5A              pop     edx                              ; 弹出假码十六进制
00442DC1    E8 DAFDFFFF     call    aLoNg3x_.00442BA0                ; 关键call
00442DC6    84C0            test    al, al                           ;上面关键call 运算完后 返回给al
00442DC8    74 0D           je      short aLoNg3x_.00442DD7          ;关键跳,相等就跳

进入关键call ,00442DC1    E8 DAFDFFFF     call    aLoNg3x_.00442BA0,在这里浪费的时间最多,代码如下:因为追出了程序用我们输入的用户名计算出了注册码,使ok按钮可用,又用计算出的注册码推算出了一个用户名,其算法:取计算出ok按钮可用的注册码每一位十六进制,程序是从后往前取,跟了几次发现,也可以从前往后取,这样总结算法比较简单,分别取计算出的注册码的每一位十六进制的平方,再乘以计算的位次,第一次乘1,第二次乘2,依次类推,然后在除以19,取余数加41,对其结果转化成字符,最后按顺序,每一位连接一起,形成一串字符,就是推算出的用户名。但是这个用户名和注册码输入进去,点击ok按钮没有任何反应,不能达到隐藏,还是失败,于是输入推算出的用户名和注册码,断到刚输入用户名的代码出,就是文章,第一段代码出,发现又计算出一串注册码,怎么好像是没头没尾,这怎么搞,转了好几圈,最后实在没有办法,在此冷静一下。
[Asm] 纯文本查看 复制代码
00442BA3    6A 00           push    0x0
00442BA5    6A 00           push    0x0
00442BA7    6A 00           push    0x0
00442BA9    53              push    ebx
00442BAA    56              push    esi
00442BAB    8BF2            mov     esi, edx                         ; esi=edx 假码十六进制
00442BAD    8945 FC         mov     dword ptr ss:[ebp-0x4], eax      ; 用户名给 地址 [0018F5BC]=00000000
00442BB0    8B45 FC         mov     eax, dword ptr ss:[ebp-0x4]
00442BB3    E8 3010FCFF     call    aLoNg3x_.00403BE8
00442BB8    33C0            xor     eax, eax                         ; eax清零
00442BBA    55              push    ebp
00442BBB    68 672C4400     push    aLoNg3x_.00442C67
00442BC0    64:FF30         push    dword ptr fs:[eax]
00442BC3    64:8920         mov     dword ptr fs:[eax], esp
00442BC6    33DB            xor     ebx, ebx                         ; ebx清零
00442BC8    8D55 F8         lea     edx, dword ptr ss:[ebp-0x8]
00442BCB    8BC6            mov     eax, esi                         ; eax=esi 假码十六进制
00442BCD    E8 6E4AFCFF     call    aLoNg3x_.00407640                ; ecx 取假码十六进制 eax地址放入假码十进制
00442BD2    8D45 F4         lea     eax, dword ptr ss:[ebp-0xC]
00442BD5    8B55 F8         mov     edx, dword ptr ss:[ebp-0x8]      ; 假码给edx
00442BD8    E8 730CFCFF     call    aLoNg3x_.00403850
00442BDD    8B45 F8         mov     eax, dword ptr ss:[ebp-0x8]      ; 假码给eax
00442BE0    E8 4F0EFCFF     call    aLoNg3x_.00403A34                ; 取假码长度
00442BE5    83F8 05         cmp     eax, 0x5                         ; 和5比较,说明假码要大于5位
00442BE8    7E 60           jle     short aLoNg3x_.00442C4A          ; 如果假码小于等于5,就跳走了
00442BEA    8B45 F8         mov     eax, dword ptr ss:[ebp-0x8]      ; 假码给eax
00442BED    E8 420EFCFF     call    aLoNg3x_.00403A34                ; 取假码长度
00442BF2    8BF0            mov     esi, eax                         ; esi=eax 等于假码长度
00442BF4    83FE 01         cmp     esi, 0x1                         ; 判断是否输入假码
00442BF7    7C 2F           jl      short aLoNg3x_.00442C28
00442BF9    8D45 F4         lea     eax, dword ptr ss:[ebp-0xC]      ; 假码放入eax 地址
00442BFC    E8 0310FCFF     call    aLoNg3x_.00403C04
00442C01    8D4430 FF       lea     eax, dword ptr ds:[eax+esi-0x1]
00442C05    50              push    eax
00442C06    8B45 F8         mov     eax, dword ptr ss:[ebp-0x8]      ; 假码给eax
00442C09    0FB64430 FF     movzx   eax, byte ptr ds:[eax+esi-0x1]   ; 从假码最后面一位向前逐位取十六进制给eax
00442C0E    F7E8            imul    eax                              ; eax=eax*eax
00442C10    0FBFC0          movsx   eax, ax                          ; eax为相乘结果
00442C13    F7EE            imul    esi                              ; eax=eax*esi esi是假码计算剩余次数
00442C15    B9 19000000     mov     ecx, 0x19                        ; 19 给ecx
00442C1A    99              cdq
00442C1B    F7F9            idiv    ecx                              ; eax除以ecx(19)商放在eax 余数在edx
00442C1D    83C2 41         add     edx, 0x41                        ; edx=edx+41 余数加41 取十六进制 再转化成字符,每次运算结果都转化成一个字符
00442C20    58              pop     eax
00442C21    8810            mov     byte ptr ds:[eax], dl
00442C23    4E              dec     esi                              ; esi-1
00442C24    85F6            test    esi, esi
00442C26  ^ 75 D1           jnz     short aLoNg3x_.00442BF9
00442C28    8B45 F4         mov     eax, dword ptr ss:[ebp-0xC]      ; 运算完后转化成字符串给eax ,用注册码运算出一个用户名
00442C2B    8B55 FC         mov     edx, dword ptr ss:[ebp-0x4]      ; 我们输入的用户名给edx
00442C2E    E8 110FFCFF     call    aLoNg3x_.00403B44                ; 比较call,看两个用户名是否相等,不能就跳走,于是复制计算出的用户名和计算出的注册码试了试,仍然失败不能隐藏ok按钮
00442C33    75 17           jnz     short aLoNg3x_.00442C4C          ; 不等就调走
00442C35    8B45 FC         mov     eax, dword ptr ss:[ebp-0x4]
00442C38    8B55 F4         mov     edx, dword ptr ss:[ebp-0xC]
00442C3B    E8 040FFCFF     call    aLoNg3x_.00403B44
00442C40    75 04           jnz     short aLoNg3x_.00442C46
00442C42    B3 01           mov     bl, 0x1

最后想来想去,因为程序要求破解后,使ok按钮和清除按钮 两个按钮都达到隐藏,索性先放下ok按钮,取看看清除按钮怎么隐藏,来到下面代码:
[Asm] 纯文本查看 复制代码
00442EA8    55              push    ebp
00442EA9    8BEC            mov     ebp, esp
00442EAB    6A 00           push    0x0
00442EAD    53              push    ebx
00442EAE    8BD8            mov     ebx, eax
00442EB0    33C0            xor     eax, eax
00442EB2    55              push    ebp
00442EB3    68 322F4400     push    aLoNg3x_.00442F32
00442EB8    64:FF30         push    dword ptr fs:[eax]
00442EBB    64:8920         mov     dword ptr fs:[eax], esp
00442EBE    8D55 FC         lea     edx, dword ptr ss:[ebp-0x4]
00442EC1    8B83 E0020000   mov     eax, dword ptr ds:[ebx+0x2E0]
00442EC7    E8 F403FEFF     call    aLoNg3x_.004232C0                ; 取假码长度
00442ECC    8B45 FC         mov     eax, dword ptr ss:[ebp-0x4]      ; 假码给eax
00442ECF    E8 9C47FCFF     call    aLoNg3x_.00407670                ; 取假码十六进制给eax
00442ED4    50              push    eax                              ; 压入十六进制
00442ED5    8D55 FC         lea     edx, dword ptr ss:[ebp-0x4]
00442ED8    8B83 DC020000   mov     eax, dword ptr ds:[ebx+0x2DC]
00442EDE    E8 DD03FEFF     call    aLoNg3x_.004232C0                ; 取用户名长度
00442EE3    8B45 FC         mov     eax, dword ptr ss:[ebp-0x4]      ; 用户名给eax
00442EE6    5A              pop     edx                              ; edx 弹出 假码十六进制
00442EE7    E8 08FCFFFF     call    aLoNg3x_.00442AF4                ; 关键call  清除按钮隐藏 算法,计算完后返回给al
00442EEC    84C0            test    al, al
00442EEE    74 1C           je      short aLoNg3x_.00442F0C

进入关键call,00442EE7    E8 08FCFFFF     call    aLoNg3x_.00442AF4 ,来到如下代码:得到清除按钮隐藏的注册码算法:取用户名第五位十六进制除以7取余数加2,对结果求阶乘,然后取用户名每一位十六进制值乘以前面阶乘的结果,最后全部累加起来,累加值再减去7a96,就是隐藏清除按钮的注册码,经测试成功。
[Asm] 纯文本查看 复制代码
00442AF4    55              push    ebp
00442AF5    8BEC            mov     ebp, esp
00442AF7    83C4 F8         add     esp, -0x8
00442AFA    53              push    ebx
00442AFB    56              push    esi
00442AFC    8955 F8         mov     dword ptr ss:[ebp-0x8], edx      ; 假码十六进制放在 地址 [0018F5B8]=0018F754 里
00442AFF    8945 FC         mov     dword ptr ss:[ebp-0x4], eax      ; 用户名放在地址 [0018F5BC]=01D123D0 里
00442B02    8B45 FC         mov     eax, dword ptr ss:[ebp-0x4]
00442B05    E8 DE10FCFF     call    aLoNg3x_.00403BE8
00442B0A    33C0            xor     eax, eax                         ; eax 清零
00442B0C    55              push    ebp
00442B0D    68 902B4400     push    aLoNg3x_.00442B90
00442B12    64:FF30         push    dword ptr fs:[eax]
00442B15    64:8920         mov     dword ptr fs:[eax], esp
00442B18    8B45 FC         mov     eax, dword ptr ss:[ebp-0x4]      ; 用户名给eax
00442B1B    E8 140FFCFF     call    aLoNg3x_.00403A34                ; 取用户名长度
00442B20    83F8 05         cmp     eax, 0x5                         ; 用户长度和5比较,用户名必须大于5,小于等于10
00442B23    7E 53           jle     short aLoNg3x_.00442B78          ; 小于5就挂
00442B25    8B45 FC         mov     eax, dword ptr ss:[ebp-0x4]      ; 用户名给eax
00442B28    0FB640 04       movzx   eax, byte ptr ds:[eax+0x4]       ; 取用户名第5位十六进制给eax
00442B2C    B9 07000000     mov     ecx, 0x7                         ; ecx 赋值 7
00442B31    33D2            xor     edx, edx                         ; edx 清零
00442B33    F7F1            div     ecx                              ; eax=eax/ecx ,ecx(7),余数放在edx
00442B35    8BC2            mov     eax, edx                         ; eax=edx 等于余数
00442B37    83C0 02         add     eax, 0x2                         ; eax=eax+2
00442B3A    E8 E1FEFFFF     call    aLoNg3x_.00442A20                ;一个关键call,对eax结果求阶乘
00442B3F    8BF0            mov     esi, eax                         ; esi=eax
00442B41    33DB            xor     ebx, ebx                         ; ebx清零
00442B43    8B45 FC         mov     eax, dword ptr ss:[ebp-0x4]      ; 用户名给eax
00442B46    E8 E90EFCFF     call    aLoNg3x_.00403A34                ; 取用户名长度 到eax
00442B4B    85C0            test    eax, eax
00442B4D    7E 16           jle     short aLoNg3x_.00442B65
00442B4F    BA 01000000     mov     edx, 0x1                         ; edx 初始 为1
00442B54    8B4D FC         mov     ecx, dword ptr ss:[ebp-0x4]      ; 用户名给ecx
00442B57    0FB64C11 FF     movzx   ecx, byte ptr ds:[ecx+edx-0x1]   ; 取用户名取每一位十六进制给ecx
00442B5C    0FAFCE          imul    ecx, esi                         ; ecx=ecx*esi
00442B5F    03D9            add     ebx, ecx                         ; ebx=ebx+ecx 全部累加再ebx 中
00442B61    42              inc     edx                              ; edx+1 用户名取下一位
00442B62    48              dec     eax                              ; eax-1 用户名后移一位
00442B63  ^ 75 EF           jnz     short aLoNg3x_.00442B54
00442B65    2B5D F8         sub     ebx, dword ptr ss:[ebp-0x8]      ; ebx=ebx-我输入假码的十六进制结果,来判断是否等于7a96,这里就可以看出真码就是 ebx-7a96
00442B68    81FB 697A0000   cmp     ebx, 0x7A69                      ; ebx 和 7a69 比较,不等就跳,清除按钮就无法隐藏,相等就成功,清除按钮隐藏
00442B6E    75 04           jnz     short aLoNg3x_.00442B74

最后隐藏了清除按钮后,试了好几遍,终于发现,当先执行隐藏清除按钮后,ok按钮由灰色变为可用,于是就输入用户名和计算出的注册码,运行还是不行,抱着试试的态度,都搞不懂了,然后,就将用户计算出的注册码推算的用户名复制到程序用户名处,将计算出的注册码复制到程序注册码出,点击ok,往下走,来到一下代码,突然恍然大悟了,[eax+0x47]=0,终于等于零了,说明[eax+0x47]=0的条件是,先将清除按钮隐藏,下来灰色ok按钮,自动变为可用,思路应该正确了,这样一路往下来到00442DC8    74 0D           je      short aLoNg3x_.00442DD7  这里关键跳,ok啦,运行后,ok按钮隐藏。程序完美破解。
[Asm] 纯文本查看 复制代码
00442D64    55              push    ebp
00442D65    8BEC            mov     ebp, esp
00442D67    6A 00           push    0x0
00442D69    53              push    ebx
00442D6A    8BD8            mov     ebx, eax
00442D6C    33C0            xor     eax, eax
00442D6E    55              push    ebp
00442D6F    68 ED2D4400     push    aLoNg3x_.00442DED
00442D74    64:FF30         push    dword ptr fs:[eax]
00442D77    64:8920         mov     dword ptr fs:[eax], esp
00442D7A    8B83 D0020000   mov     eax, dword ptr ds:[ebx+0x2D0]
00442D80    8078 47 01      cmp     byte ptr ds:[eax+0x47], 0x1      ; [eax+0x47]=0即可,现在已经等于0
00442D84    75 12           jnz     short aLoNg3x_.00442D98          ; 这里很关键,找了几圈,发现不跳不过这里,程序追不到下一步算法,ok按钮虽然可以,但是无法隐藏,于是就强行跳过这里,来到关键call
00442D86    BA 002E4400     mov     edx, aLoNg3x_.00442E00           ; UNICODE "0"
00442D8B    8B83 E0020000   mov     eax, dword ptr ds:[ebx+0x2E0]
00442D91    E8 5A05FEFF     call    aLoNg3x_.004232F0
00442D96    EB 3F           jmp     short aLoNg3x_.00442DD7
00442D98    8D55 FC         lea     edx, dword ptr ss:[ebp-0x4]
00442D9B    8B83 E0020000   mov     eax, dword ptr ds:[ebx+0x2E0]
00442DA1    E8 1A05FEFF     call    aLoNg3x_.004232C0                ; 取假码长度
00442DA6    8B45 FC         mov     eax, dword ptr ss:[ebp-0x4]      ; 假码给eax
00442DA9    E8 C248FCFF     call    aLoNg3x_.00407670                ; 取假码十六进制 给eax
00442DAE    50              push    eax                              ; 压入十六进制
00442DAF    8D55 FC         lea     edx, dword ptr ss:[ebp-0x4]      ; 假码十进制给地址edx
00442DB2    8B83 DC020000   mov     eax, dword ptr ds:[ebx+0x2DC]
00442DB8    E8 0305FEFF     call    aLoNg3x_.004232C0                ; 取用户名长度
00442DBD    8B45 FC         mov     eax, dword ptr ss:[ebp-0x4]      ; 用户名给eax
00442DC0    5A              pop     edx                              ; 弹出假码十六进制
00442DC1    E8 DAFDFFFF     call    aLoNg3x_.00442BA0                ; 关键call
00442DC6    84C0            test    al, al                           ;al=1,ok
00442DC8    74 0D           je      short aLoNg3x_.00442DD7          ;终于成功了,往下走,ok按钮隐藏了

到此程序破解完成,全程追出算法.
最后附上注册机及易语言注册机的工程文件 一起交流学习
2019-08-17_175330.jpg
164957xnm8t9zm0imtzjmp.png
164957d7h9q7173z49h83h.png

aLoNg3x.1 注册机 及易语言注册机工程文件.rar

647.16 KB, 下载次数: 63, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 6吾爱币 +5 热心值 +6 收起 理由
抓抓魔法袋 + 1 + 1 自己试试
wws天池 + 1 + 1 用心讨论,共获提升!
满不懂 + 1 + 1 谢谢@Thanks!
jnez112358 + 1 + 1 谢谢@Thanks!
FleTime + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
为海尔而战 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

佚丶名 发表于 2019-8-17 18:44
学习了  自己研究研究
yuwen998 发表于 2019-8-17 20:05
jnez112358 发表于 2019-8-18 07:48
qdntj 发表于 2019-9-2 12:00
高手真是太多了。
 楼主| wbz_007 发表于 2019-9-14 11:54
谢谢老大加精!
zhu0797zhu 发表于 2019-9-17 16:23
高手,厉害
TZ弹指之间 发表于 2019-9-19 01:31
学习了  自己研究研究
claude.chen 发表于 2019-9-25 19:08
感谢分享,学习学习
pulsar 发表于 2019-10-24 13:22
牛人,膜拜,学习!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 14:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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