【破文作者】 大菜一号>.<
【 crack 】
【破解难度】 简单,献给像我等这样的菜鸟学习
【作者邮箱】 kkxlnbukn@126.com
【使用工具】 ollydbg
【破解平台】 WinXP
偶学了汇编和C之后`破解就非常容易上手了!一上午狂分析十几个crack。。虽然没有每个都写出注册机`但每个都解决了!(头昏脑胀!倒床不起~)
挑了个有注册机,的简单变形算法写了篇破文``
这个crack有大虾破过了~~偶可没看答案!(跪下。。)相信偶呀5555555555哇55。。`。`。
上次版主说不够详细,,所以偶这次打字打得手麻(感谢笨笨雄版主恩典。)`````。。
特意把新手们很不理解的地方都说出来(只要偶这个新手知道。。:))
根据查找字符串``我们将断点设在这里:
004014CE |. 894D E0 mov dword ptr ss:[ebp-20],ecx
(为啥要断在这里??)
查找到错误信息后,向上找跳转,在OD里面向上找第一个如这样:
0040151C |. E9 A2000000 jmp crackme3.004015C3
00401521 | (>)<=这个``就会知道是从哪里跳到这里的了,点下后顺红线向上找。找到后那就是关键跳转,就断在其前面(不是前一个代码),靠自己判断,断一次不对再重新来,(没人追杀你``可以慢慢来) 8B45 E0 mov eax,dword ptr ss:[ebp-20]
00401524 |. 05 E0000000 add eax,0E0
00401529 |. 50 push eax
断下后往下看``可以很容易看到很经典的变形``下面分析:
先看这里`
004014CE |. 894D E0 mov dword ptr ss:[ebp-20],ecx
004014D1 |. 8D4D E4 lea ecx,dword ptr ss:[ebp-1C]
004014D4 |. E8 83030000 call <jmp.&MFC42.#540><======================取name;(别问怎么知道`自己跟下啦`别比我还懒)
004014D9 |. C745 FC 00000>mov dword ptr ss:[ebp-4],0
004014E0 |. 8D4D F0 lea ecx,dword ptr ss:[ebp-10]
004014E3 |. E8 74030000 call <jmp.&MFC42.#540>
004014E8 |. C645 FC 01 mov byte ptr ss:[ebp-4],1
004014EC |. 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
004014EF |. 81C1 A0000000 add ecx,0A0
004014F5 |. E8 AA030000 call <jmp.&MFC42.#3876><=====================取name长度(同上)汗..
004014FA |. 8945 EC mov dword ptr ss:[ebp-14],eax
004014FD |. 837D EC 05 cmp dword ptr ss:[ebp-14],5<=================name长度与5比较
00401501 |. 7F 05 jg short crackme3.00401508<==================大于5就跳``不跳就玩完!!
00401503 |. E9 BB000000 jmp crackme3.004015C3
00401508 |> 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
0040150B |. 83C1 60 add ecx,60
0040150E |. E8 91030000 call <jmp.&MFC42.#3876><=====================取假码长度
00401513 |. 8945 E8 mov dword ptr ss:[ebp-18],eax
00401516 |. 837D E8 05 cmp dword ptr ss:[ebp-18],5<=================假码长度与5比较
0040151A |. 7F 05 jg short crackme3.00401521<==================大于5就跳``不跳geme over!
0040151C |. E9 A2000000 jmp crackme3.004015C3
00401521 |> 8B45 E0 mov eax,dword ptr ss:[ebp-20]
00401524 |. 05 E0000000 add eax,0E0
00401529 |. 50 push eax
0040152A |. 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
0040152D |. 81C1 A0000000 add ecx,0A0
00401533 |. E8 66030000 call <jmp.&MFC42.#3874>
00401538 |. 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
0040153B |. 81C1 E4000000 add ecx,0E4
00401541 |. 51 push ecx
00401542 |. 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
00401545 |. 83C1 60 add ecx,60
00401548 |. E8 51030000 call <jmp.&MFC42.#3874>
0040154D |. 8B55 E0 mov edx,dword ptr ss:[ebp-20]
00401550 |. 81C2 E0000000 add edx,0E0
00401556 |. 52 push edx
00401557 |. 8D4D E4 lea ecx,dword ptr ss:[ebp-1C]
0040155A |. E8 39030000 call <jmp.&MFC42.#858>
0040155F |. 8B45 E0 mov eax,dword ptr ss:[ebp-20]
00401562 |. 05 E4000000 add eax,0E4
00401567 |. 50 push eax
00401568 |. 8D4D F0 lea ecx,dword ptr ss:[ebp-10]
0040156B |. E8 28030000 call <jmp.&MFC42.#858>
00401570 |. 33C0 xor eax,eax-------------------------------------------
00401572 |. 33DB xor ebx,ebx |
00401574 |. 33C9 xor ecx,ecx 全清零,,准备变形
00401576 |. B9 01000000 mov ecx,1 | <=================================
0040157B |. 33D2 xor edx,edx------------------------------------------- 转|
0040157D |. 8B45 E4 mov eax,dword ptr ss:[ebp-1C] |
|
以下为name变形: |
|
0040157D |. 8B45 E4 mov eax,dword ptr ss:[ebp-1C]<==============把name传到eax |
00401580 |> 8A18 /mov bl,byte ptr ds:[eax]------ <==========================取name第一个字符 |
00401582 |. 32D9 |xor bl,cl | <==========================将其ascii的十六进制与cl异或,(cl)=1h,
00401584 |. 8818 |mov byte ptr ds:[eax],bl | <==========================结果传到ds:[eax]首字节,(OD)跟时可以下d 00373a58看到
00401586 |. 41 |inc ecx 变形 <==========================ecx+1(主要是为上面变形准备,下次则与2h异或.....)
00401587 |. 40 |inc eax | <==========================eax+1(主要是控制次数)
00401588 |. 8038 00 |cmp byte ptr ds:[eax],0 | <==========================eax与0比较
0040158B |.^ 75 F3 \jnz short crackme3.00401580-- <==========================不等再往上循环`(依次取name的各个字符来变形`)
偶输入的name: jiangwu55<=========变形后: kkbjbqr=
以下为code变形:
0040158D |. 33C0 xor eax,eax-------------------------------
0040158F |. 33DB xor ebx,ebx
00401591 |. 33C9 xor ecx,ecx 全清零..
00401593 |. B9 0A000000 mov ecx,0A<=========================================ecx赋个0ah,,主要作为下面变形异或操作数
00401598 |. 33D2 xor edx,edx-------------------------------
0040159A |. 8B45 F0 mov eax,dword ptr ss:[ebp-10]<==================假码传到eax
0040159D |> 8A18 /mov bl,byte ptr ds:[eax]<======================取假码第一个字符
0040159F |. 32D9 |xor bl,cl<=====================================与cl异或
004015A1 |. 8818 |mov byte ptr ds:[eax],bl<======================结果传到ds:[eax],下00373aa8可看到
004015A3 |. 41 |inc ecx<=======================================ecx+1,则为0bh,,
004015A4 |. 40 |inc eax<=======================================eax+1,变形次数
004015A5 |. 8038 00 |cmp byte ptr ds:[eax],0<=======================与0比较
004015A8 |.^ 75 F3 \jnz short crackme3.0040159D<===================不等则继续变形
偶输入的code: 121212<==========变形后: ;9=??=
以下为变形后的name与code一个一个对比:
004015AA |. 8B45 E4 mov eax,dword ptr ss:[ebp-1C]<================变形后的name传到eax
004015AD |. 8B55 F0 mov edx,dword ptr ss:[ebp-10]<================变形后的code传到edx
004015B0 |> 33C9 /xor ecx,ecx<=================================ecx清零
004015B2 |. 8A18 |mov bl,byte ptr ds:[eax]<====================取变形后的name的第一个字符
004015B4 |. 8A0A |mov cl,byte ptr ds:[edx]<====================取变形后的code的第一个字符
004015B6 |. 3AD9 |cmp bl,cl<===================================取后对比
004015B8 |. 75 09 |jnz short crackme3.004015C3<=================不等则跳``跳则玩完
004015BA |. 40 |inc eax<=====================================eax+1,指向下一个name的字符
004015BB |. 42 |inc edx<=====================================edx+1,指向下一个code的字符
004015BC |. 8038 00 |cmp byte ptr ds:[eax],0<=====================eax与0比较,,看是否对比完
004015BF |.^ 75 EF \jnz short crackme3.004015B0<=================没完继续
整个变形总结:
1、取name的每个字符依次与从1~9异或(位数大于9,,则开始与a~f异或,还大于则开始与10后面的数异或`直到各位异或完)
2、取code的每个字符依次与从0A~0F异或(位数大于0F,则开始与10。。后面的数异或,直到各位异或完)
3、把变形完后的name和code逐个对比~~
name: jiangwu55
code: a`ngl~b,.
整个算法就是这样了`可以写出注册机了```注册机如下:(这次的注册机乱了`输入格式偶也不想调了`简单就好:)西西`~~)
#include <stdio.h>
#include <string.h>
void main()
{
char name[100],code[100];
char namex[100],codex[100];
char a[100];
int b[100];
int i,k=0,s=0,n=10,m=0xa,x=1;
printf("name: ");
gets(name);
k=strlen(name);
for(i=0;i<k;i++)
{
a[i]=x;
x++;
}
for(i=0;i<k;i++)
{
b[i]=m;
s++;
m++;
}
for(i=s+1;i<k;i++)
{
b[i]=n;
n++;
}
for(i=0;i<k;i++)
namex[i]=name[i]^a[i];
for(i=0;i<k;i++)
name[i]=namex[i]^b[i];
printf("code: ");
puts(name);
loop:
goto loop;
}
变形过程并不复杂,,只要找到关键断点断下后~会注意到的!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课