呵呵~~~~~~~~~~~
大家好~~~~~~~
前几看到了一个CRACKME,就拿来分析了下算法。
大家可能看到过这个CRACKME!!!!!!!!!!!!!!
可能已经有很多人分析过~~~不过我是自己分析出来!!!!
因为好久没有发贴了~
004279FC 4C 41 4E 4E 59 44 49 42 41 4E 44 49 4E 47 49 4E LANNYDIBANDINGINANAKEKHYANGNGENTOT
00428884 4C 41 4E 4E 59 35 36 34 36 35 32 31 LANNY5646521
00427B47 6A 00 PUSH 0
00427B49 6A 00 PUSH 0
00427B4B 53 PUSH EBX
00427B4C 8BD8 MOV EBX,EAX
00427B4E 33C0 XOR EAX,EAX
00427B50 55 PUSH EBP
00427B51 68 FA7B4200 PUSH echap515.00427BFA
00427B56 64:FF30 PUSH DWORD PTR FS:[EAX]
00427B59 64:8920 MOV DWORD PTR FS:[EAX],ESP
00427B5C 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
00427B5F 8B83 DC010000 MOV EAX,DWORD PTR DS:[EBX+1DC]
00427B65 E8 26E2FEFF CALL echap515.00415D90
00427B6A 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00427B6D E8 3EBCFDFF CALL echap515.004037B0
00427B72 48 DEC EAX
00427B73 7C 30 JL SHORT echap515.00427BA5
00427B75 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
00427B78 8B83 EC010000 MOV EAX,DWORD PTR DS:[EBX+1EC]
00427B7E E8 0DE2FEFF CALL echap515.00415D90
00427B83 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00427B86 50 PUSH EAX
00427B87 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8]
00427B8A 8B83 DC010000 MOV EAX,DWORD PTR DS:[EBX+1DC]
00427B90 E8 FBE1FEFF CALL echap515.00415D90
00427B95 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
00427B98 5A POP EDX
00427B99 E8 82FEFFFF CALL echap515.00427A20 ; 关键CALL跟进去
00427B9E 3D 4E61BC00 CMP EAX,0BC614E ; EAX=0X0BC614E就可以注册成功
00427BA3 7D 1E JGE SHORT echap515.00427BC3 ; 关键
00427BA5 6A 00 PUSH 0
00427BA7 68 087C4200 PUSH echap515.00427C08 ; ERROR
00427BAC 68 107C4200 PUSH echap515.00427C10 ; Wrong Serial Number !
00427BB1 A1 44974200 MOV EAX,DWORD PTR DS:[429744]
00427BB6 E8 411EFFFF CALL echap515.004199FC
00427BBB 50 PUSH EAX
00427BBC E8 4FD9FDFF CALL <JMP.&user32.MessageBoxA>
00427BC1 EB 1C JMP SHORT echap515.00427BDF
00427BC3 6A 00 PUSH 0
00427BC5 68 287C4200 PUSH echap515.00427C28 ; Success
00427BCA 68 307C4200 PUSH echap515.00427C30 ; Congratulation ! You've Did It.\rMail Us : ekhmail@egroups.com
00427BCF A1 44974200 MOV EAX,DWORD PTR DS:[429744]
00427BD4 E8 231EFFFF CALL echap515.004199FC
*******************************************************************
00427A28 33C9 XOR ECX,ECX
00427A2A 894D F0 MOV DWORD PTR SS:[EBP-10],ECX
00427A2D 894D F4 MOV DWORD PTR SS:[EBP-C],ECX
00427A30 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX
00427A33 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00427A36 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00427A39 E8 26BFFDFF CALL echap515.00403964
00427A3E 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
00427A41 E8 1EBFFDFF CALL echap515.00403964
00427A46 33C0 XOR EAX,EAX
00427A48 55 PUSH EBP
00427A49 68 2A7B4200 PUSH echap515.00427B2A
00427A4E 64:FF30 PUSH DWORD PTR FS:[EAX]
00427A51 64:8920 MOV DWORD PTR FS:[EAX],ESP
00427A54 33DB XOR EBX,EBX ; EBX清0
00427A56 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; ASCII "wangwei"
00427A59 E8 52BDFDFF CALL echap515.004037B0 ; 取用户名的位数给EAX
00427A5E 8BF0 MOV ESI,EAX ; 把用户名位传给ESI用做下面循环体的参数
00427A60 85F6 TEST ESI,ESI
00427A62 7E 3C JLE SHORT echap515.00427AA0
00427A64 B8 01000000 MOV EAX,1 ; EAX置1
00427A69 8BD0 /MOV EDX,EAX ; EDX=EAX
00427A6B 8B4D FC |MOV ECX,DWORD PTR SS:[EBP-4] ; ASCII "wangwei"
00427A6E 0FB64C11 FF |MOVZX ECX,BYTE PTR DS:[ECX+EDX-1] ; 逐位取用户名的ACSII码给ECX
00427A73 03D9 |ADD EBX,ECX ; EBX初始为0,EBX=EBX+ECX
00427A75 71 05 |JNO SHORT echap515.00427A7C
00427A77 E8 B4AFFDFF |CALL echap515.00402A30
00427A7C C1E3 08 |SHL EBX,8 ; EBX 逻辑左移8位
00427A7F 8B0D 80884200 |MOV ECX,DWORD PTR DS:[428880] ; ASCII "LANNYDIBANDINGINANAKEKHYANGNGENTOT"
00427A85 0FB65411 FF |MOVZX EDX,BYTE PTR DS:[ECX+EDX-1] ; 逐位字符列表中的ACSSII码给EDX
00427A8A 0BDA |OR EBX,EDX ; EBX=EBX^EDX
00427A8C 85DB |TEST EBX,EBX ; --------------->
00427A8E 7D 0C |JGE SHORT echap515.00427A9C ; 确保EBX的值不为负
00427A90 6BD3 FF |IMUL EDX,EBX,-1 ; <-------------------
00427A93 71 05 |JNO SHORT echap515.00427A9A
00427A95 E8 96AFFDFF |CALL echap515.00402A30
00427A9A 8BDA |MOV EBX,EDX
00427A9C 40 |INC EAX ; EAX++
00427A9D 4E |DEC ESI ; ESI--
00427A9E ^ 75 C9 \JNZ SHORT echap515.00427A69
00427AA0 81F3 78563412 XOR EBX,12345678 ; 经上面循环体得到的EBX^0X12345678
00427AA6 8D55 F0 LEA EDX,DWORD PTR SS:[EBP-10]
00427AA9 8BC3 MOV EAX,EBX
00427AAB E8 44E9FDFF CALL echap515.004063F4 ; 这个CALL作用是把EBX的16进制的数转化为10进数
00427AB0 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10] ; ASCII "998964017"
00427AB3 E8 F8BCFDFF CALL echap515.004037B0 ; 这个CALL是计算10进制数有几位数把给了EAX
00427AB8 8BF0 MOV ESI,EAX ; EAX存的是10进制的位数,传给ESI让它做下面循环体控制参数
00427ABA 85F6 TEST ESI,ESI
00427ABC 7E 38 JLE SHORT echap515.00427AF6
00427ABE 8BC3 /MOV EAX,EBX ; 把上面循环体得的EBX的值给EAX
00427AC0 B9 0A000000 |MOV ECX,0A ; ECX置0X0A
00427AC5 99 |CDQ ; EDX清0
00427AC6 F7F9 |IDIV ECX ; EAX/0X0A
00427AC8 6215 3C7B4200 |BOUND EDX,QWORD PTR DS:[427B3C]
00427ACE 8A92 84884200 |MOV DL,BYTE PTR DS:[EDX+428884] ; EAX/0X0A得到的佘数做为取出密码列表中的字符的参数用
00427AD4 8D45 F0 |LEA EAX,DWORD PTR SS:[EBP-10]
00427AD7 E8 FCBBFDFF |CALL echap515.004036D8
00427ADC 8B55 F0 |MOV EDX,DWORD PTR SS:[EBP-10]
00427ADF 8D45 F4 |LEA EAX,DWORD PTR SS:[EBP-C]
00427AE2 E8 D1BCFDFF |CALL echap515.004037B8
00427AE7 8BC3 |MOV EAX,EBX ; EAX=EBX
00427AE9 B9 0A000000 |MOV ECX,0A ; ECX置0X0A
00427AEE 99 |CDQ ; EDX清0
00427AEF F7F9 |IDIV ECX ; EAX/0X0A
00427AF1 8BD8 |MOV EBX,EAX ; EAX/0X0A得到的整数部分给EBX做下次循环
00427AF3 4E |DEC ESI ; ESI--
00427AF4 ^ 75 C8 \JNZ SHORT echap515.00427ABE
00427AF6 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
00427AF9 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
00427AFC E8 BFBDFDFF CALL echap515.004038C0 ; 这个相当strcmp
00427B01 75 07 JNZ SHORT echap515.00427B0A ; 用户名算出的注册码和我们输入的注册码相不实现
00427B03 BB 4E61BC00 MOV EBX,0BC614E ; EBX就置了0X0BC614E
00427B08 EB 05 JMP SHORT echap515.00427B0F
00427B0A BB 91D61200 MOV EBX,12D691
00427B0F 33C0 XOR EAX,EAX
00427B11 5A POP EDX
00427B12 59 POP ECX
00427B13 59 POP ECX
00427B14 64:8910 MOV DWORD PTR FS:[EAX],EDX
00427B17 68 317B4200 PUSH echap515.00427B31
00427B1C 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
00427B1F BA 04000000 MOV EDX,4
00427B24 E8 2FBAFDFF CALL echap515.00403558
00427B29 C3 RETN
00427B2A ^ E9 A9B4FDFF JMP echap515.00402FD8
00427B2F ^ EB EB JMP SHORT echap515.00427B1C
00427B31 8BC3 MOV EAX,EBX ;这实现EAX=EBX=0X0BC614E~~~~~
00427B33 5E POP ESI
00427B34 5B POP EBX
00427B35 8BE5 MOV ESP,EBP
00427B37 5D POP EBP
00427B38 C3 RETN
############################################################################
呵呵我就来说说这个CRACKME的算法吧!!!
1.作者在CRACKME中设置了两个字符串列表A B,一个字符串列表A和我们输入用户名进行运算.
2.在把字符串列表A和我们输入用户名进行运算得到的16进制数转化10进制数,计算出这个10进制数的位数。用作循环取密码列表B中字符的参数。
3.把我们字符串列表A和我们输入用户名进行运算的结果/0X0A的佘数N作为从字符列表B取出第N位的字符。10进制数的位数用作了控制从字符列表B取多少个字符。
c++算法注册机的代码
#include <iostream>
using namespace std;
void main()
{
char a[10]; //用来接收用户名的!!
char b[]="LANNYDIBANDINGINANAKEKHYANGNGENTOT"; //这组字符串是用来参加和用户名的运算的!
char c[]="LANNY5646521"; //这组字符串是密码表。注册码中的字符就从这个表中取出的!!
cout<<"请输入用户名"<<endl;
cin>>a; //接收用户名!!!
int i,d,e,f=0,g,m,w=0; //设置变量
d=strlen(a); //取用户名的位数
for(i=0;i<d;i++) //把用户名的位数做为控制这个FOR的次数
{
f=f+a; //用户名的字符加F变量中的值!!!
f=f<<8; //逻辑左移8位!!!
f=f|b; //得的结果和固定字符串相逻辑或
if(f<0)f=-f; //--------->保证结果是大于0的数
else f=f; //<-------------
}
m=f=f^0X12345678; //上次运算的结果逻辑异或 0X12345678!!!
cout<<f<<endl; //这个输出我是用来看看结果是否和OD中运算出的一样!!!
while(m>0) //----------->
{ //这个是用来计算我们算的结果转化为10进制数后
m=m/0X0A; //有多少位数。它的位数要参加下面代码 的运算
w++; //用来控下个FOR的运算次数。
} //<-----------------
cout<<w<<endl; //呵呵这个也用来测试的!!!
for(g=0;g<w;g++)
{
e=f%0X0A; //取佘数
f=f/0X0A; //把/0经0A的结果给F用做个次运算!!
cout<<c[e]; //
}
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
上传的附件: