Đoạn code này check xem FN ta nhập vào có nằm trong danh sách BlackList của nó hay không.. Và EBX ở đây chính là số lần lặp của đoạn code này.. Muốn biết thì chúng ta phải xem xem tại đị
Trang 1-=== Calculation 2 === -
0040C7FD | 83C4 0C ADD ESP,0C
0040C800 | 8D4C24 10 LEA ECX,DWORD PTR SS:[ESP+10]
0040C804 | 51 PUSH ECX ; /StringToAdd
0040C805 | 53 PUSH EBX ; |ConcatString
0040C806 | FF15 C4614200 CALL DWORD PTR DS:[<&KERNEL32.lstrcatA>] ; \lstrcatA 0040C80C | 33C9 XOR ECX,ECX ;<== Sec4 = 0;
0040C80E | 33C0 XOR EAX,EAX ;<== i = 0;
0040C810 | 85F6 TEST ESI,ESI
0040C812 | 76 14 JBE SHORT FolderVi.0040C828
0040C814 | 8B15 60B54200 MOV EDX,DWORD PTR DS:[42B560] <=4th Default Value (0x0B) -=== Calculation 3 === -
0040C81A |> 0FBE2C38 /MOVSX EBP,BYTE PTR DS:[EAX+EDI] ;<== FU[i]
0040C81E | 0FAFEA |IMUL EBP,EDX ; Temp = FU[i] * 4th Default Value (0x0B)
0040C821 | 03CD |ADD ECX,EBP ; Sec4 =Sec4 + Temp
0040C823 | 40 |INC EAX ;i ++
0040C824 | 3BC6 |CMP EAX,ESI ;While (i < Length (FU))
0040C826 |.^ 72 F2 \JB SHORT FolderVi.0040C81A ; Continue Loop
0040C828 |> 51 PUSH ECX ; /<%u> ; Sec4 (Convert hex > dec)
0040C829 | 8D5424 14 LEA EDX,DWORD PTR SS:[ESP+14] ; |
0040C82D | 68 749E4200 PUSH FolderVi.00429E74 ; |Format = "%u"
0040C832 | 52 PUSH EDX ; |s
0040C833 | FF15 70624200 CALL DWORD PTR DS:[<&USER32.wsprintfA>] ; \wsprintfA -=== Calculation 3 === -
0040C839 | 83C4 0C ADD ESP,0C
0040C83C | 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10]
0040C840 | 50 PUSH EAX ; /StringToAdd
0040C841 | 53 PUSH EBX ; |ConcatString
0040C842 | FF15 C4614200 CALL DWORD PTR DS:[<&KERNEL32.lstrcatA>] ; \lstrcatA <== EAX : Right Code
0040C848 | 5F POP EDI
0040C849 | 5E POP ESI
0040C84A | 5D POP EBP
0040C84B | 5B POP EBX
0040C84C | 81C4 00010000 ADD ESP,100
0040C852 \ C3 RETN
-=== Trace Into === -
0040C680 | 8B9424 140100>MOV EDX,DWORD PTR SS:[ESP+114] ;<=== FS
0040C687 | 8D4C24 0C LEA ECX,DWORD PTR SS:[ESP+C] ;<=== Right Serial
0040C68B | 51 PUSH ECX
0040C68C | 52 PUSH EDX
0040C68D | E8 2EFEFFFF CALL FolderVi.0040C4C0 ;<== Compare
0040C692 | 83C4 10 ADD ESP,10
0040C695 | F7D8 NEG EAX
0040C697 | 1BC0 SBB EAX,EAX
0040C699 | 5E POP ESI
0040C69A | F7D8 NEG EAX
Trang 20040C69C | 81C4 00010000 ADD ESP,100
0040C6A2 \ C3 RETN
-=== Trace Into === -
0040C178 83C4 08 ADD ESP,8
0040C17B 85C0 TEST EAX,EAX ;<=== Wrong Code Jump to Nag
0040C17D 74 43 JE SHORT FolderVi.0040C1C2
0040C17F 8D5424 04 LEA EDX,DWORD PTR SS:[ESP+4]
0040C183 8D8424 040100>LEA EAX,DWORD PTR SS:[ESP+104]
0040C18A 52 PUSH EDX
0040C18B 50 PUSH EAX
0040C18C 68 18964200 PUSH FolderVi.00429618 ; ASCII "Software\FolderView\Registration" 0040C191 68 01000080 PUSH 80000001
0040C196 E8 15050000 CALL FolderVi.0040C6B0
0040C19B 68 18964200 PUSH FolderVi.00429618 ; ASCII "Software\FolderView\Registration" 0040C1A0 68 01000080 PUSH 80000001
0040C1A5 E8 16020000 CALL FolderVi.0040C3C0
0040C1AA 83C4 18 ADD ESP,18
0040C1AD 6A 01 PUSH 1 ; /Result = 1
0040C1AF 56 PUSH ESI ; |hWnd
0040C1B0 FF15 34624200 CALL DWORD PTR DS:[<&USER32.EndDialog>] ; \EndDialog 0040C1B6 33C0 XOR EAX,EAX
0040C1B8 5E POP ESI
0040C1B9 81C4 00020000 ADD ESP,200
0040C1BF C2 1000 RETN 10
0040C1C2 > 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
0040C1C4 68 74964200 PUSH FolderVi.00429674 ; |Title = "FolderView"
[B]0040C1C9 68 90B84200 PUSH FolderVi.0042B890 ; |Text = "Sorry, you have entered an incorrect registration code."[/b]
0040C1CE 56 PUSH ESI ; |hOwner
0040C1CF FF15 78624200 CALL DWORD PTR DS:[<&USER32.MessageBoxA>] ;
\MessageBoxA
0040C1D5 > 33C0 XOR EAX,EAX ; Default case of switch 0040C0CD
0040C1D7 5E POP ESI
0040C1D8 81C4 00020000 ADD ESP,200
0040C1DE C2 1000 RETN 10
/*/*/*/ - SERIAL tương ứng :
User : kienmanowar Serial : 1730-47200-1510-12980
User : REA-cRaCkErTeAm Serial : 2005-50200-1705-13805
III – Keygen :
Code:
char reaName[64]={0};
char reaSerial[64]={0};
int LenName=0;
int i=0,j=0;
Trang 3int Temp=0, Temp1 = 0;
char Sec1[10] = {0}, Sec2[10] = {0}, Sec3[10] = {0}, Sec4[10] = {0};
int Sec1_temp = 0, Sec2_temp = 0, Sec3_temp = 0,Sec4_temp = 0;
LenName=GetDlgItemText(IDC_NAME,reaName,64);
if (LenName < 1)
{
MessageBox(" -===== Your name atleast 1 chart ===== - ","Hey !! Please input your name again !! ");
}
else
{
// Caculation 0 while (i < LenName) {
Temp = reaName[i] + 0x32;
Temp1 = Temp1 + Temp ; i++;
} Sec1_temp = Temp1;
wsprintf(Sec1,"%u-",Sec1_temp);
i = 0;
Temp = 0;
Temp1 = 0;
// Calculation 1 while (i < LenName) {
Temp = reaName[i] * 0x28;
Temp1 = Temp1 + Temp;
i++;
} Sec2_temp = Temp1;
wsprintf(Sec2,"%u-",Sec2_temp);
//Calculation 2
i = 0;
Temp = 0 ; Temp1 = 0;
while ( i < LenName) {
Temp = reaName[i] + 0x1E;
Temp1 = Temp1 + Temp;
i++;
} Sec3_temp = Temp1;
wsprintf(Sec3,"%u-",Sec3_temp);
Trang 4OK
Trang 6} Temp = reaName[i] + j + 4*Temp;
Trace tiếp tới đây Đoạn code này check xem FN ta nhập vào có nằm trong danh sách BlackList của nó
hay không Nếu có thì bắn “HACKER” :
Nếu không thì nhảy qua :
Đặt vệt sáng tại địa chỉ 180039D4 rồi nhìn xuống phía
dưới :
Oki và chúng ta sẽ thấy tại địa chỉ [1800A9B8] nó sẽ chứa các Magic String Mỗi Magic String này có
10 kí tự được ngăn cách nhau bởi dấu ‘.’
Trace tiếp chúng ta sẽ thấy tại địa chỉ 180039E3 chương trình so sánh EBX với giá trị chứa trong
[18009008] (so sánh EBX với 0x66) Và EBX ở đây chính là số lần lặp của đoạn code này Như vậy
đoạn code này sẽ lặp đi lặp lại tối đa là 102 lần, tùy thuộc vào lệnh nhảy tại 180039FD
có được Set
hay không Muốn biết thì chúng ta phải xem xem tại địa chỉ 180039F3 chương trình sẽ kiểm tra cái gì
và như thế nào
Trang 7Trace into :
Đoạn code này tính giá trị EBX từ chuỗi “Bejeweled1240409” cuối cùng EBX = 0x29 Trace tiếp:
Đoạn code này sẽ check 10 kí tự đầu tiên trong chuỗi FS Quá trình kiểm
tra như sau :
- Đầu tiên chương trình sẽ check xem vị trí xuất hiện của kí tự FS[0] trong
chuỗi
Str1 = "ZXHYGKLQ9867WEPRCDSANMJBVFTU5342"
- CL = vị trí xuất hiện
- Sau đó chương trình đem kí tự đầu tiên của chuỗi MagicStr mà EDI đang
trỏ tới để tính :
Trang 8+ DL = MagicStr[1]
+ DL = DL AND 0x7F
+ DL = DL ^ 0x29
- EAX = DL
- EDX = EAX % 0x20 = Temp1
- EAX = CL
- Compare EAX và EDX
- Nếu bằng thì lặp lại quá trình check như trên cho các kí tự tiếp theo trong FS và MagicStr cho đến
hết, cuối cùng EAX = 1 còn không thì EAX = 0, EDI sẽ trỏ tới chuỗi MagicStr tiếp theo và lại lặp lại quá
trình kiểm tra 10 kí tự đầu tiên trong FS với chuỗi MagicStr này
Vậy để 10 kí tự đầu tiên thỏa mãn đoạn code này thì các FS[i] (i = 0 9) = Str1[Temp1]
Có tất cả 0x66 chuỗi MagicStr tất cả Chúng ta hãy tìm cách copy tất cả các MagicStr này và Paste vào
Notepad để còn dùng khi code Keygen (sử dụng Follow Value in Dump)
- Sau khi quá trình kiểm tra trên được thỏa mãn thì chương trình sẽ check tiếp :
Quá trình này kiểm tra như sau : Chương trình lấy giá trị Temp tính được ở trên đem chia 0x66 lấy
phần dư, rồi đem so sánh với số lần lặp Có nghĩa là EBX = Temp % 0x66 hay là chúng ta phải lấy
chuỗi MagicStr thứ [Temp % 0x66] để tính 10 kí tự đầu tiên trong Serial chứ không thể lấy ngẫu nhiên
bất kì một MagicStr nào để tính số Serial
Nếu 10 kí tự đầu tiên mà thỏa mãn đoạn code trên thì nó sẽ nhảy qua RETN và check tiếp 5 kí tự còn
lại :
Trace tiếp :
Trang 9Trace tiếp Đoạn code này còn chuyển giá trị Temp (<100000) sang
dạng chuỗi
Tiếp tục tới đây; nếu chỉ patch thì tại 18003B00 : Chuyển
75 à 74
Tại địa chỉ 18003AE9 ta Trace into
:
Đây chính là đoạn code check 5 kí tự còn lại trong FS Quá trình kiểm
tra như sau :
- Đầu tiên nó check xem giá trị Temp có lớn hơn 100000 hay không Nếu có thì SAR Temp,1 cho đến
khi Temp < 100000
- Convert Temp thành xâu rồi lấy từng kí tự Temp[i] để tính :
+ EDX = Temp[i] % 20 = Temp2 – vị trí xuất hiện FS[i] (i = 10 14) trong chuỗi Str1
+ FS[i] (i = 10 14) = Str1[Temp2]
OK tới đây ta có thể thấy toàn bộ quá trình check Serial của cái Game này Và bây giờ
là Keygen :
III Keygen :
//Khai bao;