Hôm nay tui đang hứng viết về SI, đúng là cây M16 này thật tuyệt vời các bạn ạ. Ai chê thì chê chúng ta cứ học tiếp và nghiên cứu tiếp về nó, càng nghiên cứu càng thêm hưng phấn , càng thấy nó “ngầu” kinh dị!.
Mặc dù viết tut này xen vào đây làm gián đọan lọat tut “The Complete....”. Như thiết nghĩ đến giờ phút này bạn cũng sẽ hiểu những gì trong tut này diễn tả. Và nhìn lại thì thấy cũng logic sẽ ko làm cho các Newbie hỏng chân khi học crack.
Vài lời tâm sự bây giờ tiếp tục:Những mánh khóe này tui chộp được của RHAYADER ( tui là chuyên gia dịch tut mà), các bạn đừng nghĩ là tui sáng chế ra nhé. Thật tình đến giờ phút này tui chỉ nghĩ ra được 1 tut là “Đặt bp trong W32DASM dùng cho pp Stack”, nhưng hôm nay sau khi mò mẫn trên NET thì thấy cái này người ta phát hiện ra lâu rồi. (Buồn 5 phút). Nhưng ko sao, hôm nào rãnh tui sẽ dịch các lọat tut về W32DASM cho nó hòan chỉnh thành 1 sêri luôn. (Ước mơ nhiều, thất vọng nhiều vì trình độ có hạn, hihi). Vào đề thôi:
Như tut 2B tui đã tóm tắt tòan bộ diển tiến căn bản để crack 1 soft bằng SI. Tức là chúng ta đã cầm trên tay cây M16 giống hacnho, và đã biết bóp cò như thế nào rồi.Nghĩa là chúng ta đã biết sử dụng sơ qua về SI rồi. Bây giờ chúng ta tiếp tục học các mưu mẹo khi sử dụng cây M16 này. Càng nghiên cứu về nó chúng ta càng mê nó còn hơn mê chị hàng xóm (Chị hàng xóm kế bên nhà tui đẹp cực kỳ) . Bây giờ chúng ta điJnữa vào các kỹ thuật “điêu luyện” của SI thôi:
Mục đầu tiên tui muốn nói , đó là:
1-Các điều kiện khi đặt breakpoint cho SoftICE:
Kinh nghiệm mà tui rút ra được trong thời gian đầu mới học Cracking là tui thường hay đặt bp (Cho tui viết tắt breakpoint thành bp để viết tut cho mau đó mà!) trong SI bằng lệnh BPX và các hàm hay dùng là GetDlgItemTextA và GetWindowTextA cho bất cứ chương trình nào cần tìm serial. Khi nhập 1 password dzỡm vào thì tim tui đập thình thịch và hy vọng SI sẽ bắn vào mặt tui, tui sẵn sàng hứng lấy nó bạn ạ ,nó “pop up” ra màn hình thì tim tui mới bình thường được, hì hì (dùng vài chử tiếng Anh như ‘pop up’cho nó trí tuệ). Vấn đề ở đây là như tut 2B tui đã nói, sau khi tui đấm cái phím F12 liên tù tì , thì tui thường bị lạc vào bên trong code. Điều mà tui sắp nói đến đây thật là kinh ngạc cho các Newbie, khi dùng F12 để trace đến mã chương trình cần crack thì chúng ta đã dững dưng với đọan text password mà chúng ta đã nhập vào đang nằm trong buffer ( bạn cứ hiểu buffer một cách nôm na là bộ nhớ đệm khi computer chạy chương trình).Với buffer ta có thể dùng lệnh đặt bp trong SI là BPR hay BPM để theo dõi nó xem khi nào thì chương trình “chạm” đến nó tiếp. Đọan này hơi khó hiểu các bạn cứ đọc lại vài lần chừng nào hiểu được thì hảy đi tiếp nhe.
Sau khi vọc SI từa lưa, cuối cùng tui đã tìm ra cách tốt nhất để sử dụng nó. (Điều này nằm trong chương 7 của User Guide). Tui khuyên bạn cũng nên đọc qua chương 7 này. Nếu bạn là người mới bắt đầu học SI thì những điều trong chương 7 rất khó hiểu. Nhưng, hê hê, trong các Forum về crack thì hay nói về nó. Rồi đây bạn sẽ biết tại sao tui nói thế. )J(Vì trong Forum này tui nói về nó đây
Mục đích tui muốn hướng dẫn bạn ở đây là bắt SI chỉ cho ta biết những gì nằm trong buffer hiện đang ở address nào trong bộ nhớ khi sử dụng 2 hàm Win32 API mà tui sẽ đề cặp dưới đây.Tui sẽ dùng cách đặt bp linh động để làm được điều đó như sau:
a/ Hàm GetWindowTextA:
Hảy xem cái hàm đầu tiên GetWindowTextA, nó khai báo như sau:
int GetWindowText( HWND hWnd, LPTSTR lpString, int nMaxCount );
Đầu tiên GetWindowText truyền tham số theo khai báo stdcall . Điều đó có nghĩa là “đối số” của hàm (như HWND hWnd, LPTSTR lpString, int nMaxCount ) sẽ được Push vào trong Stack từ phải sang trái (ESP sẽ được định vị lúc này). Trước khi đọan mã đầu tiên được thực thi thì SI sẽ pop up (nhảy bổ ra), và EBP stack chưa được set up ở đây. Vì vậy chúng ta có thể dùng ESP đã được định vị đến các đối số khi SI pop up . Ớ đây, ta muốn biết Stack sẽ như thế nào khi SI pop up:
[ESP+0Ch] - nMaxCount
[ESP+08h] - lpString ---------Chuổi nhập vào ở đây
[ESP+04h] - hwnd
[ESP+00h] - return EIP
Khi hàm thi hành, GetWindowTextA chắc chắn sẽ lấy dữ liệu text nằm trong stack là lpString để xử lý (LPTSTR là chuổi ký tự kết thúc có giá trị NULL). Vì vậy, chúng ta có thể sử dụng chức năng điều khiển gián tiếp của SI (Đó là ký tự * , giống như ngôn ngữ lặp trình C, xem thêm chương 8 của User Guide SI); Ví dụ như lệnh sau:
D*(esp+8)
Có nghĩa là : “Hiển thị trong cửa sổ “Data Window” của SI dữ liệu tại địa chỉ (esp+8)”.
Khi đó, ta có thể vận dụng chức năng thông dụng SI cho phép xài trong trường hợp này là:”esp->8”.
Vậy là tốt quá rồi, bây giờ chúng ta set bp như sau:
BPX getwindowtexta DO "D esp->8;"
Khi bạn nhấn F12, chúng ta “quay về” lời gọi hàm và text mà chúng ta nhập vào sẽ ngồi chểm chệ trên đỉnh cửa số data, còn chần chờ gì nữa hảy set BPR với nó đi , ha ha thật tuyệt vời. (Để biết mục đích đặt bpr làm gì xin bạn đọc lại tut 2B, chủ yếu là xem khi nào chương trình “chạm” đến cái password mà ta nhập vào)
Một câu hỏi đặt ra, tại sao chúng ta ko làm 1 lệnh đặt bp tự động để khi SI pop up thì hiện ra luôn mà ko cần đấm cái phím F12 túi bụi. Nếu các bạn muốn thử thì bạn có thể đặt bp như sau:
BPX getwindowtexta DO "D esp->8;P RET;"
Hy vọng là bạn thành công.
b/ Hàm GetDlgItemText:
GetDlgItemText khai báo như sau:
UINT GetDlgItemText( HWND hDlg, int nIDDlgItem, LPTSTR lpString, int nMaxCount );
Chỉ khác là nlDDlgItem, nó là ID điều khiển để lấy đọan text. Còn ý nghĩa của hàm trên như thế nào xin bạn xem tut 2C.
Trong Stack khi hàm thực thi như sau:
[ESP+10h] - nMaxCount
[ESP+0Ch] - lpString << Chuổi nhập vào ở đây
[ESP+08h] - nIDDlgItem
[ESP+04h] - hwnd
[ESP+00h] - return EIP
)Jvà bây giờ set bp ( Tui nghĩ bạn đã biết làm
BPX getdlgitemtexta DO "D esp->C;"
Well, mấy cái lệnh trên luôn là bạn “tri kỹ” của tui. Nếu bạn làm biếng ko muốn khi crack phải đánh mấy cái lệnh dài thườn thựơc này thì bạn hảy làm 1 cái macro cho nó trong SI đi. Nếu bạn muốn làm bạn hảy đọc chương 11 trong sách hướng dẫn sử dụng SI. Vì viết điều này nữa thì tut quá dài. Thông cảm nhe.
2. Thực hành đặt bp có điều kiện tìm keygen:
Chương trình mà chúng ta sắp “nhai đầu” ,đó chính là “Sweet Little Piano v 1.0”
Chính là chương trình mà ta “trảm” trong tut 1A.
Ứng dụng những gì chúng ta vừa học, hảy tìm serial đúng để nhập vào hộp password nhé.
-Đầu tiên bạn hảy uninstall chương trình khi đã lỡ cài và vọc nó trong tut 1A.
-Xóa thư mục : C:\ SWLIPI32\
-Install lại chương trình
Bây giờ chạy chương trình đi bạn. Nó sẽ bắn Nag , chúng ta bấm Ok vào mấy cái nag đó cho đến khi xuất hiện hộp nhập password.
Chúng ta nhập 1 password dzỡm vào ví dụ: ‘123456789’
Bật SI lên (CTRL+D) và set bp như sau:
BPX getdlgitemtexta DO "D esp->C;"
Đóng SI lại. Bấm nút OK trong hộp thọai password.
Bùmmmmmmm....... SI pop up. Bấm F12 một lần sẽ đến mã chương trình
Bây giờ bạn hảy nhìn vào cửa sổ Data Window cửa SI phía bên tay phải có chuổi bạn nhập vào không( chuổi ‘123456789’)?. Khi tui chạy chương trình đầu tiên sẽ ko thấy gì. Các bạn cứ chạy lại và nhập lại pass đồng thời set bp như trên thử 1 lần nữa xem sao.Nếu vẫn ko thấy, các bạn làm như sau:
Đặt bp tương tự như trên. Chạy chương trình. SI nhảy bùm ra. Nhấn F12
Vẫn ko thấy chuổi ‘123456789’ trên Data Window. Thì bạn hảy đánh vào lệnh sau:
‘BD 0’ ---->bỏ tác dụng của bp trên
Đánh lệnh :
S 0 L FFFFFFFF ‘123456789’
SI báo chuổi của ta đang nằm trong địa chỉ : 0030:000018C1 (Máy của tui là addr như thế)
Đặt bp như sau:
BPM 0030:000018C1
Nhấn F5. SI sẽ ko ngắt tại addr trên . Và bắn nag bình thường.
Bây giờ bạn thóat chương trình.
Xóa các bp: BC *
Vào lại chương trình. Làm lại từ đầu. Đặt bp:
BPX getdlgitemtexta DO "D esp->C;"
Bùm, Bùm....
Sẽ thấy chuổi ‘123456789’ trên Data Window thôi. Tại sao như vậy thật tình tui cũng ko hiểu , tôi nghĩ chắc tại do cơ chế làm việc của SI ảnh hưởng đến cách lưu chuổi vào memery. Nếu các cao thủ biết xin chỉ giáo.
Bây giờ chúng ta hảy xem chuổi của chúng ta nhập vào ở địa chỉ nào trong bộ nhớ. Bạn hảy liếc sang bên trái của cửa sổ Data Window bạn sẽ thấy địa chỉ của chuổi chúng ta nhập vào thôi. Máy tui là:
0030:00411A08
Tiếp theo bạn hảy xóa bp đã đặt bằng lệnh:
BC *
(Hay dùng BD 0 để cho nó ko họat động cũng được)
Bây giờ tui đặt bp mới tại địa chỉ có chuổi chúng ta đã nhập vào như sau:
BPM 0030:00411A08
Mục đích của việc nhập bp như trên là khi chương trình lấy chuổi password dzỡm của ta đem so sánh với cái gì thì SI sẽ báo cho ta biết và ngắt chương trình tại đó.
Bây giờ bấm F5 đi bạn.
Đầu tiên chương trình ngắt tại đây:
Code:
* Referenced by a (U)nconditional or ©onditional Jump at Address:
|:00401254©
|
:0040125E 40 inc eax
* Referenced by a (U)nconditional or ©onditional Jump at Address:
|:0040124C(U)
|
:0040125F 803C0200 cmp byte ptr [edx+eax], 00------Ngắt tại đây
:00401263 75E9 jne 0040124E
:00401265 803C0100 cmp byte ptr [ecx+eax], 00
:00401269 7505 jne 00401270
:0040126B 33C0 xor eax, eax
:0040126D 5B pop ebx
:0040126E 5D pop ebp
:0040126F C3 ret
Với đọan mã trên ta suy luận như sau: password của chúng ta đang ở tại địa chỉ [edx+eax] được đem so sánh với 0. Vậy ở đây chưa tìm được số serial đúng. Ta bấm F5 tiếp.
SI ngắt chương trình lần thứ 2 ở đây:
SI ngắt chương trình lần thứ 2 ở đây:
Code:
* Referenced by a (U)nconditional or ©onditional Jump at Address:
|:00401263©
|
:0040124E 8A1C01 mov bl, byte ptr [ecx+eax]
:00401251 3A1C02 cmp bl, byte ptr [edx+eax] --------Ngắt chương trình tại đây
:00401254 7408 je 0040125E
:00401256 B801000000 mov eax, 00000001
:0040125B 5B pop ebx
:0040125C 5D pop ebp
:0040125D C3 ret
Hê hê, vậy là nó so sánh byte đầu tiên trong chuổi pass dzỡm chúng ta nhập vào tại addr [edx+eax] với byte đầu tiên tại addr [ecx+eax]. Và tui đóan rằng serial đúng đang nằm trong memory tại addr [ecx+eax] .
Làm sao biết serail đúng là gì, chúng ta dùng lệnh dump trong SI là ‘d’ để xem nhé.
Vì hiện tại eax=0 nên [ecx+eax]=[ecx]
Vậy ta đánh lệnh sau:
‘d ecx’
OK , bạn hảy nhìn lên cửa sổ Data Window của SI bạn sẽ thấy chuổi:
‘ZD6-KP8-B634’
Máy của bạn sẽ khác , ko giống thế đâu. Ghi ra giấy chuổi đó.
Hìhì, bây giờ thóat khỏi chương trình và nhập lại pass như sau: ‘ZD6-KP8-B634’
Hahaha, chúng ta đã tìm ra nó rồi. Hy vọng là bạn cũng tìm ra .
Có 1 điều tui muốn nói với các bạn là mỗi khi cài lại (bạn xóa hết thư mục C:\ SWLIPI32\ vì pass sẽ lưu trong 1 file chứa ở thư mục này) thì chương trình sẽ cho bạn 1 chuổi serial đúng khác, ko giống nhau đâu. Bạn hảy thử xem sao. Tại sao nó như thế , chúng ta tìm hiểu sao nhé.
Làm sao biết serail đúng là gì, chúng ta dùng lệnh dump trong SI là ‘d’ để xem nhé.
Vì hiện tại eax=0 nên [ecx+eax]=[ecx]
Vậy ta đánh lệnh sau:
‘d ecx’
OK , bạn hảy nhìn lên cửa sổ Data Window của SI bạn sẽ thấy chuổi:
‘ZD6-KP8-B634’
Máy của bạn sẽ khác , ko giống thế đâu. Ghi ra giấy chuổi đó.
Hìhì, bây giờ thóat khỏi chương trình và nhập lại pass như sau: ‘ZD6-KP8-B634’
Hahaha, chúng ta đã tìm ra nó rồi. Hy vọng là bạn cũng tìm ra .
Có 1 điều tui muốn nói với các bạn là mỗi khi cài lại (bạn xóa hết thư mục C:\ SWLIPI32\ vì pass sẽ lưu trong 1 file chứa ở thư mục này) thì chương trình sẽ cho bạn 1 chuổi serial đúng khác, ko giống nhau đâu. Bạn hảy thử xem sao. Tại sao nó như thế , chúng ta tìm hiểu sao nhé.
In bài này