本帖最后由 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 事件到地址转换工具 查找按钮事件,由于发现此程序在输入用户名时有可能已经计算注册码,所以只有数入正确的注册码,灰色按钮才可以,于是载入工具找到输入用户名的代码地址和清除按钮事件的代码地址:如下
程序载入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按钮隐藏了
到此程序破解完成,全程追出算法.
最后附上注册机及易语言注册机的工程文件 一起交流学习
|