Cracking part 10

Chia sẻ: Dqwdasdasd Qwdasdasdasd | Ngày: | Loại File: PDF | Số trang:246

0
52
lượt xem
5
download

Cracking part 10

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Tham khảo tài liệu 'cracking part 10', công nghệ thông tin, quản trị mạng phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả

Chủ đề:
Lưu

Nội dung Text: Cracking part 10

  1. 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: http://www.zealot-soft.com/ 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
  2. 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:
  3. 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 đã
  4. 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 (http://www.reaonline.net) Windows Cracking Tutorial (complete)
  5. 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
  6. + 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
  7. 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
  8. - Đố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
  9. 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 (
  10. 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ư
  11. 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
  12. 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)
  13. strupr(buffer); code = ( ((unsigned long)buffer[0] * (unsigned long)strlen(buffer))
  14. 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 (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
  15. + 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 , 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:
  16. CMP Cú pháp : CMP , 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 Đị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
  17. mềm xảy ra khi chương trình gọi phục vụ ngắt bằng lệnh INT 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ỉ có thể là 1 thanh ghi hay bộ nhớ : 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
  18. 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
  19. 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:
  20. 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 (http://www.reaonline.net/forum/showthread.php?t=212) 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
Đồng bộ tài khoản