với TaskLock, chúng ta nhấn F11 để trở về đoạn lệnh gọi function. Chúng ta nhấn Ctrl-
Up để kéo màn hình lên trên và sẽ thấy đoạn code sau :
MOV ESI,[ESP+0C]
PUSH 1E_____________________________Lưu chiều dài lớn nhất của FN
PUSH 0040A680_______________________Địa chỉ đến buffer
PUSH 000003ED_______________________Control handle
PUSH ESI_____________________________Dialog handle
CALL [USER32!GetDlgItemTextA]
Các bác có thấy cái gì không ? Đó là số 40A680. Để xem nó giấu cái gì nào, okey chúng
ta hãy đánh : d 40A680
Và cái gì hiện ra trong data window vậy các bác. Well, chúng ta hãy nhìn vào phần đầu
của đoạn code :
PUSH 00
PUSH 00
PUSH 000003F6_______________________Control handle
MOV EDI, 00401680___________________Lưu địa chỉ
đến buffer
PUSH EDI____________________________Dialog handle
CALL [USER32!GetDlgItemInt]
Chắc các bác đang thắc mắc GetDlgItemInt là cái quái gì phải không ? Ở đây em xin nói
ngoài lề 1 chút : GetDlgItemInt là 1 function giống với GetDlgItemText, nó trả về giá trị
integer từ hộp thoại text. Nó được trả về trong EAX, vì vậy chúng ta “nhảy” qua đoạn
lệnh này, và nhìn vào register window … Của em là nó như thế này : EAX=00003039
Và để biết 3039 là cái gì, chúng ta đánh : ? 3039
Okey, chúng ta sẽ có gì nào :
00003039 0000012345 “09”
___|_________|________|
___|_________|________|
__hex_______dec______ascii
Như các bác thấy, nó hiện ra FS mà chúng ta đã đánh vào ban nãy. Bây giờ chúng ta típ
tục, các bác hãy nhìn vào đoạn code theo sau, trước tiên là FS đã
được lưu lại :
MOV [0040A548], EAX___________________Lưu FS
MOV EDX, EAX_________________________”đặt” FS vào EDX
3.1.3 Đoạn code tính số serial
Và đây chính là đoạn code tính số serial :
MOV ECX, FFFFFFFF______________________Tính chiều dài FN
SUB EAX, EAX
REPNZ SCASB
NOT ECX
DEC ECX_______________________________EAX chứa chiều dài FN
MOVSX EAX, BYTE PTR [0040A680]____________Nhận byte tại 40A680
IMUL ECX, EAX___________________________ECX = ECX * EAX
SHL ECX, 0A____________________________Đổi chỗ 0A
ADD ECX, 0002F8CC______________________Thêm 2F8CC vào kết quả
MOV [0040A664], ECX
Và đây mới là đoạn code mà ta mong đợi nhất ( cố lên các bác, sắp xong rùi :) :
CMP ECX, EDX___________________________So sánh EAX và EDX
JZ 00402DA6___________________________Nhảy nếu bằng
Sau khi “nhảy” đến CMP ECX,EDX , các bác có thể xem đoạn code thực của nó bằng
cách đánh vào : ? ecx
Và nó sẽ hiện ra như sau (không bít có giống của các bác không) :
000DC0CC 0000901324
Hehehehhe……đến đây thì chúng ta đã có được registration number c
ủa mình rùi đó là
901324.
Bây giờ các bác thử nhập lại registration number xem có được không, được quá đi chứ lị
:)))))))
4. Tạo keymaker cho phần mềm Command Line 95
===============================
Chúng ta nhìn vào đoạn code tính số serial ở trên, và dịch nó sang C. Em làm ví dụ này
để thấy làm thế nào để tính được real serial :
Real serial= [( kí tự viết hoa đầu tiên * chiều dài của chuỗi)<< 0x0A ]+0x2F8CC
Ở đây các bác chú ý 2 vấn đề :
+ các kí tự trong FN sẽ được chuyển sang chữ hoa khi bạn gõ chúng trong text box.
+ “<< 0x0a” có nghĩa là “ nhân với 2^10”
Trong C nó sẽ như thế này :
#include <string.h>
#include <stdio.h>
int main()
{
unsigned long code;
unsigned char buffer[0*1e];
printf(“CommandLine 95 Keymaker by the_lighthouse\n”);
printf(“Enter your name: “);
gets(buffer);
strupr(buffer);
code = ( ((unsigned long)buffer[0] *
(unsigned long)strlen(buffer))
<< 0x0A) + 0x2f8cc;
printf(“Your serial is : %lu”, code);
return 0;
}
5. Làm thế nào mà lệnh PUSH và lệnh CALL và những lệnh khác thật sự làm việc khi mà
chương trình gọi 1 funtion
===============================================
Nào, chúng ta hãy nhìn lại đoạn 1 code của TaskLock ( nếu bác nào không bít nó nằm ở
đâu thì hãy nhìn vào đoạn code đầu tiên) :
PUSH 32_________________________________Lưu chiều dài của FS
PUSH EAX_______________________________Lưu địa chỉ của text buffer
PUSH 000003F4___________________________Lưu Identifier của control
PUSH DWORD PTR [ESI+1C]________________Lưu handle của dialog
CALL [USER32!GetDlgItemTextA]
Nếu các bác gọi nó từ chương trình C, nó sẽ như thế này :
GetDlgItemTextA(hwndDlg, 0x3F4, buffer, 0x32);
_________________|____________|
_________________|____________|
______________[ESI+1C]________EAX
PUSH lưu dữ liệu trên 1 vài lệnh gọi stack. Kết quả này trong mỗi lệnh PUSH đặt 1 phần
của dữ liệu phía trên stack, và sau đó function kiểm tra cái gì đang nằm trên stack và
dùng nó để làm bất cứ cái gì .
6. Đôi điều về chương trình viết bằng Visual Basic
===================================
File Visual Basic.exe không thực sự được biên dịch ra file exe. Nó chỉ chứa đoạn code để
gọi file VBRUNxxx.DLL , file này có nhiệm vụ đọc dữ liệu từ file exe và chạ
y chương
trình. Đó là lí do vì sao chương trình viết bằng Visual Basic lại chạy chậm như vậy. Và
khi file exe không có thực, các bác không thể disassemble nó, các bác chỉ tìm thấy đoạn
lệnh gọi DLL và rất nhiều “rác”, và khi các bác dubeg, các bác sẽ kết thúc tại DLL.
Và cách giải quyết là decompiler (dịch ngược). Có rất nhìu chương trình decompile cho
Visual Basic, được viết bởi DoDi. Đây là chương trình shareware và có thể tìm được trên
mạng.
Tuy nhiên các bác cũng chớ lo vì các programmer giỏi thường không bao giờ viết chương
trình bằng Basic. (phù, may quá ;))
Phụ lục :
A. Làm thế nào để kiểm tra SoftICE đã load symbols ?
++++++++++++++++++++++++++++++++++++++
Để kiểm tra xem SoftICE đã load symbols cho GetWindowText chưa, các bác vào
SoftICE và đánh : exp getwindowtext
B. Cú pháp cho function
+++++++++++++++++
int GetWindowText(int windowhandle, char *buffer, int maxlen);
int GetDlgItemText(int dialoghandle, int controlid, char *buffer, int maxlen);
int GetDlgIemInt(int dialoghandle, int controlid, int *flag, int type);
the_lighthouse ()
cRACKER's nOTES
Quote:
Bài viết được chia thành 10 phần chính :
00. Giới thiệu
01. Assembly for Crackers
02. SoftICE ( Boot Menu, Setup, Commands)
+ 02.1 Boot Menu
+ 02.2 Setup
+ 02.3 Commands
03. Breakpoints và Win API Details
+ 03.1 Crippled Programs
+ 03.2 Dialog Box
+ 03.3 Drive Type Checks
+ 03.4 File Accesses
+ 03.5 Registry Accesses
+ 03.6 Serial Catching
+ 03.7 Time & Date Accesses
+ 03.8 Window Generating
04. Kiến thức về lệnh nhảy ( jump )
05. Kiến thức về SET
06. Tips & Tricks for Cracking
+ 06.1 Crippled Programs
+ 06.2 Dongles
+ 06.3 General
+ 06.4 InstallSHIELD Setups
+ 06.5 Key File Protections
+ 06.6 Nag Screens
+ 06.7 Runtime Limits
+ 06.8 Serials
+ 06.9 Time Limits
+ 06.10 Visual Basic Programs
07. Window Messages for Crackers
08. Nhận biết Functions, Arguments, và Variables
09. Các cách thức bảo vệ của phần mềm
+ 09.1 C – Dilla SafeDISC
+ 09.2 SalesAgent
+ 09.3 SecuROM
+ 09.4 softSENTRY
+ 09.5 TimeLOCK
+ 09.6 Vbox
10. Bitmanipulation
Phụ lục :
+A. Những ý kiến chung về Cracking
+B. Những câu hỏi thường gặp
*******************************************
00. Giới thiệu
========
Bài viết là 1 cuốn “bí kíp” được tích lũy từ những kiến thức “bí mật không thể bật mí “
cũng như các kinh nghiệm quý báu của các cracker trên thế giới, do đó những gì quan
trọng nhất mà 1 cracker cần phải biết đều có trong loạt tuts này.
01. Assembly for Crackers
================
Quote:
AND
Cú pháp : AND <đích>,<nguồn>
Tác dụng : thực hiện logical AND của 2 giá trị, thay thế đích với nguồn
Ví dụ : AND BX,03h
Quote:
CALL
Cú pháp : CALL address
Tác dụng : đưa vào stack lệnh next. Sử dụng cho việc gọi hàm
Ví dụ : CALL 10284312
+ Gọi function tại địa chỉ “address”, sau khi function kết thúc, đoạn code ngay phía dưới
lệnh call sẽ được tiếp tục
Quote: