附件:crackme.rar
这个是 BCG 早期的 会员认证 Crackme ~
我好后悔,我要是早点过来,不也能进 BCG 啦~
可惜~
分析下算发吧~
004010C3 . 50 push eax ; 取用户名
004010C4 . E8 67050000 call crackme.00401630
004010C9 . 59 pop ecx ;
004010CA . 8945 D8 mov dword ptr ss:[ebp-28],eax ;
004010CD . 8D95 E4FEFFFF lea edx,dword ptr ss:[ebp-11C] ; edx=注册蚂
004010D3 . 52 push edx
004010D4 . E8 57050000 call crackme.00401630
004010D9 . 59 pop ecx
004010DA . 68 EAB04000 push crackme.0040B0EA
004010DF . E8 4C050000 call crackme.00401630
004010E4 . 59 pop ecx
004010E5 . 68 0EB14000 push crackme.0040B10E
004010EA . E8 41050000 call crackme.00401630
004010EF . 59 pop ecx
004010F0 . 837D D8 03 cmp dword ptr ss:[ebp-28],3
004010F4 . 7E 7B jle short crackme.00401171 ; 用户名大于三
004010F6 . 33C9 xor ecx,ecx
004010F8 . 33D2 xor edx,edx
004010FA . 33DB xor ebx,ebx
004010FC . 33C0 xor eax,eax
004010FE . 837D D8 32 cmp dword ptr ss:[ebp-28],32
00401102 . 7D 69 jge short crackme.0040116D ; 小雨50,不然给你好看
00401104 > 0FBE840D 48FFFFF>movsx eax,byte ptr ss:[ebp+ecx-B8] ; 依次去用户名
0040110C . 41 inc ecx
0040110D . 33C1 xor eax,ecx ; eax=eax+i
0040110F . 03D8 add ebx,eax ; ebx=ebx+eax
00401111 . 3B4D D8 cmp ecx,dword ptr ss:[ebp-28] ; 循环取用户名 next i
00401114 .^ 75 EE jnz short crackme.00401104
00401116 . 69C0 56030000 imul eax,eax,356 ; eax=eax*356
0040111C . C1E3 08 shl ebx,8 左移8为 等于 乘以 FF
0040111F . C1E8 08 shr eax,8 右移8位 (明白但是不知道改怎么解释好!)
00401122 . 90 nop
00401123 . 90 nop
00401124 . 03C3 add eax,ebx ; eax=eax+ebx
00401126 . 8945 C8 mov dword ptr ss:[ebp-38],eax ; zhi 写入到 eb--38
00401129 . FF75 C8 push dword ptr ss:[ebp-38] ; /Arg3
0040112C . 68 38B44000 push crackme.0040B438 ; |Arg2 = 0040B438 ASCII "%lX"
00401131 . 8D8D 80FEFFFF lea ecx,dword ptr ss:[ebp-180] ; |
00401137 . 51 push ecx ; |Arg1
00401138 . E8 873D0000 call crackme.00404EC4 ; \crackme.00404EC4
0040113D . 83C4 0C add esp,0C
00401140 . 8D85 80FEFFFF lea eax,dword ptr ss:[ebp-180]
00401146 . 50 push eax 看到这里你也知道注册码是什么了吧
00401147 . 8D95 E4FEFFFF lea edx,dword ptr ss:[ebp-11C] ; |
0040114D . 52 push edx ; |String1
0040114E . E8 339C0000 call <jmp.&KERNEL32.lstrcmpA> ; \lstrcmpA 好像是以字符输入吧
00401153 . 85C0 test eax,eax
00401155 . /75 0D jnz short crackme.00401164
00401157 . |68 3CB44000 push crackme.0040B43C ; /Text = "革命已然成功,加入BCG后更需努力 ^_^"
0040115C . |56 push esi ; |hWnd
0040115D . |E8 289B0000 call <jmp.&USER32.SetWindowTextA> ; \SetWindowTextA
00401162 . |EB 18 jmp short crackme.0040117C
00401164 > \68 90B44000 push crackme.0040B490
00401169 . 56 push esi
0040116A E8 db E8
0040116B 1B db 1B
0040116C . 9B wait
0040116D . 0000 add byte ptr ds:[eax],al
0040116F . EB 0B jmp short crackme.0040117C
00401171 > 68 C9B44000 push crackme.0040B4C9 ; /Text = "注册名必须在4个字符以上,50个字符以下!"
00401176 . 56 push esi ; |hWnd
00401177 . E8 0E9B0000 call <jmp.&USER32.SetWindowTextA> ; \SetWindowTextA
有余本人第一次玩算法分析。加上自己编程有不会,马马虎虎用 VB 硬着头皮屑垃~
l=len(user) 取用户名长度
if 50>L>3 then 用户名 在3-50之间
for i=1 to l
m=asc(mid(user,i,1))
m=m+i
key1=key1+m
next i
下面的我就不会翻译了,那位高手用VB 教我一点好了~
现在的 EBX =Key1
shl ebx,8 (假设他运算的结果是十六进制 p1)
现在的 Key2 =eax
shr eax,8 (假设他运算的结果是十六进制 p2)
sn=p1+p2 (注册码就是 p1+p2)
丢人吧~
算法都分析出来了,但是不会写程序,晕~。
指点下来~
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)