banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thủ thuật reverse engineering ScrewMe_#1_by_Dynasty keygenme  XML
  [Question]   ScrewMe_#1_by_Dynasty keygenme 24/04/2008 05:43:39 (+0700) | #1 | 127156
[Avatar]
kienmanowar
HVA Friend

Joined: 13/07/2004 05:57:34
Messages: 483
Offline
[Profile] [PM] [WWW]
Mới vọc thử em này thấy cũng hay hay post lên đây cho anh em thử tay nghề. Nếu anh em nào làm được thì đề nghị phân tích rõ từng bước tiếp cận trong quá trình RE keygenme này và post vào thread này nhé..

Yêu cầu:
_Trình bày càng chi tiết càng tốt.
_Viết một keygen hoàn chỉnh smilie

Link download:
Code:
http://www.4shared.com/file/45088828/40b27b0e/ScrewMe_1_by_Dynasty.html?dirPwdVerified=c4951f3f


Ps : nhờ bác mod có thể attach target này lên được không!!

Best Regards
kienmanowar
[Up] [Print Copy]
  [Question]   Re: ScrewMe_#1_by_Dynasty keygenme 24/04/2008 11:43:46 (+0700) | #2 | 127228
[Avatar]
hacnho
HVA Friend

Joined: 28/01/2003 12:07:45
Messages: 199
Location: OEP
Offline
[Profile] [PM]
Tui lười quá smilie .

-Trước hết nó dùng API FindWindow để tìm OllyDBG và SND OllyMod-

Code:
int __cdecl sub_401290()
{
  HWND v1; // eax@1
  int v2; // [sp+14h] [bp-4h]@1
  HWND v3; // [sp+10h] [bp-8h]@1

  v2 = 0;
  v1 = FindWindowA("OllyDBG", 0);
  v3 = v1;
  if ( v1 )
    GetWindowThreadProcessId(v3, (DWORD *)&v2);
  ++dword_405014;
  return v2;
}


-Chuỗi:
Code:
]sy$Wgvi{ih$qi$222$Xlerow$jsv$vikmwxivmrk$xlmw$gvegoqi$%$

Code:
Mrzepmh$Wivmep$$

có nghĩa:

Code:
You Screwed me ... Thanks for registering this crackme !

Code:
Invalid Serial


-Tên name <11
-Tên serial <16

Code:
0040179D  |. E8 AE0A0000    CALL <JMP.&msvcrt.strlen>                ; |\strlen
004017A2  |. 83F8 0B        CMP EAX,0B                               ; |
004017A5  |. 0F87 ED020000  JA ScrewMe_.00401A98                     ; |
004017AB  |. 807D E8 00     CMP BYTE PTR SS:[EBP-18],0               ; |
004017AF  |. 0F84 CD020000  JE ScrewMe_.00401A82                     ; |
004017B5  |. 8D45 E8        LEA EAX,DWORD PTR SS:[EBP-18]            ; |
004017B8  |. 890424         MOV DWORD PTR SS:[ESP],EAX               ; |
004017BB  |. E8 900A0000    CALL <JMP.&msvcrt.strlen>                ; \strlen
004017C0  |. 83F8 10        CMP EAX,10


-Chuyển ký sang mã ascii, lặp cho đến hết, sau đó cộng với nhau:

Code:
004017C9  |. C785 38FFFFFF >MOV DWORD PTR SS:[EBP-C8],0
004017D3  |> 8D45 D8        /LEA EAX,DWORD PTR SS:[EBP-28]           ; |
004017D6  |. 890424         |MOV DWORD PTR SS:[ESP],EAX              ; |
004017D9  |. E8 720A0000    |CALL <JMP.&msvcrt.strlen>               ; \strlen
004017DE  |. 3985 38FFFFFF  |CMP DWORD PTR SS:[EBP-C8],EAX
004017E4  |. 73 1E          |JNB SHORT ScrewMe_.00401804
004017E6  |. 8D45 F8        |LEA EAX,DWORD PTR SS:[EBP-8]
004017E9  |. 0385 38FFFFFF  |ADD EAX,DWORD PTR SS:[EBP-C8]
004017EF  |. 83E8 20        |SUB EAX,20
004017F2  |. 0FBE10         |MOVSX EDX,BYTE PTR DS:[EAX]
004017F5  |. 8D45 D4        |LEA EAX,DWORD PTR SS:[EBP-2C]
004017F8  |. 0110           |ADD DWORD PTR DS:[EAX],EDX
004017FA  |. 8D85 38FFFFFF  |LEA EAX,DWORD PTR SS:[EBP-C8]
00401800  |. FF00           |INC DWORD PTR DS:[EAX]
00401802  |.^EB CF          \JMP SHORT ScrewMe_.004017D3


Thí dụ hacnho=68+61+63+6E+68+6F= 271 hex = 625 dec.

-Nhân kết quả trên cho 10

Code:
00401804  |> 8B55 D4        MOV EDX,DWORD PTR SS:[EBP-2C]                     ; |||
00401807  |. 89D0           MOV EAX,EDX                                       ; |||
00401809  |. C1E0 02        SHL EAX,2                                         ; |||
0040180C  |. 01D0           ADD EAX,EDX                                       ; |||
0040180E  |. 01C0           ADD EAX,EAX                                       ; |||


-Đổi HEX sang DEC:

Code:
0040182C  |. E8 0F0A0000    CALL <JMP.&msvcrt.sprintf>                        ; ||\sprintf



-Chuỗi trên + với "-":

Code:
0040184D  |. C645 EC 2D     MOV BYTE PTR SS:[EBP-14],2D                       ; |


-Đưa 1984 vào EAX, chắc là năm sinh của nó smilie.
Code:
00401868  |. 05 C0070000    ADD EAX,7C0                                       ; |


Nhân 1984 với kết quả đổi sang DEC:

Code:
v11 = v9 * (v24 + v22 + v23 + 1984);


Lấy serial của ổ cứng bằng hàm GetVolumeInformationA, đẩy sổ serial này vô buffer tại 405030
Code:
0022FED0   004041A1  |RootPathName = "C:\"
0022FED4   00405024  |VolumeNameBuffer = ScrewMe_.00405024
0022FED8   0000000C  |MaxVolumeNameSize = C (12.)
0022FEDC   00405040  |pVolumeSerialNumber = ScrewMe_.00405040
0022FEE0   00000000  |pMaxFilenameLength = NULL
0022FEE4   00000000  |pFileSystemFlags = NULL
0022FEE8   00405030  |pFileSystemNameBuffer = ScrewMe_.00405030
0022FEEC   00000010  \pFileSystemNameSize = 00000010


-Nhân 1984 với chuỗi ban đầu và xor với số serial ổ c:

v12 = v9 * (v24 + v22 + v23 + 1984) ^ dword_405040;

-Kết hợp chuỗi này thành số serial. Tuy nhiên đến đây vẫn chưa xong, nó vẫn báo invalid serial. Restart lại Olly, nhập vào chuỗi vừa có (62501-1003445255). Trace tới đây, sẽ gặp API CreateFileA:

Code:
00401989  |. 890424         MOV DWORD PTR SS:[ESP],EAX                        ; |
0040198C  |. E8 6F020000    CALL <JMP.&KERNEL32.CreateFileA>                  ; \CreateFileA
00401991  |. 83EC 1C        SUB ESP,1C


Code:
0022F9D0   0022FA50  |FileName = "EarnUrRight.dat"
0022F9D4   80000000  |Access = GENERIC_READ
0022F9D8   00000001  |ShareMode = FILE_SHARE_READ
0022F9DC   00000000  |pSecurity = NULL
0022F9E0   00000003  |Mode = OPEN_EXISTING
0022F9E4   00000080  |Attributes = NORMAL
0022F9E8   00000000  \hTemplateFile = NULL


Trace tới đây sẽ gặp chuỗi:
Code:
00401A0B  |. 8D45 F8        |LEA EAX,DWORD PTR SS:[EBP-8]

ECX 0022FA00 ASCII "Allow Me to Retort!"


Như vậy keyfile sẽ có nội dung như thế.

Xong smilie
Mọi câu hỏi vui lòng gửi lên diễn đàn!
[Up] [Print Copy]
  [Question]   Re: ScrewMe_#1_by_Dynasty keygenme 24/04/2008 23:07:40 (+0700) | #3 | 127328
[Avatar]
kienmanowar
HVA Friend

Joined: 13/07/2004 05:57:34
Messages: 483
Offline
[Profile] [PM] [WWW]
Ơ lão nhỏ này nhanh tay quá smilie, lão đã solve rồi thì giải quyết nốt cái keygen đi. Trong keygen lão tạo keyfile luôn smilie.. không chơi tạo keyfile bằng manual nha!!
[Up] [Print Copy]
  [Question]   Re: ScrewMe_#1_by_Dynasty keygenme 24/04/2008 23:39:32 (+0700) | #4 | 127335
[Avatar]
hacnho
HVA Friend

Joined: 28/01/2003 12:07:45
Messages: 199
Location: OEP
Offline
[Profile] [PM]
smilie

Code:
// BOOL __stdcall GetVolumeInformationA(LPCSTR lpRootPathName, LPSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize); 

extern DWORD VolumeSerialNumber;
extern char FileSystemNameBuffer[];

BOOL GetHDDSerial()
{
  return GetVolumeInformationA("C:\\", 0, 0, &VolumeSerialNumber, 0, (LPDWORD)0x14, FileSystemNameBuffer, 0x14u);
}


Dịch từ code của XIANUA, btw thanx smilie :

Code:
G.data

Volume		dd	0
sMl		dd	0
sFs		dd	0
sResult		dd	MAX_PATH dup(?)

.data?
hWnd		dd	?

.code
start:

INVOKE GetVolumeInformation, SADD("C:\"), NULL, NULL, ADDR Volume, ADDR sMl, ADDR sFs, NULL, NULL
INVOKE dw2hex, [Volume], ADDR sResult

INVOKE MessageBox, hWnd, ADDR sResult, SADD("Info"), MB_ICONINFORMATION OR MB_OK
INVOKE ExitProcess, NULL

End start


Và tạo key file:

Code:
extern DWORD NumberOfBytesWritten;
extern char FileName[];
extern HANDLE hFile;
extern char FileName[];

BOOL CreateKeyFile()
{
  int tmp;

  GetCurrentDirectoryA(0xC8u, FileName);
  lstrcatA(FileName, "\\EarnUrRight.dat");
  hFile = CreateFileA(FileName, 0x40000000u, 0, 0, 2u, 0x80u, 0);
  tmp = lstrlenA("Allow Me to Retort!");
  WriteFile(hFile, "Allow Me to Retort!", tmp, &NumberOfBytesWritten, 0);
  return CloseHandle(hFile);
}


smilie
Mọi câu hỏi vui lòng gửi lên diễn đàn!
[Up] [Print Copy]
  [Question]   Re: ScrewMe_#1_by_Dynasty keygenme 25/04/2008 01:00:38 (+0700) | #5 | 127351
[Avatar]
gamma95
Researcher

Joined: 20/05/2003 07:15:41
Messages: 1377
Location: aaa&quot;&gt;
Offline
[Profile] [PM] [ICQ]
Em xin bổ sung chút :
Crackme này ngoài việc dùng API FindWindowA để detect ra Olly, nó còn dùng hàm IsDebuggerPresent để detect Debugger. Các bypass đơn giản (em hay làm)
Set bp tại 004012AC & 0040151A (FindWindowA) và 00401716,0040177F (IsDebuggerPresent).
F9 để run
Olly sẽ Bp tại
Code:
004012A5     C70424 0040400>MOV DWORD PTR SS:[ESP],ScrewMe_.00404000 ;  ASCII "OllyDBG"
004012AC     E8 9F080000    CALL <JMP.&USER32.FindWindowA>
004012B1     83EC 08        SUB ESP,8
004012B4     8945 F8        MOV DWORD PTR SS:[EBP-8],EAX

chuột phải vào Dòng ASCII "OllyDBG" -->follow in dump --> Immediet constant --> Nhìn vào bảng HexDump -->ctrl+E để sửa lại chuỗi "OllyDBG"&"SND" thành một chuỗi bất kỳ.
Tiếp tục F9 để run Olly sẽ Bp tại IsDebuggerPresent, ta sẽ Fill NOP tại CALL, F9 -->tiếp tục Fill NOP tại CALL.
Sau đó copy to excutetable --> copy to all modification --> Save File -->Ok.
Quá trình Cracking diễn ra bình thường.
PS: Anh Nho solved lẹ quá --> Khớp --> lần sau chắc phải cấm mấy lão Cracker, Reverse post solved! smilie
Cánh chym không mỏi
lol
[Up] [Print Copy]
  [Question]   Re: ScrewMe_#1_by_Dynasty keygenme 25/04/2008 01:40:30 (+0700) | #6 | 127357
[Avatar]
hacnho
HVA Friend

Joined: 28/01/2003 12:07:45
Messages: 199
Location: OEP
Offline
[Profile] [PM]
Ờ, tui quên mất vụ này, tại vì cái Olly tui, tui config hết các vụ dectect này smilie , khỏi làm tay cho nó mệt smilie . Lão thik thì tui đưa cái plugin tự hide hết các anti-olly trick cho ! smilie

Keygen nè kiên smilie
Mọi câu hỏi vui lòng gửi lên diễn đàn!
[Up] [Print Copy]
  [Question]   Re: ScrewMe_#1_by_Dynasty keygenme 25/04/2008 03:29:53 (+0700) | #7 | 127364
[Avatar]
kienmanowar
HVA Friend

Joined: 13/07/2004 05:57:34
Messages: 483
Offline
[Profile] [PM] [WWW]
Cái lão nhỏ này code vội nhé, keygen lão có bug nè smilie)

1. Nhập username : manwowar. Key có được là : 757011278350159 <== thiếu mất '-' smilie

2. Nếu tôi bấm Gen mấy phát thì có mà nó ra thế này smilie)
75701127835015912783501591278350159

Oánh lão chít giờ, có code cũng code cho nó good tí chứ!!

Regards
[Up] [Print Copy]
  [Question]   Re: ScrewMe_#1_by_Dynasty keygenme 25/04/2008 03:35:21 (+0700) | #8 | 127365
[Avatar]
kienmanowar
HVA Friend

Joined: 13/07/2004 05:57:34
Messages: 483
Offline
[Profile] [PM] [WWW]
Tôi không dám múa rìu qua mặt lão nhỏ, code của tôi đây....dòm vào hơi thô thiển tí smilie

Code:
BOOL GenerateSerial(HWND hwnd)
{
	
	char szName[9]={0};
	char szSerial[16]={0};

	int i=0,LenUser=0,iSumAcsiiResult=0,iTemp=0;

	char *lpRootPathName="C:\\";	// address of root directory of the file system 
	char lpVolumeNameBuffer[100];	// address of name of the volume 
	DWORD lpVolumeSerialNumber;	// address of volume serial number 
	DWORD lpMaximumComponentLength;	// address of system's maximum filename length
	DWORD lpFileSystemFlags;	// address of file system flags 
	char lpFileSystemNameBuffer[500];	// address of name of file system 

	char *lpFileName="EarnUrRight.dat";
	HANDLE hFile;
	char *lpBuffer="Allow Me to Retort!";
	DWORD lpBytesWritten;


	GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer, sizeof lpVolumeNameBuffer, &lpVolumeSerialNumber, &lpMaximumComponentLength,&lpFileSystemFlags,lpFileSystemNameBuffer,sizeof lpFileSystemNameBuffer);

	LenUser=GetDlgItemText(hwnd,IDC_NAME,szName,70);

	if (LenUser < 1 || LenUser > 9)
	{
		MessageBox(hwnd,"----------===== Your name atleast 1 chart ====---------- \n\n   ----------===== But not over 9 charts ====---------- ","Hey !! Please input your name again !! ",MB_OK);
		
	}
	else
	{
		hFile = CreateFile(lpFileName,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
		WriteFile(hFile,lpBuffer,19, &lpBytesWritten,0);
		CloseHandle(hFile);
		
		i = 0;
		while (i < LenUser)
		{
			iSumAcsiiResult = iSumAcsiiResult + szName[i];
			i++;
		}
		iTemp = iSumAcsiiResult;
		iTemp = iTemp * 4;
		iTemp = iTemp + iSumAcsiiResult;
		iTemp = iTemp * 2;
		iSumAcsiiResult = iTemp;
		
		iTemp = 0x7C0;
		iTemp = iTemp * iSumAcsiiResult;
		lpVolumeSerialNumber = lpVolumeSerialNumber ^ iTemp;
		
		wsprintf(szSerial,"%d-%d",iSumAcsiiResult,lpVolumeSerialNumber);
		SetDlgItemText(hwnd,IDC_SERIAL,szSerial); 
	}

	return TRUE;
}
[Up] [Print Copy]
  [Question]   Re: ScrewMe_#1_by_Dynasty keygenme 25/04/2008 04:21:42 (+0700) | #9 | 127375
[Avatar]
hacnho
HVA Friend

Joined: 28/01/2003 12:07:45
Messages: 199
Location: OEP
Offline
[Profile] [PM]
Chắc tui quên để thoát vòng lặp smilie. Mà test ok mà, tại lão nghịch dại bấm nhiều lần thôi smilie. Keygen lão viết C++ dòm vãi nhỉ. Tui thì Wasm nàm tới. C++ dốt vãi smilie!
Mọi câu hỏi vui lòng gửi lên diễn đàn!
[Up] [Print Copy]
  [Question]   Re: ScrewMe_#1_by_Dynasty keygenme 20/05/2008 09:06:07 (+0700) | #10 | 131507
[Avatar]
lamhoang20002000
Member

[Minus]    0    [Plus]
Joined: 03/04/2005 16:32:02
Messages: 52
Offline
[Profile] [PM] [Yahoo!]
2hacknho:
Với những chuỗi ký tự như: "]sy$Wgvi{ih$qi$222$Xlerow$jsv$vikmwxivmrk$xlmw$gvegoqi$%$" hoặc "Mrzepmh$Wivmep$$" làm sao ta xác định được ý nghĩa thật của nó là "You Screwed me ... Thanks for registering this crackme !" và "Invalid Serial". Mình xem thử thì đó không hoàn toàn là ánh xạ m = i...
Nó có phải là một phép dịch mã Caesar dịch mã ASCII n ký tự không? Nếu thế thì dễ code tool dò mấy ký tự này.
[Up] [Print Copy]
  [Question]   Re: ScrewMe_#1_by_Dynasty keygenme 20/05/2008 09:18:07 (+0700) | #11 | 131508
[Avatar]
lamhoang20002000
Member

[Minus]    0    [Plus]
Joined: 03/04/2005 16:32:02
Messages: 52
Offline
[Profile] [PM] [Yahoo!]
Oh, yes, I see. Xem kỹ lại thì đúng là dịch đi 4 ký tự thật. Chả cẩn thận chút nào.
Có thời gian sẽ mò con này để học tập các pro. Thanks.
[Up] [Print Copy]
  [Question]   Re: ScrewMe_#1_by_Dynasty keygenme 20/05/2008 11:02:03 (+0700) | #12 | 131532
[Avatar]
kienmanowar
HVA Friend

Joined: 13/07/2004 05:57:34
Messages: 483
Offline
[Profile] [PM] [WWW]
Rất chính xác, đó là Cesar Cipher smilie
[Up] [Print Copy]
  [Question]   Re: ScrewMe_#1_by_Dynasty keygenme 17/02/2009 04:56:02 (+0700) | #13 | 169676
[Avatar]
buidinhba5
Member

[Minus]    0    [Plus]
Joined: 06/12/2007 12:07:35
Messages: 5
Offline
[Profile] [PM] [Yahoo!]
Anh hacnho có Plugin hide anti-olly trick có thể post cho mọi người không và hix bác trình bày nhanh quá không hiểu làm sao bác đến được đoạn code kiểm tra chiều dài serial và name và đến được đoạn code mã hóa em đọc bác viết mà khó hiểu quy trình quá hì
[Up] [Print Copy]
  [Question]   Re: ScrewMe_#1_by_Dynasty keygenme 07/04/2009 08:09:27 (+0700) | #14 | 175993
tuanbca
Member

[Minus]    0    [Plus]
Joined: 31/03/2009 16:53:56
Messages: 5
Offline
[Profile] [PM]
To kienmanowar :
Bác send cho em cái active code để em đăng ký mem bên reaonline với
[Up] [Print Copy]
  [Question]   Re: ScrewMe_#1_by_Dynasty keygenme 20/04/2009 04:18:38 (+0700) | #15 | 177824
so61pi
Member

[Minus]    0    [Plus]
Joined: 05/03/2009 22:24:36
Messages: 26
Location: nowhere
Offline
[Profile] [PM] [Yahoo!]
Em xin bổ sung thêm, các chuỗi :
Code:
Ejgem"vjg"Ugtkcn


Code:
Ejgem"vjg"Pcog"Hkgnf

được dịch đi 2 kí tự, có nghĩa là :
Code:
Check the Serial

Code:
Check the Name Field

Đối với KeygenMe này, có thể dùng plugin Olly Advanced để hide Olly cũng được. smilie
[Up] [Print Copy]
  [Question]   Re: ScrewMe_#1_by_Dynasty keygenme 05/05/2009 03:51:28 (+0700) | #16 | 179510
so61pi
Member

[Minus]    0    [Plus]
Joined: 05/03/2009 22:24:36
Messages: 26
Location: nowhere
Offline
[Profile] [PM] [Yahoo!]
Hình như bác hacnho thay "-" bằng số 1 phải không ?
Theo em thấy thì dấu "-" có thể thay bằng kí tự nào cũng được (không biết có đúng không ? smilie )
Code của bác kienmanowar thì "LenUser < 1 || LenUser > 9", nếu như Name là "a" thì ta có:
Code:
Name : a
Serial : 970-206090841 (trên máy em)
-> "Invalid Serial"
nên theo em nghĩ thì sau khi tính tổng ASCII của chuỗi, nếu kết quả < 1000 thì kết quả = kết quả *10 smilie
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|