với TaskLock, chúng ta nhấn F11 để trở về đoạn lệnh gọi function.. Để 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... Bây giờ
Trang 1vớ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
Trang 2SUB 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);
Trang 3strupr(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
Trang 4Tuy 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 (http://www.reaonline.net) 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
Trang 5+ 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:
Trang 6