今天翻电脑偶尔发现一篇很早以前写的crackme破文,是PEDIY CrackMe 2007里面的,偷个懒就不修改了,虽然文章看起来很幼稚,但毕竟是自己动手的,保持原来的好,适合初学者,错误再所难免,请大家不要那东西砸我就好了
不多说了,言归正转:
用PEID查下,“MASM32 / TASM32”没壳。先运行程序提示“Patch me if you can ”。
确定之后界面出来了。点Check,没反应!随便输入点什么东西再点,还是没反应!!
用OD加载后,查找一下字符串"Patch me if you can" ,或者是查找当前模块的API函数,因为有输入框,自然而然就想到API函数 :GetWindowText,下断点,运行程序,
输入用户名:pediy
注册玛:787878
F9。。。。。
停在:
... ...
00401219 . >mov dword ptr [403C64], <jmp.&user32.GetWindowTextA>
00401223 . >sub dword ptr [403C64], 9
0040122A > >push 1FF
0040122F . >cmp ebx, 1
00401232 . >jnz short 00401241
00401234 . >push 00403054
00401239 . >push dword ptr [40304C]
0040123F . >jmp short 0040124C
00401241 > >push 00403654
00401246 . >push dword ptr [403050]
0040124C > >cmp ebx, 1
0040124F . >je short 00401258
00401251 . >add dword ptr [403C64], 9
00401258 > >call dword ptr [403C64]
0040125E . >inc ebx
0040125F . >cmp ebx, 2
00401262 .^>jl short 0040122A
00401264 . >mov dword ptr [403C70], <jmp.&kernel32.lstrlenA>
0040126E . >dec dword ptr [403C70]
00401274 . >mov dword ptr [403C68], <jmp.&user32.GetWindowTextLengthA>
0040127E . >inc dword ptr [403C68]
00401284 . >push dword ptr [40304C]
0040128A . >dec dword ptr [403C68]
00401290 . FF15 683C4000 call dword ptr [403C68] ; <jmp.&user32.GetWindowTextLengthA>(ASCII "pediy")
00401296 . 83F8 05 cmp eax, 5 ;用户名是否大于等于5,关键跳
00401299 . 0F8C 43010000 jl 004013E2
0040129F . 83F8 08 cmp eax, 8 ;用户名是否小于8,关键跳
004012A2 . 0F8D 3A010000 jge 004013E2
004012A8 . 8BC8 mov ecx, eax ;用户名是长度5
004012AA . 890D 543C4000 mov dword ptr [403C54], ecx
004012B0 . 33DB xor ebx, ebx
004012B2 . 8D35 54304000 lea esi, dword ptr [403054] ; Address=00403054, (ASCII "pediy") 从4012B8--4012DF是用户名的第一次变化,变化后地址在4012DA指定的byte ptr [ebx+edi]中:
004012B8 . 8D3D 54324000 lea edi, dword ptr [403254] ; Address=00403254
004012BE > /8A4431 FF mov al, byte ptr [ecx+esi-1] ; 第一次取值(ASCII "y")
004012C2 . |80F9 04 cmp cl, 4
004012C5 . |74 13 je short 004012DA
004012C7 . |3C 4D cmp al, 4D
004012C9 . |7C 04 jl short 004012CF
004012CB . |2C 11 sub al, 11
004012CD . |EB 02 jmp short 004012D1
004012CF > |04 15 add al, 15
004012D1 > |32C1 xor al, cl
004012D3 . |34 02 xor al, 2
004012D5 . |88043B mov byte ptr [ebx+edi], al ; al=6F ('o') ds:[00403254]=00
004012D8 . |EB 04 jmp short 004012DE
004012DA > |C6043B 2D mov byte ptr [ebx+edi], 2D
004012DE > |43 inc ebx
004012DF .^\E0 DD loopdne short 004012BE
004012E1 . 8D35 54324000 lea esi, dword ptr [403254] ; Address=00403254, (ASCII "o-RT\")
004012E7 . 8D3D 54344000 lea edi, dword ptr [403454]
004012ED . 8B0D 543C4000 mov ecx, dword ptr [403C54] ; ds:[00403C54]=00000005
004012F3 . 33DB xor ebx, ebx
004012F5 . C705 5C3C4000>mov dword ptr [403C5C], <jmp.&kernel32.lstrcatA>
004012FF . 832D 5C3C4000>sub dword ptr [403C5C], 2 ; ds:[00403C5C]=004016D6 (crackme.004016D6)
00401306 . C705 783C4000>mov dword ptr [403C78], 0040207F ; 0040207F=0040207F (ASCII ":-)")
00401310 . C705 7C3C4000>mov dword ptr [403C7C], 00402070 ; ASCII "Correct Serial"
0040131A . 832D 783C4000>sub dword ptr [403C78], 5 ; ds:[00403C78]=0040207F (crackme.0040207F), ASCII ":-)"
00401321 . 832D 7C3C4000>sub dword ptr [403C7C], 5 ; ds:[00403C7C]=00402070 (crackme.00402070), ASCII "Correct Serial"
; 从401328--401349是用户名的第一次变化,变化后地址在401344指定的byte ptr [ebx+edi]中:
00401328 > 80F9 04 cmp cl, 4
0040132B . 74 17 je short 00401344
0040132D . 8A4431 FF mov al, byte ptr [ecx+esi-1] ; ds:[00403258]=5C ('\')
00401331 . 3C 4D cmp al, 4D
00401333 . 7C 04 jl short 00401339
00401335 . 2C 11 sub al, 11
00401337 . EB 02 jmp short 0040133B
00401339 > 04 15 add al, 15
0040133B > 32C1 xor al, cl
0040133D . 34 02 xor al, 2
0040133F . 88043B mov byte ptr [ebx+edi], al
00401342 . EB 04 jmp short 00401348
00401344 > C6043B 2D mov byte ptr [ebx+edi], 2D
00401348 > 43 inc ebx
00401349 .^ E0 DD loopdne short 00401328
0040134B . C705 603C4000>mov dword ptr [403C60], <jmp.&user32.MessageBoxA> ;Entry address
00401355 . 832D 603C4000>sub dword ptr [403C60], 7
0040135C . 68 54324000 push 00403254 ; ASCII "o-RT\"
00401361 . 68 54344000 push 00403454 ; ASCII "L-@B]"
00401366 . 8305 5C3C4000>add dword ptr [403C5C], 2
0040136D . FF15 5C3C4000 call dword ptr [403C5C] ; crackme.004016D4
00401373 . 68 54344000 push 00403454; ASCII ; L-@B]o-RT\"
;地址403454就是由输入的用户名变换来的注册码地址 ASCII "L-@B]o-RT\"
00401378 . FF05 703C4000 inc dword ptr [403C70] ; crackme.004016DC
0040137E . FF15 703C4000 call dword ptr [403C70] ; <jmp.&kernel32.lstrlenA>
00401384 . A3 743C4000 mov dword ptr [403C74], eax
00401389 . 68 54364000 push 00403654 ; ASCII "787878"
0040138E . FF15 703C4000 call dword ptr [403C70] ; <jmp.&kernel32.lstrlenA>
//00401394 . 3B05 743C4000 cmp eax, dword ptr [403C74]
//0040139A 75 46 jnz short 004013E2 ;关键跳
0040139C . FF35 543C4000 push dword ptr [403C54]
004013A2 . 68 54344000 push 00403454 ; ASCII "L-@B]o-RT\"
004013A7 . 68 54364000 push 00403654 ; ASCII "787878"
//004013AC . E8 9F000000 call 00401450
00401450 /$ 55 push ebp
00401451 |. 8BEC mov ebp, esp
00401453 |. 8B45 0C mov eax, dword ptr [ebp+C] ;Stack ss:[0012FC7C]=00403454 ASCII "L-@B]o-RT\"
00401456 |. 8B75 08 mov esi, dword ptr [ebp+8] ;Stack ss:[0012FC78]=00403654 ASCII "787878"
00401459 |. 8B4D 10 mov ecx, dword ptr [ebp+10] ;Stack ss:[0012FC80]=00000005
0040145C |> /A6 /cmps byte ptr [esi], byte ptr es:[edi]
0040145D |. 75 0F |jnz short 0040146E
0040145F |. 49 |dec ecx
00401460 |. 83F9 00 |cmp ecx, 0
00401463 |.^ 75 F7 \jnz short 0040145C
00401465 |. B8 00000000 mov eax, 0
0040146A |. C9 leave
0040146B |. C2 0C00 retn 0C
0040146E |> B8 01000000 mov eax, 1
00401473 |. C9 leave
00401474 \. C2 0C00 retn 0C
//004013B1 . 83F8 01 cmp eax, 1
//004013B4 74 2C je short 004013E2
004013B6 . 8305 7C3C4000>add dword ptr [403C7C], 5
004013BD . 8305 783C4000>add dword ptr [403C78], 5
004013C4 . 6A 40 push 40
004013C6 . FF35 783C4000 push dword ptr [403C78] ; crackme.0040207A
004013CC . FF35 7C3C4000 push dword ptr [403C7C] ; crackme.0040206B
004013D2 . FF75 08 push dword ptr [ebp+8]
004013D5 . 8305 603C4000>add dword ptr [403C60], 7
004013DC . FF15 603C4000 call dword ptr [403C60] ; crackme.0040167B正确
004013E2 > E8 21000000 call 00401408 ; 错误
水平有限,出现错误再所难免,竟请批评指正
以下是注册机(C学得很烂,代码有些乱,见谅)
输入用户名:pediy
注册玛:787878
大概步骤:
用@1表示 4012DA指定的byte ptr [ebx+edi]中
用@2表示 401344指定的byte ptr [ebx+edi]中
1:先将所输入的5至7位的用户名(按逆向)各位所对应的ASCII值进行:若小于4D则加15(16进制),否则减去11(16进制)-->与ecx异或(ecx的值由7至1递减)-->与2(16进制)异或-->将循环得到的字符串"o-RT\"送入地址@1中 。
2:然后将@1中处得到的新字串代替上步中的用户名,执行相同操作后,将新字串"L-@B]"送入@2中。
3:将A、B所得字串连接(@2字串在@1字串前面),即为注册码"L-@B]o-RT\"
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
char zhucema(char aa,int k)
{
int kk=k+1;
if(kk==4)
aa=45; //16进制数表示为2D
else if(aa<'M')
{
int k1=(int)aa;
k1+=21;//16进制数表示为15
k1^=kk;
k1^=2;//16进制数表示为2
aa=(char)k1;
}
else
{
int k1=(int)aa;
k1-=17;//16进制数表示为11
k1^=kk;
k1^=2;//16进制数表示为2
aa=(char)k1;
}
return aa;
}
int main(int argc, char* argv[])
{
int i=0,j;
char a1[8]="\0",a2[8]="\0",zcm[16]="\0",str[8];
do
{
printf("请输入用户名:");
scanf("%s",str);
int k=strlen(str);
if((k>=5)&&(k<8))
{
for(i=k-1,j=0;i>0,j<k;i--,j++)
a1[j]=zhucema(str[i],i);
for(i=k-1,j=0;i>0,j<k;i--,j++)
a2[j]=zhucema(a1[i],i);
strcpy(zcm,a2);
strcat(zcm,a1);
printf("得到注册码是:");
int k1=strlen(zcm);
for(i=0;i<k1;i++)
printf("%c",zcm[i]);
printf("\n\n");
i--;
}
else
{
printf("请输入大于4小于8的字符\n");
i=3;
continue;
}
}while(i);
return 0;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)