Trước khi viết bài tut này em đã đắn đo rất nhiều về việc có nên post tut này hay không? Vì theo như bác Deux có lần đã nói chúng ta chỉ nên viết tut nếu thấy nó có nhiều điều mới mẻ, đặc sắc mà tut sau đây show toàn những kiến thức cũ rích về patch. Nhưng em nghĩ đối với một newbie việc đọc một tut hay or dở không quan trọng mà cái chính là có hiểu những gì tut đó truyền đạt hay không. Em nhớ những ngày đầu học Crack em chỉ khoái những tut về patch, patch giúp newbie làm quen với assembly, các lệnh Jump, các hàm Call nhưng quan trọng nhất là nắm được Logic của chương trình một khi hiểu được diều này thì bạn cứ crack thật nhiều thì sẽ hiểu được những gì các tut khó truyền đạt. Nhắc đến đây em lại nhớ đến bác Benina nhờ vào loạt tut "The Complete Cracking Guide For Newbiez"(link) em cứ làm đi làm lại và hỏi sau rồi cũng hiểu tuy lâu nhưng mà nắm chắc cái cơ bản thì về sau học sẽ nhanh hơn. Em học Crack tính đến nay chắc cũng được 4,5 tháng rồi nhưng vẫn chỉ biết patch 74, 75, NOP không biết bao giờ mới tiến bộ nữa :wassat:. Note1: các bác newbie nên có một ít kinh nghiệm s/d tool Olly và các khái niêm set Break Point(BP) thì đọc dễ hiểu hơn vì viết tut for newbie khó lém dù em cũng là newbie và đứng trên khía cạnh của newbie để viết tut này Cảm ơn các bác đã đọc vài dòng mở đầu, sau đây em xin đi vào phần chính: I. Introduce - Salamander có chức năng giống Windown Explorer nhưng tích hợp thêm nhiều chức năng hữu ích nên rất tiện lại nhỏ gọn. 1. Software: Servant Salamander ver 2.0 2. Download: hxxp://www.altap.cz 3. Target: C:\Progra~1\Servan~1\salamand.exe(Size: 996Kb) 4. Protect: use Key_file *.zip 5. Tool: PEiD, Olly, kWin32Dasm 6. Method: Patch II. Collects Info Các bác không nên xem nhẹ phần này vì nếu nắm bắt được đầy đủ thông tin ta sẽ xác định được mục tiêu cần crack nhanh hơn -> tiết kiệm được thời gian, công sức. Scan = PEiD biết được soft ko bị pack, language = Microsoft Visual C++ 6.0 [Debug]. Start soft thì bị ngay cái NAG đập vô mặt bắt Đăng Ký, sau 5 giây nó mới Enable nút OK để ta vào chương trình chính(nghĩ ngay tới hàm GetSystemTime). Mở Menu Help chọn About nó sẽ chỉ ta cách đăng ký như sau: Mở Menu Help chọn Import Registration Keys sau đó chọn Key file *.zip để đăng ký. Trong quá trình này ta sẽ biết được các thông tin quan trọng: Quote: 1. Key file *.zip chứa thông tin đăng ký gồm 2 phần, menu About sẽ lấy 2 phần này để hiển thị ra các thông tin như: - Servant Salamander is running : phần 1(Register or Unregister, numbers of licenses) - Registration Key: the valid Registration Key : phần 2(Kiểm Key có hợp lệ hay ko) 2. Từ 1. ta biết được không thể kiếm đâu ra mẫu key file để đăng ký nên chỉ còn cách Patch NAG vì soft không limit bất cứ chức năng nào nếu Remove được NAG là FREE 3. Để REMOVE NAG có 2 cách là: 3A. Triệt hàm call gọi đến nó. 3B. Triệt tham số(PUSH) tạo nên NAG. Và để 2 làm việc trên có lẽ s/d lệnh NOP là hay nhất(tất nhiên là còn những cách # mà em ko biết xin các bác chỉ giáo cho) III. Let's Crack Quote: Note2: Các bác nhớ nhé ở đây mục tiêu là tìm ra vị trí NAG để patch nên sẽ tập trung vào đi tìm nó, cũng nói luôn trong tut có một số phần giới thiệu về các tính năng của OllyDbg v10 xen kẽ với quá trình crack nên hơi dài các bác đọc ko nên "sốt ruột":D Crack cũng tương tự như bạn chơi trò "Cross Words" tìm ra các từ hàng ngang, dọc, chéo có nghĩa trong một bảng chữ cái lộn xộn quá trình tìm kiếm đó gọi là Search. Trong Crack người ta gọi đó là Trace, trace không chỉ dựa vào tay, mắt và brain mà phải sử dụng các Tool có nó việc trace sẽ trở nên dễ dàng hơn rất nhiều cho dù khối code lớn đến đâu. Trong tut này ta s/d Olly để trace, với Olly bạn có 2 cách trace là Trace tĩnh trước lúc ấn F9 và Trace động sau lúc ấn F9 hai kiểu trace này rất khác biệt. Ta s/d Trace tĩnh trong trường hợp cần search một address nào đó trong chương trình(lúc này trace = search) ấn Ctrl+G > nhập vào địa chỉ cần search > ấn Enter Olly sẽ đưa ta tới vị trí cần tìm, bạn nhảy tới nhảy lui bất cứ đâu trong soft đều như nhau. Còn Trace động! ta chủ yếu s/d nó để Crack bất kể bạn Patch hay Keygen khi này tức là sau khi ấn F9 bạn sẽ phải đi theo hướng nhất định mà cái soft được lập trình từ từ lần mò theo nó xem nó làm những cái gì. OK vậy ta sẽ bắt đầu với: 1. Trace tĩnh(trước lúc ấn F9) Load soft = Olly xong bao giờ việc đầu tiên cũng là Search for > All reference text string để tìm vị trí cái NAG trong mớ code khổng lồ, click phải chuột chọn Search for text nhập một từ nào đó nằm trong NAG và ấn Enter -> nhưng ko thu được kết quả gì, có lẽ lão coder cố tình giấu nó đi(Note3: nên chọn từ đặc biệt ít x/h trong soft để nhận được kết quả chính xác nhất). Vậy là Trace kiểu này ko ổn chút nào chẳng lẽ chịu bó tay sao :blink1:? No!!! ta sẽ: 2.Trace động(sau lúc ấn F9) - Bắt đầu: Search for > All intermodular calls nhằm tìm ra lời gọi tới các hàm DialogBoxParamA, MessageBoxA vì đây là các hàm tạo thành NAG Screen tìm được các hàm này đồng nghĩa với việc tìm ra được vị trí NAG. Sau khi mở window này lên ta sẽ thấy vô vàn là lời gọi tới các hàm nằm lộn xộn, để dễ tìm các hàm bên trên bạn bấm vào thanh nhỏ phía trên có chữ Destination để sắp xếp lại các call theo thứ tự alphabe và ta tìm thấy 5 lời gọi hàm USER32.MessageBoxA nhưng có tới 5 lận :sleeping: biết đâu là cái cần tìm? Ta sẽ dùng phương pháp loại trừ để giải quyết vấn đề này! bạn bấm vào một trong số 5 dòng > click phải chuột chọn Set breakpoint on every call to MessagBoxA ngay lập tức ở cột address thấy 5 dòng này đỏ rực lên khi này ta đã bặt BP lên các lời gọi hàm MessageBoxA, mục đích của nó là sẽ dừng chương trình lại sau khi ấn F9 nếu gặp bất cứ lời gọi hàm nào trong 5 call trên để tìm ra hàm gọi NAG. Trở lại màn hình chính và ấn F9 nhưng khi NAG xuất hiện mà Olly chẳng dừng soft lại => chứng tỏ mấy lời gọi hàm trên không gọi NAG cần tìm(để chắc ăn tốt nhất bạn nên set BP trên tất cả các call tới hàm có chữ GetMessage và kiểm tra hơi thủ công nhưng biết đâu lại gặp may :D). Thật không dễ gì mà lần ra NAG, NAG ơi đuôi mày ở đâu để tao tóm Trace động là mảnh đất rất phong phú để ta khai thác các cách tìm NAG vì lúc trace nó đưa ta đến rất gần địa diểm cần tìm. Em xin trình bày cách patch theo 3A và 3B mà em học được từ REA : 3A. Animate Over(Ctrl+F8) kết hợp set BP - Giới thiệu tính năng Animate Over(Ctrl+F8)(reference): Quote: Chức năng này như sau: Trace từng dòng lệnh mà ko vào hàm call ‘soi mói’ (trace over) một cách “chậm chậm “ và trong cửa sổ code của CPU hiện ra quá trình khi trace.Chức năng này tui gọi tóm tắc là TraceO động Tui hay sử dụng chức năng để đi dến các đọan code bắn Nag đó các bạn. OK, bây giờ thử xem sau: -Load lại chương trình Ctrl+F2 -Bấm Ctrl+F8 : traceO động. Nó bắn ra Nag đúng ko -Bây giờ trở lại Oll, đừng bấm F12 nhé. Ta thấy Oll ngừng tại đọan code sau để chờ ta bấm phím OK(chúng ta lợi dụng chức năng này để tìm ra Nag) Sẽ có bác hỏi tại sao phải kết hợp với set BP câu trả lời là không phải lúc nào Ctrl+F8 cũng đưa ta đến đúng địa điểm mà cần phải qua thêm 2, 3 chặng BP nữa thì mới đến đích. - Bắt đầu: Ấn Ctrl+F2 để load lại soft trở về trang thái ban đầu(Note4: để tránh các BP lúc nãy set có thể gây kho khăn trong quá trình trace ta nên Remove nó = cách: ấn vào chữ B màu cyan trên thanh toolbar > click phải chuột vào của sổ BreakPoint > chọn Disable all hoặc Remove chúng đi cũng được) tiếp tục ấn Ctrl+F8 đợi vài giây Olly sẽ dừng tại: Quote: 0049D115 E8 BE6DFDFF CALL salamand.00473ED8 Rất có thể đây 0049D115 sẽ là address call trực tiếp tới NAG => NOP luôn: Click chuột phải > Binary > Fill with NOPs. Save lại thay đổi: Click chuột phải vào dòng vừa NOP > Copy to Executable > All modifications > Save All Chạy file vừa tạo xem kết quả -> thấy gì? NAG vẫn còn chơ chơ :sick: thất vọng + mệt mỏi -> Bạn muốn buông xuôi không? Ấy chớ tôi khuyên bạn nên ngồi nghỉ 1 chút nghe nhạc, uống nước, tập mấy động tác cho đỡ mỏi nếu bạn đã sẵn sàng thì chúng ta tiếp tục thôi :-o nhưng tiếp theo ta sẽ phải làm gì đây? Olly đã dẫn ta tới đây 0049D115 một hàm call, call có nghĩa là gọi nhưng nó gọi cái gì? đây salamand.00473ED8 nó gọi tới địa chỉ này, mỗi bước đi theo hàm call ta lại tiến gần tới cái NAG một bước nhưng làm sao để tới được đó? Để tiếp tục hành trình patch NAG ta sẽ phải đặt BP ngay tại 0049D115 và sau đó: Làm lại các bước: "Ấn Ctrl+F2 " cho đến khi Olly dừng lại tại điểm ta đặt BP 0049D115 ta sẽ ấn F7(tut) để trace into vào hàm này sau đó ấn Ctrl+F8 để Olly trace hộ ta và nó dừng soft tại: Quote: 00473F0E . E8 02F3FFFF CALL salamand.00473215 Làm lại các bước: "Rất có thể " Chạy file vừa tạo xem kết quả -> thấy gì? NAG vẫn còn chơ chơ vậy là lại phải làm thêm 1 lần nữa: Làm lại các bước: "Ấn Ctrl+F2 " cho đến khi Olly dừng lại tại điểm ta đặt BP 00473F0E ta sẽ ấn F7 để trace into vào hàm này sau đó ấn Ctrl+F8 Olly sẽ dừng soft tại: Quote: 004734A7 E8 047A0200 CALL salamand.0049AEB0 Làm lại các bước: "Rất có thể " Chạy file vừa tạo xem kết quả -> thấy gì? :w00t: NAG mất tiêu rồi ăn mừng đi thôi sau bao chặng đường gian nan cuối cùng cũng đã thành công mặc dù chưa trọn vẹn lắm. 3B. Patch tham số tạo NAG Ở trên ta đã làm hàm gọi NAG ngưng hoạt động, sau đây ta sẽ vô hiệu hóa NAG kể cả có lời gọi trên hay không: - Bắt đầu: Ấn Ctrl+F2 để load lại soft trở về trang thái ban đầu(chú ý Note4:) ta đặt 1 BP tại 004734A7 là điểm patch cuối cùng lúc nãy để Olly dừng soft tại đó: Quote: 004734A7 E8 047A0200 CALL salamand.0049AEB0 Ấn F7 trace into ta sẽ ở ngay đầu đoạn code tạo NAG: Code: 0049AEB0 /$ 0FB741 18 MOVZX EAX, WORD PTR DS:[ECX+18] <- v ệt sáng tại đây 0049AEB4 51 PUSH ECX ; /lParam 0049AEB5 68 16B04900 PUSH salamand.0049B016 ; |DlgProc = salamand.0049B016 0049AEBA FF71 1C PUSH DWORD PTR DS:[ECX+1C] ; |hOwner 0049AEBD C741 10 01000>MOV DWORD PTR DS:[ECX+10], 1 ; | 0049AEC4 50 PUSH EAX ; |pTemplate 0049AEC5 FF71 14 PUSH DWORD PTR DS:[ECX+14] ; |hInst 0049AEC8 FF15 7C954A00 CALL NEAR DWORD PTR DS:[<&USER32.Dial>; \DialogBoxParamA Để Patch ta sẽ làm như sau(reference): Quote: - Nguyên tắc căn bản là khi patch ta không làm cho chương trình lớn hơn hay nhỏ hơn: Tức là chương trình sử dụng lệnh nào đó bao nhiêu byte thì khi ta NOP , phảI NOP bấy nhiêu byte đó. - Khi NOP 1 hàm API nào đó ta phảI hiểu hàm đó như thế nào. Dùng win32.hlp để tra hàm đó, ở đây tui tra giùm bạn hàm MessageBoxA nhé: Code: int MessageBox( HWND hWnd, // handle of owner window LPCTSTR lpText, // address of text in message box LPCTSTR lpCaption, // address of title of message box UINT uType // style of message box ); - Hàm này có chức năng: Cài đặt, hiển thị , và họat động trong 1 hộp thọai. Giá trị trở về của hàm bằng 0 khi ko có đủ bộ nhớ để cài đặt hộp thọai. Viết lạI hàm cho bạn dễ hình dung như trong các ngôn ngữ cấp cao Pascal, C…. như sau: Code: MessageBoxA (handle, messagestring, titlestring, msgboxtype); - Chúng ta thấy hàm này có 4 tham số. Như bạn biết đấy , trong ngôn ngữ lập trình cấp cao muốn hàm tính tóan phảI truyền tham số cho nó , ở đây phảI truyền 4 tham số. Trong ngôn ngữ ASM , để truyền tham số cho hàm người ta sẽ truyền tham số vào trong STACK bằng cách dùng lệnh PUSH, rồI khi họat động hàm này sẽ vào STACK lấy tham số ra mà dùng.Có bao nhiêu tham số thì sẽ có bao nhiêu lệnh PUSH trước hàm. - Nguyên lý cơ bản để giết NAG trong tut này là chúng ta NOP hàm MessageBoxA để ko cho nó họat động. Khi NOP hàm này chúng ta cũng phải NOP các lệnh PUSH nhập tham số của hàm vào STACK. Vì ko NOP các lệnh PUSH này thì STACK sẽ là thùng rác mà Computer của bạn ko thể kiểm soát được. . 00 49AEB0 /$ 0FB7 41 18 MOVZX EAX, WORD PTR DS:[ECX +18 ] <- v ệt sáng tại đây 00 49AEB4 51 PUSH ECX ; /lParam 00 49AEB5 68 16 B04 900 PUSH salamand .00 49B 01 6 ; |DlgProc = salamand .00 49B 01 6 00 49AEBA. 00 49AEBA FF 71 1C PUSH DWORD PTR DS:[ECX+1C] ; |hOwner 00 49AEBD C7 41 10 01 0 00 >MOV DWORD PTR DS:[ECX + 10 ], 1 ; | 00 49AEC4 50 PUSH EAX ; |pTemplate 00 49AEC5 FF 71 14 PUSH DWORD PTR DS:[ECX +14 ]. dừng lại tại điểm ta đặt BP 00 473F0E ta sẽ ấn F7 để trace into vào hàm này sau đó ấn Ctrl+F8 Olly sẽ dừng soft tại: Quote: 00 4734A7 E8 04 7A0 200 CALL salamand .00 49AEB0 Làm lại các bước: "Rất