Tải bản đầy đủ (.pdf) (246 trang)

Cracking part 10 docx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.13 MB, 246 trang )

Crack vài soft của www.zealot-soft.com

Quote:
Overview
Amor SWF to Video Converter is a powerful utility that supports to convert Macromedia
Flash SWF files to AVI or VCD / SVCD / DVD compatible MPEG files including movie
clips, action scripts and audio in the Flash movies. Also join many Swf files in one large
AVI or VCD / SVCD / DVD compatible MPEG file.Allow the human interaction on
Flash content during conversion, no skip frames and support 32bits RGBA alpha channel
video that can be directed imported by video authoring tool for composition.



Soft: Amor SWF to Video Converter
Homepage: />
Protection: ASPack 2.12 -> Alexey Solodovnikov
Language: Borland Delphi 6.0 - 7.0
Tools: Peid 0.94; OllyDbg 1.10 ; ImpREC 1.6
Cracker: backstrix

Giờ phong trào làm nhạc flash phát triển rộng rãi nhiều cái nhìn trông hay hay burn CD
tặng bạn bè cũng good lắm. Muốn vậy lại phải convert swf > video. Search được cái
Amor hay hay nhưng mà kiếm hoài hổng thấy crack của version mới toàn ver cũ không
hà mà ver cũ thì biết kím đâu giờ chứ. Nếu không đăng ký ta chỉ được dùng trong 7 ngày
thôi. Hơn nữa, nó thêm vào dòng chữ báo đây là bản dùng thử to đùng giữa file video sau
khi convert. Thôi thì giở olly ra xem xét tí vậy. Bắt đầu nào



PEiD đâu, ra nhờ tí nào. Úy giự
t cả mình ASPack 2.12 -> Alexey Solodovnikov. Thấy


AS lại tưởng aspr hehe may mà không phải. Thằng này thì nhanh gọn thôi. Load vô olly
Nó hiện ra cái bảng hỏi xem các pác có thích nó analysis nó tiếp không -> click Yes Các
pác sẽ ở đây
Code:
00563001 > 60 PUSHAD
00563002 E8 03000000 CALL swftovid.0056300A
00563007 - E9 EB045D45 JMP 45B334F7
0056300C 55 PUSH EBP
0056300D C3 RETN

Nhấn F7 trace into vào rồi chuột fải vào thanh ghi ESP và chọn Follow In Dump. Pác sẽ
thấy trong dump window, địa chỉ các pác break là 0012FFA4. Bôi đen 4 bytes đầu rồi
nhấn chuột fải chọn Breakpoint -> Hardware, On Access -> Dword
Nhấn F9 cho run 1 fát ta break tại
Code:
005633B0 /75 08 JNZ SHORT swftovid.005633BA; We're here
005633B2 |B8 01000000 MOV EAX,1
005633B7 |C2 0C00 RETN 0C

Đến đây là quá trình giải mã đã xong, chỉ việc trace vài fát nữa là nó sẽ nhảy đến cúa
OEP thui, F7 3 lần nó sẽ thoát khỏi quá trình giải mã soft trong memory và nhảy ngay
đến OEP = lệnh RET. Bấm Ctrl+A để analysis đoạn code này, ta thấy OEP của ta là:
004D8F60 .55 PUSH EBP
Khà khà ta đang ở OEP rồi, việc ta cần làm là dump nó ra 1 file trên đĩa cứng thui, chọn
Plugins -> Ollydump -> Dump Debugged Process bỏ chọn Rebuild import & ghi nhớ giá
trị ở ô Modify. Okie bấm dump lư
u lại với tên pác thích em chọn là dump.exe cho dễ nhớ
Giữ nguyên olly, run ImpREC mở bảng liệt kê process chọn file swf2video.exe. Nhập địa
chỉ OEP vào ô OEP. Sau đó nhấn "IAT AutoSearch" . Nhấn "Get Imports". Có duy nhất
1 chú mà lại là invalid. Chuột phải Advanced command > Get API calls. Hix một lô

valid:NO hiện ra nhức cả mắt. Nhấn Show invalid, chờ chút xíu. Okie giờ chuột phải
chọn Cut thunk(s) Xong roài, nhấn Fix dump và chọn lấy file dump hồi nãy. Run thử file
mới này, wow không crash vậy là unpack thành công. Scan lại bằng PEiD nó báo liền
Borland Delphi 6.0 - 7.0 Xong unpack giờ xử nó được gòi

Run thử soft xem nào một nag v
ăng luôn ra This software can only tray 7 day. Please
registration! Convert thử 1 file. Chài, một dòng chữ to oành ngay giữa file vừa convert.
Thế thì chán chết. Thử reg xem nào. Nhập N\S úm ba la chíu bùm Trời đất ơi Thank you
for registering Amor SWF to Video Converter,Please restart the program! Thế này thì
không mon men theo string được rồi phải dựa vào các hàm API thôi

Dựa vào cái câu Thank you for registering đểu giả này em đoán là nó lưu thông tin
vào registry hoặc một file nào đó rồi check khi restart chương trình. Ta thấy FU & FS
được nó lưu trong file .ini trong install dir. Hề, vậy là nó check file Biết thế đã, giờ load
nó vào olly. Chuột phải > Search for > All intermodular calls. Chuột phải típ >
Sort by > Destination để nhìn cho dễ. Giờ chạy đi ki
ếm hàm GetPrivateProfileStringA.
Sau khi kiếm được rồi, pác hãy RightClick tại 1 hàm bất kì và chọn Set breakpoint on
every call to GetPrivateProfileStringA ta có tất cả 3 hàm thôi không nhiều nhặn gì. Xong
nhấn F9 run soft nó break tại hàm đầu tiên, ngó nghiêng chả thấy gì quan trọng cả, F9 típ,
cũng thía. Pác cứ F9 đến khi nào thấy mí cái này bên cửa sổ Register thì dừng lại

ECX 004D8BC8 ASCII "Pass"

hehe cái này hay đây. F8 trace over nào, chắc cái hàm kiểm tra serial của ta nó nằm
quanh đây thôi. F8 một hồi, ta đến đoạn code sau
Code:
004D905C |. A1 E4CA4D00 MOV EAX,DWORD PTR DS:[4DCAE4]
004D9061 |. 8338 00 CMP DWORD PTR DS:[EAX],0

004D9064 0F84 EE000000 JE dump_.004D9158

Hà, có vẻ khả nghi. Ta sẽ dừng lại tại đây xem xét một chút. Ta thử patch je > jne để
xem nó thế nào nhé. Save lại thành file mới với tên 1.exe. Run thử file này oh nag không
còn nữa form register đã bị disable. Và cái dòng chữ đáng ghét ở giữa file video cũng
không còn. We have successfully patched the registration check! :d


Creating an Inline Patch:
Inline Patch được s/d khi ta muốn Patch một chương trình bị Pack mà không muốn
Unpack nó. Chúng ta thay đổi program sao cho tại đoạn cuối của quá trình unpacking
thay vào việc nhảy tới OEP thì nó nhảy tới đọan code chúng ta tạ
o ra. Ta đưa đoạn code
này vào một "code cave". Đoạn code mà ta thêm vào ở thời điểm này sẽ Patch những chỗ
cần thiết khi mà program đạng được unpack. Sau khi program đã được Patch ta sẽ nhảy
tới OEP và run như chưa có chuyện gì xảy ra cả :d. Cái cần làm bây giờ là tìm được một
"nơi" trong program đã bị Pack để thêm đoạn code của ta vào. Nơi đó gọi là "code cave",
nó là một vùng của bộ nhớ(memory) trong chương trình đang còn trố
ng(empty). Việc tìm
Code cave tưởng chừng có vẻ khó nhưng thực ra lại rất chi là izì. Trong các files exe
thường thường đoạn mã bên trong một section không dùng hết toàn bộ section. Vậy thì
điều đó cũng có nghĩa ta sẽ s/d những khoảng trống này để viết code của ta. Chúng ta sẽ
đi lùng một code cave bên trong program này.(Nguyên văn của bác haule_nth trong loạt
tut trans của ARTeam)

Bắt đầu nào, load file swftovideo.exe vào olly. Hãy di chuyển scrollbar cho tới khi không
nhìn thấy dòng chỉ thị nào nữa thì lúc đó dừng lại Khi các pác tiế
p tục nhìn thấy những
dòng ADD BYTE PTR DS:[EAX],AL có nghĩa là các pác đang tiến tới gần cuối của
section. Lúc này tôi đã tìm thấy code cave của mình:

Code:
00563564 CB RETF ; Far return
00563565 15 E8770000 ADC EAX,77E8
0056356A 0000 ADD BYTE PTR DS:[EAX],AL
0056356C 0000 ADD BYTE PTR DS:[EAX],AL
0056356E 0000 ADD BYTE PTR DS:[EAX],AL
00563570 0000 ADD BYTE PTR DS:[EAX],AL
00563572 0000 ADD BYTE PTR DS:[EAX],AL

Các pác có thấy những dòng có 4 số 0000 dưới dòng chỉ thị cuối cùng ko? đó là nơi lý
tưởng để tạo code cave của chúng ta. Hãy scroll xuống chút nữa wow "bạt ngàn" những
dòng code như trên. Tôi bắt đầu viết code của tôi tại địa chỉ 0056359C. Nhưng tr
ước khi
viết code ta phải biết ta sẽ chèn đoạn code vào chỗ nào trong quá trình unpack chứ nhỉ.
Xem xét chút đã

Các pác có nhớ sau khi set hardware bp và nhấn F9 chương trình dừng lại tại đâu không.
Đó là một lệnh nhảy
Code:
005633B0 /75 08 JNZ SHORT swftovid.005633BA
005633B2 |B8 01000000 MOV EAX,1
005633B7 |C2 0C00 RETN 0C
005633BA \68 608F4D00 PUSH swftovid.004D8F60
005633BF C3 RETN

Okie rùi, ta sẽ thay đổi JNZ thành JMP cho nhảy đến code cave của ta sau đó mới nhảy
ngược lại 005633BA. Bắt tay vào việc nào

Còn nhớ ta đã thay đổi BYTE tại ADDRESS 004D9065 từ 84 thành 85. Vậy lệnh đầu
tiên ta viết sẽ là: MOV BYTE PTR DS:[004d9065], 85. Vậy là patch xong giờ thì ta cần

cho nó nhảy ngược về chỗ cũ lệnh jump sẽ viế
t như sau: JMP 005633BA. Lúc này code
cave sẽ như sau
Code:
0056359C C605 65904D00 8>MOV BYTE PTR DS:[4D9065],85
005635A3 ^ E9 12FEFFFF JMP swftovid.005633BA

Bây giờ bôi đen cả 2 dòng và ấn Right-Click rồi chọn Copy to Executable -> Selection.
Một cửa sổ mới hiện ra tại cửa sổ này ấn Right-Click và chon Save File -> Save file với
tên bất kỳ. Lệnh cuối cùng phải thay đổi đó là lệnh Jump ở giai đoạn cuối của quá trình
unpack để jump tới code cave vừa tạo. Đóng file hiện thời lại và mở file vừa tạo ra. Bây
giờ ta c
ần tới đoạn code gần cuối của quá trình unpack chính là đoạn JNZ mà ta phân tích
bên trên đó. Ta sẽ change lệnh jump này để nó để nó nhảy tới code cave. Để change ta
bấm SPACE -> trong Assemble box đánh JMP 0056359C rồi ấn Assemble. Right-Click
và chọn Copy to Executable -> trong cửa sổ đang mở hãy Right-Click lần nữa và chọn
Save File. Tôi save với tên là swftovideo_patch_inline.exe. Đóng Olly run thử, khà khà
phê quá, nó run ầm ầm.

Site này còn mấy soft khác cách patch cũng tương tự.

Em là super newbie vì vậy kiến thức của em vẫn còn rất hạn chế nên không tránh khỏ
i
nhầm nhọt chỗ này sai xót chỗ kia. Mong các bác chỉ giáo để em có thể khá hơn.

Mrangelx ()
Windows Cracking Tutorial (complete)

Chào các bác, em chỉ là 1 newbie nhưng hôm rồi đọc được bài viết này về SoftICE nên
hôm nay mạn phép translate ra cho các newbie đọc và nếu được cao thủ góp ý cho thì hay

quá :). Em mong bài này sẽ giúp ích được cho các bác vì em thấy bài viết này viết kĩ lắm.
Mong nhận được sự quan tâm của các bác để cùng nhau tiến bộ.

Bài viết : Windows Cracking Tutorial
Tác giả : ED!SON
Biên dịch : the_lighthouse
Trong bài có tham khảo bài viết của bác Hacnho. Thank a lot

************************************************** **************
Nội dung :
1. Giới thiệu về cracking
2. Giới thiệu về SoftICE/Win 2.00
3. Tìm đoạn code registration
3.1 Phầ
n mềm thực hành : Task Lock 3.00
3.2 Phần mềm thực hành : Command Line 95
4. Tạo keymaker cho phần mềm Command Line 95
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
6. Đôi điều về chương trình viết bằng Visual Basic
Phụ lục :
A. Làm thế nào để kiểm tra SoftICE đã load symbols ?
B. Cú pháp cho functions
************************************************** ***************

1. Giới thiệu về cracking
================
Cracking 1 chương trình Windows thường dễ hơn 1 chương trình chạy trong Dos, bởi vì
trong Windows rất khó mà che dấ
u bất cứ cái gì nếu như các bác xem kĩ phần thông tin.

Công cụ đầu tiên ( mà thường là duy nhất ) mà các bác cần là SoftICE/Win2.00, đó là
công cụ degug tuyệt vời của Numega. Có thể các bác cho là nó khó sử dụng ( mà em
cũng nghĩ dzậy ) vì nó thường làm Windows bị ice , nhưng trong bài viết này em sẽ cho
các bác thấy làm thế nào để sử dụng nó 1 cách hiệu quả.
2. Giới thiệu về SoftICE/Win 2.00
=====================
* How to install SoftICE :
Mặc dù điều này đã được rất, rất… nhìu tut nói rùi nhưng em cũng xin được nói l
ại (để có
ai chưa biết thì bây giờ biết :) ).
Các bác tiến hành install SoftICE như bình thường ( bằng cách nhấn vào file Setup ), khi
được hỏi số serial thì bác gõ số serial vào ( thường kèm theo sẵn ) nhưng nếu ko có thì
các bác có thể tham khảo số serial ở đây :
+ SoftICE 3.24 : 1900-0000DD-9B
+ SoftICE 4.0 : 5419-00009D-DF
+ SoftICE 4.05 : 5109-0122DF-FF
Sau đó các bác típ tục cài đặt cho đến khi hiện bảng thông báo các bác có muốn restart lại
máy không , các bác khoan hãy ấn Yes mà hãy dùng Notepad ( hay chương trình soạn
thảo nào cũng được ) để mở file winice.dat trong thư mục vừa cài đặt SoftICE. Các bác
tìm dòng INIT=”WR;X;” ( hoặc có thể là INIT=”X;” ) ở gần đầu file và sửa thành
INIT=”WD;WR; WL;CODE ON;X;”. Sau đó các bác kéo xuống gần cuối file tìm các
dòng sau :
; ***** Examples of export symbols that can be inluded for Windows 9x *****
; Change the path to the appropriate drive and directory
;EXP=c:\windows\system\kernel32.dll
;EXP=c:\windows\system\user32.dll
;EXP=c:\windows\system\gdi32.dll
;EXP=c:\windows\system\comdlg32.dll
;EXP=c:\windows\system\shell32.dll
;EXP=c:\windows\system\advapi32.dll

;EXP=c:\windows\system\shell232.dll
;EXP=c:\windows\system\comctl32.dll
;EXP=c:\windows\system\crtdll.dll
;EXP=c:\windows\system\version.dll
;EXP=c:\windows\system\netlib32.dll
;EXP=c:\windows\system\msshrui.dll
;EXP=c:\windows\system\msnet32.dll
;EXP=c:\windows\system\mspwl32.dll
;EXP=c:\windows\system\mpr.dll
Và các bác hãy xóa hết các dấu ; ở các dòng này. Xong các bác save flie lại rùi restart lại
máy.

Để vào SoftICE, các bác ấn Ctrl-D. Và để sử dụ
ng SoftICE có hiệu quả, các bác nên để
các khung như thế này :
| |
|_____Registers____| Để chỉnh sửa khung này, các bác đánh R
| |
|___Data Window___| Các bác đánh D để xem address , đánh E để chỉnh sửa
| |
|___Code Window___| Đánh U để xem address , đánh A để chèn asm code
| |
|_Command Window_| Khung này để đánh lệnh và đọc kết quả
| |

Những phím quan trọng khác ( theo mặc định ) :
H/F1 : Online Help
F5/Ctrl-5 : Run
F8 : “bước” vào functions
F10 : “bước” qua functions

F11 : “bước” ra khỏi functions

3. Tìm đoạn code registration
===================
Chắc chắn đây là “con đường” dễ nhất để thực hành, để “có” 1 chương trình shareware
và đăng kí nó.

3.1 Phần mềm thực hành : Task Lock 3.00

Đây là 1 chương trình mà sự bảo vệ tương đối đơn giản, đó chỉ là 1 đoạn code mà không
bao giờ thay đổi.

3.1.1 Tìm hiểu về chương trình

Trước khi bước vào crack chương trình , các bác hãy trả lời 3 câu h
ỏi này nha :
1 - Đó là chương trình 16 hay 32 bit ?
2 - Làm thế nào để nhập số đăng kí ?
3 - Phần help có thể giúp gì chúng ta để tìm ra cách làm việc của registration không ?
Các bác hãy tự tìm câu trả lời cho các câu hỏi trên trước khi chúng ta típ tục nha. Em chờ
các bác đấy…
Xong chưa các bác ? OK, và sau đây là câu trả lời, các bác xem thử coi có đúng với câu
trả lời của các bác không nha ;)
1 – Đây là 1 chương trình 32 bit
2 – Các bác có thể nhập số đăng kí bằng cách gõ vào khung dialog khi các bác chọn
menu “Register!Register…”
3 – Và qua phần Help, các bác có thể biết được chương trình có 2 cách đăng kí :
Individual (
đăng kí cá nhân) và Site License (đăng kí tại site).
Thế nào, câu trả lời của các bác có đúng không ;) Nếu bác nào trả lời đúng hết thì em xin

chúc mừng vì “ các bác có mùi cracker rùi đấy “ ( sorry bác benina nha vì sử dụng câu
của bác mà chưa xin phép ;). Đọc đến đây em nghĩ chắc sẽ có bác thắc mắc rằng tại sao
phải trả lời câu hỏi 1 làm gì. Đúng là em thấy các tuts về SoftICE khác đều không nói về
vấn đề này. Vì sao ? Vì các tác giả viết sai? Không đâu. Thực ra việc trả lời câu hỏi 1 s

giúp cho việc crack của các bác đơn giản hơn nhiều. Lý do ư , xin mời các bác đọc típ sẽ
rõ. Hehehe…

3.1.2 “Bẫy” (breakpoint) các chuỗi code

Những đoạn code thường được nhập vào những box Windows Edit. Và để dừng các đoạn
code, SoftICE phải “đọc” được nội dung của các box Windows Edit này với “sự giúp
sức” của 1 trong các function (lệnh) sau :
- Đối với chương trình 16 bit : GetWindowText , GetDlgItemText
- Đối với chương trình 32 bit : GetWindowTextA , GetWIndowTextW ,
GetDlgItemTextA , GetDlgItemTextW
Giờ thì chắc các bác đã hiểu vì sao em bảo các bác trả lời câu hỏi 1 ở trên. Okie, giờ
chúng ta típ tục nha. À quên, em còn điều này chưa nói, các bác có thấy cái chữ cái A và
W trong các function của chương trình 32 bit không, no’ cho chung’ ta biết nếu function
sử dụng one-byte hay double-byte. Double-byte code là RARE. Đến đây chắc các bác đã
hỉu ý em: “If i only could break on GetWindowText” (cái này em xin để nguyên văn câu
của tác giả vì em chả bít dịch thế nào cả ;)
Để đặt breakpoint trong SoftICE , các bác vào SoftICE bằng cách ấn Ctrl-D, sau đó dùng
lệnh BPX cộ
ng với tên của function hoặc memory address. Vì TaskLock là chương trình
32-bit nên sẽ đặt breakpoint ở hàm GetWindowTextA. Nếu nó không làm việc, chúng ta
có thể thử hàm khác.
Trong khung Command Window của SoftICE chúng ta đánh
BPX GetWindowTextA.
Nếu các bác gặp lỗi “No LDT”, các bác hãy coi xem các bác có đang chạy chương trình

nào không ( tốt nhất là không nên chạy chương trình nào khi các bác dùng mở SoftICE ).
Đặc biệt nếu các bác dùng Norton Commander/Dos thì nó sẽ disturb function này. Các
bác có thể kiểm tra nếu các bác có bất kì breakpoint nào trong list breakpoint bằng lệnh :
bl
Nó sẽ hiện ra như thế này : 00) BPX USER32!GetWindowTextA C=01
Để ra khỏi SoftICE, các bác ấn Ctrl-D hoặc F5 hoặc dùng lệnh X.
Okey, các bác đ
ã bẫy bất kì lệnh gọi GetWindowTextA. Bây giờ các bác hãy nhập số nào
đó (ta gọi là FS nha) và ấn OK… chuyện gì sẽ xảy ra? Còn gì nữa, 1 cái nag văng ra nói
rằng bác nhập sai registration number. Nhưng như dzậy có nghĩa là sao, nghĩa là nó
không gọi hàm GetWindowTextA, vậy thì chúng ta sẽ thử với GetDlgItemTextA. Nhưng
trước hết chúng ta phải xóa cái breakpoint đã đặt đi đã. Vào SoftICE đánh : bc 0 , xong
chúng ta set breakpoint mới :
BPX GetDlgItemTextA
Chúng ta hãy thử lại nha

3.1.3 Làm việc với SoftICE

Oh, nó đã làm việc! Bây giờ chúng ta… uống ly nước
đã, em khát nước quá rùi ;))
OK, bây giờ chúng ta đang ở trong SoftICE , tại cái nơi mà function GetDlgItemTextA
bắt đầu. Để “nhảy” đến nơi mà nó được gọi, các bác hãy nhấn F11. Rùi, chúng ta đang ở
trong SGLSET.EXE , nếu các bác không biết thì các bác hãy nhìn vào dòng nằm giữa
khung code window và comand window, các bác sẽ thấy như thế này:
SGLSET!.text+1B13
Bây giờ các bác có thể disable breakpoint bằng lệnh : bd 0
Nếu các bác muốn enable nó lại thì các bác dùng lệnh : be 0
Các bác nhìn vào dòng đầu tiên trong code window :
CALL [USER32!GetDlgItemTextA]
Để thấy những lệnh ở trên, các bác nhấn Ctrl-Up. Nếu các bác không bít gì về Assembler

thì các bác hãy nhìn xuống đây :
RET Kết thúc function
PUSH EBP___________________________Bắt đầu function
MOV EBP,ESP
SUB ESP,0000009C
PUSH ESI
LEA EAX,[EBP-34] ___________________ EAX=EBP-34
PUSH EDI
MOVE ESI,ECX
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] _________Chúng ta đang ở đây

Em xin giải thích chút xíu : lệnh PUSH có nhiệm vụ lưu lại giá trị cho lần sử dụng sau.
Các bác chú ý vào 2 dòng màu đỏ. Nhìn vào đoạn lệnh trên chúng ta bít được địa chỉ của
text buffer đã được cất gi
ữ trong EAX, và EAX đó là EBP-34. Bây giờ chúng ta hãy nhìn
vào EBP-34, nó sẽ như thế này : d ebp-3
Chúng ta nhấn F10 đến khi thấy cái gì liên quan đến EBP-34, và nó đây (không bít có
giống của các bác không) :
LEA EAX, [EBP+FFFFFF64]_______________EAX=EBP-9C
LEA ECX, [EBP-34]_____________________ECX=EBP-34
PUSH EAX____________________________ Lưu EAX
PUSH ECX_____________________________Lưu ECX
CALL 00403DD0______________________Gọi function
ADD ESP, 08__________________________Xóa thông tin đã lưu
TEST EAX, EAX_________________________Kiểm tra function lần nữa
JNZ 00402BC0________________________Nhảy nếu không bằng 0


Theo em thì đây là 1 đoạn code so sánh, nó làm việc như thế này : Nhập vào 2 giá trị , trở
về 0 nếu 2 giá trị bằng nhau, còn không bằ
ng nhau thì khác 0.
Okey, cái gì nằm phía sau [EBP+FFFFFF64], do SoftICE không thể tự negative number,
nên để tìm giá trị thật của nó các bác làm phép tính như thế này:
100000000 – FFFFFF64 = 9C
Trong SoftICE , các bác cũng có thể thực hiện phép tính ấy bằng lệnh :
? 0 – FFFFFF64
Tại sao là 0 mà không phải 100000000 ( không lẽ 0=100000000 => điều này trái với các
quy tắt toán học ) ? Đó là số 100000000 qua lớn đối với SoftICE, nhưng khi ta thay
100000000 bằng 0 thì nó cũng cho kết quả như vậy.
Và bây giờ là lúc xem cái gì nằm phía sau EBP-9C ( hồi hộp quá ) , các bác làm như sau :
d ebp-9c
Ah, data window hiện ra cho chúng ta 1 dãy số - registration number đây ư ? không đâu (
mà sao cái số này giống cái số mà hồi nãy ta nhập vào quá hen ) . Các bác có nhớ đoạn
code ở trên không, nó so sánh 2 số : 1 là số ta nhập vào , còn số thứ 2 chính là registration
number. Do vậy chúng ta tiếp tục “nhảy” với F10 nha ;) ( cố lên các bác , thằng
TaskLock sắp là của các bác rùi đấy) . Và chúng ta sẽ đến đoạn code này đây ( nó giống
đoạn code ở trên đấy các bác ạ ) :
LEA EAX, [EBP-68] ____________________EAX=EBP-68
LEA ECX, [EBP-34]_____________________ECX=EBP-34
PUSH EAX____________________________Lưu EAX
PUSH ECX____________________________ Lưu ECX
CALL 00403DD0________________________Gọi function
ADD ESP, 08_________________________Xóa thông tin đã lưu
TEST EAX, EAX________________________Ki
ểm tra function lần nữa
JNZ 00402BFF _______________________Nhảy nếu không bằng 0


Và các bác hãy chú ý đến dòng LEA EAX, [EBP-68] , nó dấu cái gì vậy ? Thui thắc mắc
làm cái gì, ta dùng lệnh d là biết nó dấu gì thui mà. Nào, các bác đánh cùng em nha : d
ebp-68
Hehehe, đây rùi, cuối cùng thì cái registration number nó cũng vác mặt ra !!!

3.2 Phần mềm thực hành : Command Line 95

Đây là 1 chương trình khá dể, nó chỉ dùng 1 đoạn code đơn giản để tính số serial, do đó
chúng ta sẽ dùng nó để làm ví dụ.

3.2.1 Tìm hiểu về chương trình

Sau khi kiểm tra (cách kiểm tra xem ở phần tr
ước), các bác bít đây là 1 chương trình
32bit, và nó yêu cầu chúng ta nhập tên đăng kí và registration trong 1 hộp thoại.
Okie, sau khi bít những thông tin “quý báu” trên, chúng ta sẽ đến bắt đầu “bẫy” nó.
Hehehe dzui qua’ ;))

3.2.2 “Bẫy” các chuỗi code

Giống như với TaskLock “xấu số”, chúng ta sẽ đặt breakpoint. Chúng ta có thể set
breakpoint cho cả 2 function : GetWindowTextA và GetDlgItemTextA. Vào SoftICE
(đừng nói là các bác không bít vào nha, đọc đến đây rùi mà nỡ nói 2 chữ không bít là
buồn em lắm đó), rùi đánh :
BPX GetWindowTextA
BPX GetDlgItemTextA
Bây giờ chúng ta mở hộp thoại đăng ký ra, nhập tên ( gọi là FN – Fake Name ) và nhập
số
nào đó ( em nhập là 12345 và ta hãy gọi số này là FS – Fake Serial ), sau đó nhấn
OK…

Và… BÙM, SoftICE nhảy ra giữa màn hình tại function GetDlgItemTextA. Cũng như
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:
CMP
Cú pháp : CMP <left>,<right>
Left: là thanh ghi hay bộ nhớ
Right : là thanh ghi hay bộ nhớ hay trực hằng
Tác dụng : dùng để so sánh giữa toán hạng left và toán hạng right. Lệnh này Assemble sẽ
lấy toán hạng left trừ toán hạng right, kết quả được lưu trong các cờ mà không thay đổi
nội dung của 2 toán hạng trên.
Kết quả của phép so sánh :
+ Đối với số không dấu :
Left > Right=>ZF=0, CF=0
Left = Right=>ZF=1, CF=0
Left < Right=>ZF=0, CF=1
+Đối với số có dấu :
Left > Right=>ZF=0/1, OF=0, SF=0/1
Left = Right=>ZF=1, OF=0, SF=0
Left < Right=>ZF=0, OF=0/1, SF=1/0
Ví dụ : MOV AX, 6000h
CMP AX, -7000h
<=>6000h – (-7000h)
Đây là 1 lệnh quan trọng mà chúng ta cần quan tâm. Một vài chương trình s
ử dụng nó
kiểm tra, như là so sánh real serial với số serial ta nhập vào khi đăng kí, hay kiểm tra
chương trình đã được đăng kí hay chưa…

Và ta thấy lệnh này thường được đặt trước lệnh jump
Quote:
Flags
Về cơ bản , Flags giống registers ngoại trừ việc Flags chỉ có thể tồn tại true (đúng) hoặc
false (sai). Nó được set bởi những lệnh như CMP, và được dùng để kiểm tra kết quả lệnh
call. Ví dụ :
CMP AX, BX________So sánh AX và BX, nếu bằng thì cờ Zero được set là 0
JZ 00124531_______Nếu cờ zero đã được set thì nhảy đến địa chỉ 00124531
Quote:
INT (interupt - ngắt)
Cú pháp : INT <số ngắt>
Định nghĩa và tác dụng : ngắt là 1 tín hiệu được gửi đến bộ vi xử lý để tạm ngưng công
việc đang làm và xử lý 1 nhiệm vụ khác. Sau khi xử lý xong thì chương trình bị ngăt sẽ
tiếp tục lại.
Ví dụ : INT 21h ( gọi ngắt 21 của DOS )
Ở đây chúng ta có 2 loại ngắt là :
+ Ngắt cứng : được phát sinh bởi 1 mạch máy tính để đáp lại 1 sự kiệ
n nào đó. Nó được
dùng để điều khiển các thiết bị quan trọng như bàn phím, ổ đĩa, máy in
+ Ngắt mềm : được nhiều người lập trình sử dụng để yêu cầu các phục vụ hệ thống ngắt
mềm xảy ra khi chương trình gọi phục vụ ngắt bằng lệnh INT <interupt>
Bạn sẽ không thấy lệnh này khi debug chương trình window, nhưng nó “gây náo loạn”
khắp mọi nơi trong DOS. Thường các thông số vượt qua default registers( như AX, BX,
CX…)
Quote:
JMP
Cú pháp : JMP address
Tác dụng : tương đương với GO TO, nghĩa là nó sẽ nhảy đến address
Ví dụ : JMP 00402011
JMP là lệnh nhảy không điều kiện nhảy đến section của code.

Có rất nhiều sự khác nhau trong lệnh này, và quan trọng nhất là :
JZ______nhảy nếu cờ zero được set ( giống như JE )
JNZ_____nhảy nếu cờ zero không được set ( giống như JNE )
Và nó thường được đi theo sau lệnh CMP :
CMP RealSerial,FakeSerial_____so sánh real serial với fake serial do ta nhập vào
JNE ______________________nhảy nếu không bằ
ng
Quote:
LODSB / LODSW
Cú pháp : LODSB / LODSW
Tác dụng : load 1 byte hoặc 1 word từ DS:SI và đặt nó vào AL (đối với LODSB) hay vào
AX (đối với LODSW)
Ví dụ : LODSW
Hãy chuyển DS:SI points đến word mà đang giữ giá trị Ebh
LODSW
AX bây giờ sẽ chứa giá trị EBh
Lệnh này thương được sử dụng cùng với lệnh REP
Quote:
MOV
Cú pháp : MOV <đích>,<nguồn>
<đích>: chỉ có thể là 1 thanh ghi hay bộ nhớ
<nguồn>: có thể là thanh ghi, bộ nhớ hay hằng
Tác dụng : chuyển nội dung toán hạng nguồn vào toán hạng đích
Ví dụ : MOV AX,DX
Các bác sẽ thấy có rất nhiều lệnh này khi các bác step các đoạn code, về cơ bản (ngôn
ngữ BASIC) nó là LET đích=nguồn
Có rất nhiều biến thể khác bao gồm MOVSX, nhưng về cơ bản tất cả chúng đều làm 1
nhiệm vụ. Nó có thể giúp để có Intel Programming Specifications từ website của chúng.
Quote:
MOVSB / MOVSW

Cú pháp : MOVSB / MOVSW
Tác dụng : chuyển byte (đối với MOVSB) hoặc word (đối với MOVSW) từ DS:SI đến
ES:DI
Ví dụ : MOVSB
Hãy chuyển DS:SI points đến byte mà giữ giá trị 5h
MOVSB____lấy byte của DS:SI points và đặt nó trong ES:DI
Byte của ES:DI bây giờ có giá trị là 5h
Lệnh này thường được dùng với lệnh REP
Quote:
Registers
Registers là nơi mà chứa dữ liệu. Một điều duy nhất chúng ta lo lắng là: (E)AX, (E)BX,
E(CX), E(DX) (chữ E chỉ có ý nghĩa khi chúng ta debug 32bit-code.
Như vậy cặp registers là :
DS:SI____có thể được dùng như nguồn của chuỗi hoạt động
ES:DI____sử dụng như mục tiêu của chuỗi hoạt động
Việc hiểu registers không phải là quá quan trọng trong việc crack, các bác chỉ cầ bít nó là
những biến số để lưu trữ dữ liệ
u là được.
Quote:
REP ( Repeat String Operation)
Cú pháp : REP
Tác dụng : Lập lại dữ liệu trong CX register. Lệnh REP đặt trước MOVSB, LODSB hay
STOSB sẽ làm cho lệnh này lặp lại chính nó.
Ví dụ : MOV AL,Bh_____AL bao gồm bh
MOV CX,5h_____CX bao gồm 5h
REP STOSB_____copy giá trị của AL (ở đây là 5h) vào nơi mà DS:SI point 5 times và
increment SI.
Quote:
RET
Cú pháp : RET

Tác dụng : trở lại function
Ví dụ : RET
Các bác chắc đã thấy lệnh này ở cuối mỗi function, và nó chỉ đạo bộ xử lý máy tính trở
lại địa chỉ của lệnh call gọi function
Quote:
STOSB / STOSW
Cú pháp : STOSB / STOSW
Tác dụng : Lấy giá trị trong AL (STOSB) hoặc trong AL(STOSW) và đặt nó vào DS:SI
Ví dụ : STOSB
Giả sử AX chứa giá trị Ebh
STOSB____copy giá trị trong AX và đặt nó vào word của DS:SI. Lúc này DS:SI points
to word chứa Ebh.
Lệnh này thường được dùng với lệnh REP
Quote:
The STACK & PUSH / POP
Trước khi gọi bất kì function nào, chương trình phải “push” những thông số mà function
đang “chờ đợi” trên stack. Chúng ta giả sử nó như là 1 chồng bát, cái bát đặt vào đầu tiên
sẽ là cái bát lấy ra cuối cùng - ở đây stack cũng vậy. Chúng ta hãy cứ nhớ “vào đầu / ra
cuối” khi nhìn vào lệnh call, có nghĩa là thông số đó sẽ đảo ngược .
Nếu như các bác không hỉu những giều trên thì hãy nhìn vào ví dụ sau :
Windows API function GetDlgItemText yêu cầu các thông số sau:
(1) Handle of dialog box
(2) Identifier of control
(3) Địa chỉ của text buffer
(4) Chi
ều dài tối đa của chuỗi
Bởi vậy nên đoạn code có thể như sau :
MOV EDI,[ESP+00000220]_____get handle of dialog box trong EDI
PUSH 00000100____________PUSH (4)
PUSH 00406130____________PUSH (3)

PUSH 00000405____________PUSH (2)
PUSH EDI_________________PUSH (1)
CALL GetWindowText________Gọi function
Có dễ không các bác? Đây là 1 trong những ví dụ đơn giản nhất trong lĩnh vực crack đi
tìm số serial, nếu các bác biết được địa chỉ buffer của serial, trong trường hợp này là ở địa
chỉ 00406130 , các bác hãy set breakpoint nó và thường các bác sẽ kết thúc tại chuỗi tạo
real serial ;)
Quote:
POP dùng để remove first item khỏi stack, thường có rất nhìu trước khi function trở lại
chương trình

PHẦN 2 : SoftICE (Boot Menu, Setup, Commands)
02.1 Boot Menu
==========
Để chạy, SoftICE cần vài KB trong RAM của mỗi chương trình. Do đó, nếu máy bạn bị
“hạn chế” về RAM hoặc bạn không muốn SoftICE tự động load mỗi khi khởi động máy (
chả lẽ cứ vào msconfig tắt nó rồi khi nào cân dùng lại chỉnh lại rồi phải khởi động lại
máy nữa >rất phiền) mà phải “hỏi ý kiến” rồi mới dám “vào chơi với em windows” thì
bạn c
ần phải chỉnh sửa đôi chút trong AUTOEXEC.BAT và CONFIG.SYS. Các bác hãy
coi 2 file đó trong máy em rồi tìm cách sửa theo máy các bác nha :

AUTOEXEC.BAT:
goto %config%
:SICE
E:\CRACK\SOFTIC~1\WINICE.EXE
goto common
:NORM
goto common
:common


CONFIG.SYS :
[menu]
menuitem SICE,Load Soft-Ice
menuitem NORM,khong load SoftICE
menudefault NORM,5(5s là thời gian ngồi chờ các bác “cho phép”, nếu quá 5s mà không
thấy các bác trả lời thì windows sẽ típ tục load mà không load SoftICE, các bác có thể
thay đổi thời gian chờ đợi 5s này)
[SICE]
[NORM]
[common]
DEVICE=C:\WINDOWS\setver.exe
DOS=HIGH
FILES=40

02.2 Setup
=======
Cái này em đã nói nhìu rùi, bác nào chưa bít thì xem lại trong tut Window Cracking
Tutorial ( />)

02.3 Commands
==========
Dưới đây là danh sách các commands (lệnh) trong SoftICE. Các bác nên thuộc hết các
lệnh này là tốt nhất (mặc dù là nó hơi dài) vì các bác càng bít nhìu về SoftICE bao nhiêu
thì các bác càng dễ crack soft với SoftICE bấy nhiêu. ;)

Các lệnh cơ bản :
?______________________________Evulate Expression
A______________________________Assemble code
ADDR__________________________Display/Change address contents

BC_____________________________Clear Breakpoint
BD_____________________________Disable Breakpoint
BE_____________________________Enable Breakpoint
B______________________________List current Breakpoints
BPE____________________________Edit Breakpoint
BPT____________________________Use Breakpoint as a template
BPM, BPMB, BPMW, BPMD__________Breakpoint on memory access
BPR____________________________Breakpoint on memory range
BPIO___________________________Breakpoint on I/O port access
BPINT__________________________Breakpoint on Interrupt
BPX____________________________Breakpoint on execution
BPMSG_________________________Breakpoint on windows message
C______________________________Compare two data blocks
CLASS__________________________Display window class information
D, DB, DW, DD, DS, DL, DT_________Display memory
DATA___________________________Change data window
E, EB, EW, ED, EL, ET______________Edit memory
EXIT____________________________EXIT
F_______________________________Fill memory with data
FORMAT_________________________Change format of data window
G_______________________________Go to address
H_______________________________Help on specific function
HBOOT__________________________System boot (total reset)
HERE___________________________Go to current cursor line
HWND___________________________Display window handle information
M_______________________________Move Data
MOD____________________________Display windows module list
P_______________________________Step skipping calls, Int, etc
R_______________________________Display/Change Register contents
S_______________________________Search for data

T_______________________________Single Step one instruction
TASK____________________________Display windows task list
THREAD__________________________Display thread information
U_______________________________Un-Assemblers instructions
VER_____________________________SoftICE Version
WATCH__________________________Add watch
WHAT___________________________Identify the type of expression
WMSG ___________________________Display windows messages
X________________________________Return to host debugger or program

Những lệnh cấp cao :
CPU_____________________________Display CPU register information
GDT_____________________________Display global descriptor table
GENINT__________________________Generate an interrupt
HEAP____________________________Display windows global heap
LHEAP___________________________Display windows local heap
IDT_____________________________Display interrupt descriptor table
I, IB, IW, ID______________________Input data from I/O Port
O. OB, OW, OD____________________Output data form I/O Port
LDT_____________________________Display local descriptor table
MAP32___________________________Display 32Bit section map
MAPV86__________________________Display v86 memory map
PAGE____________________________Display page table information
PCI______________________________Display PCI device information
PEEK____________________________Read from physical address
PHYS______________________Display all virtual addresses for physical address
POKE____________________________Write to physical address
PROC____________________________Display process information
QUERY__________________________Display process virtual address space map
TSS_____________________________Display task state segment

STACK___________________________Display call stack
VCALL___________________________Display VxD calls
VM______________________________Display virtual machine information
VXD_____________________________Display windows VxD map
XFRAME__________________________Display active exeption frames

Mode Control :
FAULTS__________________________Enable/Disable SoftIce fault trapping
I1HERE__________________________Direct INT1 to SoftICE
I3HERE__________________________Direct INT3 to SoftICE
SET_____________________________Change an internal variable
ZAP_____________________________Zap embedded INT1 or INT3

Những lệnh chỉnh sửa :
ALTKEY_________________________Set key sequence to invoke window
ANSWER______________________Auto-answer and redirect console to modem
CODE___________________________Display insctruction bytes in code window
COLOR__________________________Display/Set screen colors
DEX____________________________Display/Assign window data expression
DIAL____________________________Redirect console to modem
FKEY____________________________Display/Set function keys
LINES___________________________Set/Display number of lines on screen
MACRO__________________________Define a named macro command
PAUSE___________________________Control display scroll mode
PRN_____________________________Set printer output port
SERIAL__________________________Redirect console
TABS____________________________Set/Display tab setting

Window Commands :
._______________________________ Locate current instruction

EC______________________________Enable/Disable code window
WC_____________________________Toggle code window
WD_____________________________Toggle data window
WF_____________________________Toggle float point stack window
WL_____________________________ Toggle locals window
WR_____________________________Toggle register window
WW_____________________________Toggle watch window

Window Control :
ALTSCR__________________________Change to alternate display
CLS_____________________________Clear window
FLASH___________________________Restore screen during P and T
RS______________________________Restore program screen

Symbole / Source Commands :
EXP_____________________________Display export symbols
FILE____________________________Change/Display current source file
LOCALS__________________________Display locals currently in scope
SRC_____________________________Toggle between source, mixed & code
SS______________________________Search source module for string
SYMLOC_________________________Relocate symbol base
TAB_____________________________Select/Remove symbol table
TYPES___________________________List all types, or display type defination

Back Trace Commands :
SHOW___________________________Display from backtrace buffer
TRACE__________________________Enter backtrace simulation mode
XT______________________________Step in trace simulation mode
XP______________________________Program step in trace simulation mode
XG______________________________Go to address in trace simulation mode

XRSET___________________________Reset backtrace history buffer

Special Operators :
._______________________Preceding a decimal number specifies a line number
$______________________Preceding an address specifies SEGMENT addressing
#______________________Preceding an address specifies SELECTOR
@______________________Preceding an address

PHẦN 3 : Breakpoint và Win API Details

03.1 Crippled Programs
================
EnableMenuItem
Hàm EnableMenuItem có nhiệm vụ enable, disable, hay gray 1 item nào đó trong menu
Code:
BOOL EnableMenuItem(
HMENU hMenu,_________________// handle of menu
UINT uIDEnableItem,____________// menu item to enable, disable, or gray
UINT uEnable__________________// menu item flags
);

Returns
Giá trị trả về sẽ chỉ rõ trạng thái trước đó của menu item (đó là MF_DISABLED,
MF_ENABLED hay MF_GRAYED). Nếu menu item không tồn tại, giá trị trả về sẽ là
0xFFFFFFFF

EnableWindow
Hàm EnableWindow có nhiệm vụ enable hoặc disable chuột và bàn phím input vào
specified window hoặc control. Khi input bị disable, window không thể nhận input như
click chuột và gõ phím. Khi input enable, window nhận tất cả input

Code:
BOOL EnableWindow(
HWND hWnd,________________// handle of window
BOOL bEnable_______________// flag for enabling or disabling input
);

Returns
Nếu window đã bị disable, giá trị trả về
là TRUE, ngược lại giá trị trả về là FALSE. Để
biết thông tin về lỗi, chúng ta dùng lệnh GetLastError.

03.2 Dialog Boxes
===========
CreateDialogIndirectParamA / CreateDialogIndirectParamW
Hàm CreateDialogIndirectParamA có nhiệm vụ tạo ra modeless dialog box từ dialog box
template trong memory. Trước khi display dialog box, function sẽ pass program-defined
value vào dialog box procedure giống như thông số Iparam của WM_INITDIALOG
message. Chương trình có thể sử dụng giá trị này để initialize (chạy) dialog box controls
Code:
HWND CreateDialogIndirectParam(
HINSTANCE hInstance,______________// handle of application instance
LPCDLGTEMPLATE lpTemplate, ________// address of dialog box template
HWND hWndParent,________________// handle of owner window
DLGPROC lpDialogFunc,_____________// address of dialog box procedure
LPARAM lParamInit_________________// initialization value
);

Returns
Nếu function succeed (tạm dịch là hoàn thành), giá trị trả về là handle của dialog box.
Còn nếu function fail (không hoàn thành), giá trị trả về là NULL, giá trị là 0xFFFFFFFF


CreateDialogParamA / CreateDialogParamW
Hàm CreateDialogParamA có nhiệm vụ tạo ra modeless dialog box từ dialog box
template resource. Trước khi display dialog box, function sẽ pass program-defined value
vào dialog box procedure giống như thông số Iparam của WM_INITDIALOG message.
Chương trình có thể sử dụng giá trị này để initialize dialog box controls
Code:
HWND CreateDialogParam(
HINSTANCE hInstance,____________// handle of application instance
LPCTSTR lpTemplateName, _________// identifies dialog box template
HWND hWndParent,_____________ // handle of owner window
DLGPROC lpDialogFunc,___________// address of dialog box procedure
LPARAM dwInitParam ____________// initialization value
);

Returns
Nếu window bị disable, giá trị trả về là TRUE, ngược lại giá trị trả về là FALSE. Để biết
thông tin về lỗi, chúng ta dùng lệnh GetLastError

DialogBox
Hàm DialogBox có nhiệm v
ụ tạo ra modal dialog box từ dialog box template resource.
DialogBox không return control cho đến khi specified callback function kết thúc modal
dialog box bằng cách gọi EndDialog
Code:
int DialogBox(
HANDLE hInstance,__________________ // handle of application instance
LPCTSTR lpTemplate,_________________// identifies dialog box template
HWND hWndParent,_________________// handle of owner window
DLGPROC lpDialogFunc ______________// address of dialog box procedure

);

Returns
Nếu function hoàn thành, giá trị trả về là thông số nResult trong lệnh call EndDialog
được dùng để kết thúc dialog box. Nếu function không hoàn thành, giá trị trả về là -1

DialogBoxIndirect
Hàm DialogBoxIndirect có nhiệm vụ tạo ra modal dialog box từ dialog box template
trong memory.
Code:
int DialogBoxIndirect(
HANDLE hInstance,___________________// handle of application instance
LPDLGTEMPLATE lpTemplate,____________// identifies dialog box template

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×