Nhận dạng + Unpack Debug Blocker dạng 1

Introduction: Chào các bạn trong phần trước tui chỉ giới thiệu sơ qua kiểu unpack Armadillo standard+anti dump, anti breakpoint, anti patch mem. Dạng này hiện tại có hai cách unpack. Thứ nhất là cách paste PE Header trong tut của tui, thứ hai là find+patch MAGIC JUMP mà tlandn đã đề cập. Trong quá trình unpack có thể linh động chuyển qua lại. Cách unpack này có nhiều biến thể mà tôi không có thời gian đủ để viết tất cả. Bạn phải chọn cho soft unpack một cách, kiên nhẫn là đức tính cần thiết để unpack armadillo. Trong tut này tôi sẽ hướng dẫn các bạn unpack một số target dùng kiểu protect Standard+Debugblocker.

pdf29 trang | Chia sẻ: tlsuongmuoi | Lượt xem: 2560 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Nhận dạng + Unpack Debug Blocker dạng 1, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Armadillo-Góp nhặt cát đá Phần II: Nhận dạng+Unpack Debug Blocker dạng 1 I. Introduction: Chào các bạn trong phần trước tui chỉ giới thiệu sơ qua kiểu unpack Armadillo standard+anti dump, anti breakpoint, anti patch mem. Dạng này hiện tại có hai cách unpack. Thứ nhất là cách paste PE Header trong tut của tui, thứ hai là find+patch MAGIC JUMP mà tlandn đã đề cập. Trong quá trình unpack có thể linh động chuyển qua lại. Cách unpack này có nhiều biến thể mà tôi không có thời gian đủ để viết tất cả. Bạn phải chọn cho soft unpack một cách, kiên nhẫn là đức tính cần thiết để unpack armadillo. Trong tut này tôi sẽ hướng dẫn các bạn unpack một số target dùng kiểu protect Standard+Debugblocker. Mời các bạn xem kiểu protect của Armadillo 4.30 Pro Full version: Method unpack cho kiểu protect này theo biết thì chỉ có một và được lưu truyền lại từ thời 1.x. Hai người tiên phong làm unpacker method này là ArmKiller và [LUNAR_DUST]. Trên NET hiện nay có hai forum tập trung các trùm Unpack armadillo là RCE board và Anticrack board. Method này được phổ biến trên RCE, bạn có thể tìm đọc ở Woodmann.net. Đọc thêm tại : Vậy DebugBlocker+CopyMem II là gì? Tui không bít nói vầy có đúng không nhưng theo kinh nghiệm thì có lẽ đúng : _Khi ta chọn option Debug-Blocker thì Armadillo sẽ hoạt động theo cách là nó sẽ tạo trên bộ nhớ hai tiến trình (process), hai tiến trình gọi theo dân IT là một process đóng vai trò là server, một process được tạo ra và quản lý bởi server gọi là client. Gọi theo dân cracker thì có lý hơn, một thằng là father một thằng là child hay son. Tiến trình cha sẽ điều khiển tiến trình con trong chế độ debug mode, khi load lên nó sẽ tạo một Debug Events, khi đó thằng cha sẽ unpack thằng con, tạo cho thằng con IAT, PE Header, sections bằng cách tạo file tạm (các ver 2.xx đổ về trước) hoặc xử lý trên bộ nhớ và chạy nó. Ta nắm lấy quá trình này để unpack nó bằng cách dùng breakpoint là hai API WaitForDebugEvent và WriteProcessMemory. BOOL WriteProcessMemory( HANDLE hProcess, // handle to process whose memory is written to LPVOID lpBaseAddress, // address to start writing to LPVOID lpBuffer, // pointer to buffer to write data to DWORD nSize, // number of bytes to write LPDWORD lpNumberOfBytesWritten // actual number of bytes written ); BOOL WaitForDebugEvent( LPDEBUG_EVENT lpDebugEvent, // address of structure for event information DWORD dwMilliseconds // number of milliseconds to wait for event ); II. Công cụ • OllyDBG 1.10 với các plugin: Hide Debugger 1.2.3f, Armadillo Process Detach Plugin v1.0, OllyDBG PE Dumper 3.0.3, Command Bar 3.10.109c đã patch bug với RE-PAIR 0.6 + AntiDetectOlly_v2.2.4. Một điều quan trọng là bạn chỉ được dùng các plugin kể trên, các plugin khác vui lòng đem cất chỗ khác. Nếu không bạn chẳng bao giờ attach được child process, treo máy luôn á. • PE Tools v1.5.600.2005 • Import REConstructor v1.6 FINAL • Script detect Debug blocker tôi soạn để tiện cho việc xác định kiểu protect này. Cách làm việc của script này khá đơn giản: Tìm signal 0000C085trong file để xác định. Khi xài phải ignore hết execptions. // Script for OllyScript plugin by SHaG - /* ////////////////////////////////////////////////////////////// // Armadillo's Debug Blocker Feature or CopyMEM2 signal detective // Author: hacnho mod from MEPHiST0s - ARMADiLLO DETECTiVE v1.00 // Email : hacnho@hotmail.com // Website: // OS : WinXP Pro SP1, OllyDbg 1.10 Final, OllyScript v0.92 // DaTe ReLeAsE: 14 July 2005 ///////////////////////////////////////////////////////////// */ var signalcheck var mem var time var nono gpa "OpenMutexA", "kernel32.dll" mov mem,$RESULT bp mem esto esto rtr sti bc mem gpa "time", "MSVCRT.dll" mov time,$RESULT bp time mov signalcheck,[eip] and signalcheck,0000FFFF cmp signalcheck,0000C085 //checking for debug blocker signal je db db: jne nono msg "This file is protected with Armadillo's Debug Blocker Feature or CopyMEM II." ret nono: msg "This file is not protected with Armadillo's Debug Blocker Feature or CopyMEM II." ret III. Manual Unpacking TUT#1: SnD UnPackMe_Armadillo4.00 -Standard+Debug-Blocker _Trước hết đề nghị các bạn chỉnh Options trong OllyDBG như sau, nếu không sẽ không attach được child process: _Khi ta làm việc bên process cha thì chỉnh như trên, khi làm việc với con thì chỉnh như sau: _Có ba method để làm việc trên process cha, một dùng script arma_detach.osc, dùng Plugin và dùng tay :d. Tui chỉ bàn đến dùng tay. Hai cái kia nó tự động làm, bạn chả cần làm gì cả, nhưng crash hơi nhiều, dùng tay cho chắc ăn . *.Sau khi dùng OllyDBG load target lên: *.Đặt breakpoint WriteProcessMemory, Shift+F9 hai lần (tuỳ target miễn làm sau ta thấy cửa sổ stack đã hiển thị hàm WriteProcessMemory đã load đến target của ta là OK: *.Ta chú ý đến dòng Buffer, nơi đây ta sẽ patch để nó jump đến EIP. Bây giờ bạn click phải vào dòng Buffer, chọn Follow in DUMP. Qua cửa sổ Dump, bạn sẽ thấy như sau: *.Định khối hai bytes này, Ctrl+E sửa lại thành EB FE: *.Bây giờ bạn đặt thêm một breakpoint nữa để hook quá trình mà tôi đã nói ở trên, thằng process cha sẽ tạo ra một DebugEvent.Ok, bp WaitForDebugEvent, Shift+F9, Ctrl+F9, F7. Quá hiểm :d. *.Tới đây có hai method để assemble: PUSH PID (PID = Process ID ) CALL DebugActiveProcessStop NOP Bạn có thể có được chính xác PID trong Olly Dbg, bằng cách Click vào File > Attach > Tại đó chúng ta sẽ có 2 file FlashFavourite đang running - chọn lấy correct Process mà nó không bị highlighted RED. Đây chính là PID mà chúng ta cần … Hoặc /*47E8BF*/ PUSH EAX /*47E8C0*/ CALL kernel32.DebugActiveProcessStop /*47E8C5*/ NOP (Giá trị EAX=1). *.Bạn nhấn F8 tới dòng NOP, dừng lại, quá trình làm việc trên process cha đã tạm thời kết thúc. _Bây giờ bạn mở một cửa sổ OllyDBG khác, chọn file->attach, chọn process có PID giống như bạn tìm ở trên (của tui là 83C). Nếu bạn cấu hình đúng như trên, thì attach một cái rụp. _Bây giờ bạn chỉnh lại OPTIONS trong OllyDBG giống như nói ở trên, nhấn F9, rồi nhấn F12. _Chắc hẳn bạn còn nhớ hai bytes gốc vừa patch ở trên. Nếu kô nhớ thì qua cửa sổ OllyDBG đang debug process cha, nhấn vào nút L, để xem lại: _OK, org bytes là 558B. Trở lại Olly debug process con, nhấn Ctrl+E, edit EB FE thành 55 8B. _Bây giờ bạn nhấn Alt+M vào Memory Map, đặt memory breakpoint on access tại sections text. _Shift+F9, bạn sẽ nhảy tới OEP. Để ý cái hàm call. _Khoái quá, tới OEP gòi. Chuyện này trở về fix Magic JUMP như standard version. Tới đây bạn sẽ có rất nhiều cách để dump, fix IAT. Cách paste PE Header, Find magic jump, thậm chí liều mạng như một cụ bên MP2K, dek thèm fix gì ráo, đế thêm một hàm vào, vậy mà cũng chạy . Phần trước tôi đã hướng dẫn các bạn một phương pháp unpack standard, phần này thêm một cái nữa là done. _ Okie, bây giờ bạn đóng cửa sổ OllyDBG của process con lại, restart OllyDBG process cha, làm các bước tương tự cho đến chỗ patch org bytes 55 8B. Tại đây bạn qua cửa sổ Memory Dump, Ctrl+G, nhập vào 460ADC, chọn 4 bytes đầu, đặt HardwareBreakpoint on write kiểu DWord. Nhấn Shift+F9 để run. Nhấn Shift+F9 lần nữa bạn sẽ ở đây: _Nếu làm tới đây, bạn đã khá lắm. Bi giờ trở lại code window, bạn cuộn ngược lên tìm hàm 00C08F45 FF15 6C23C100 CALL DWORD PTR DS:[C1236C] ; msvcrt._stricmp _Đây là dấu hiệu để chúng ta tìm Magic Jump. Vậy Magic Jump là gì. Bàn tới Ardmadillo ta thường nghe nói tới. Thật ra magic jump chính là cơ chế bảo vệ của armadillo là nó có tới hai IAT (Import Address Table). Khi bình thường nó xài IAT giả, khi bị công an bắt nó mới lòi cái IAT thật ra và thằng magic chính là yếu huyệt của nó. Magic Jump có vai trò trung chuyển, giúp armadillo dễ dàng chuyển qua lại giữa hai IAT. Nhiệm vụ của chúng ta là tìm Magic Jump để fix nó, giúp chúng ta có IAT gốc. Rất đơn giản như trò nhảy dây … _Rồi, dịch chuột lên trên chút bạn thấy hàm Call trên hàm stricmp, ghi nhớ địa chỉ của nó. _Lập lại một lần nữa: bây giờ bạn đóng cửa sổ OllyDBG của process con lại, restart OllyDBG process cha, làm các bước tương tự cho đến chỗ patch org bytes 55 8B. Tại đây bạn qua cửa sổ Memory Dump, Ctrl+G, nhập vào 460ADC, chọn 4 bytes đầu, đặt HardwareBreakpoint on write kiểu Word. Nhấn Shift+F9 : _Tại đây bạn nhấn Ctrl+G, nhập vào 00C08F2F, bạn sẽ nhảy tới đoạn code này: _Tại địa chỉ 00C08F2F, bạn click phải, đặt một HE (HardwareBreakpoint on Excution): _Như vậy ta có hai breakpoint, xoá HarwareBreakpoint on Write: _Nhấn F9, bạn sẽ nhảy tới đoạn code này: _Chúng ta cần patch hàm này, Enter tại 00C08F2F E8 2D01FEFF CALL 00BE9061 bạn nhảy vào trong hàm, Ctrl+E, đổi 55 thành C3: _Bấm ‘-‘, Bấm Ctrl+G, nhập vào địa chỉ của OEP: 4271B0, ta cũng đặt một breakpoint HE: _Oải quá, nhưng sắp kết thúc tut này rồi, bi giờ bạn lại xoá HE tại 00C08F2F: _Nhấn ‘-‘, bạn trở về hàm 00C08F2F E8 2D01FEFF CALL 00BE9061, nhấn F9, bạn sẽ break tại: _Wow, bây giờ DUMP FULL bằng PETools, nhớ chọn PID cho đúng: _kiểm tra file dumped_.exe, run tốt. Good work, unpacked successful! TUT#2: Evaluate Digital Challenge 4 - Armadillo 4.xx -Debug-Blocker. _Tut trên chúng ta test trên target là một unpackme. Tut này chúng ta test trên một soft coding bằng Delphi. Unpack chỉ khác một chỗ, nhưng phải tinh ý một chút. OK, go go go… _Load target lên: _Chúng ta sẽ sử dụng script cho lẹ, vào menu plugin, chọn script arma_detach.osc, OllyScript sẽ làm thay cho ta công việc thủ công by pass Debug Blocker Feature. Nếu bạn thấy trị EAX=1 là bạn đã thành công trong việc remove Debug Blocker! Done, bạn sẽ dừng tại đây: _Xem PID của process là bao nhiêu, của tôi là B0C: _Mở một OllyDBG khác lên, attach process có PID B0C, F9, F12 bạn sẽ ở đây: _Change EBFE thành 558B, Alt+M, đặt Memory Breakpoint on access tại Sections CODE. Shift+F9 bạn sẽ tới OEP: _Nhiều đoạn call quá, biết nhớ cái nào. Rồi, ta thấy đoạn Call đầu tiên. 00495520 E8 F714F7FF CALL DigitalV.00406A1C _Không như tut trên, soft này tui không bít nó chọn OPTIONS như thế nào tui phải dùng cách sau để tìm IAT. Ok, nhấn F8 trace down đến 495520, nhấn F7 để nhảy đến hàm này: _Trace down tiếp đến hàm 00406A28 E8 2BFFFFFF CALL DigitalV.00406958, nhấn F7 để trace into, ta nhảy tới đoạn code sau: _ Đây la lênh call đâu tiên tơi IAT, xem bô nhơ tai đo, ta thây: [0049A264]=00BFDC6B, không tồn tại một hàm nào cho lệnh nhảy này cả. Right click tại 00406958 -FF25 64A24900 JMP DWORD PTR DS:[49A264], chọn Follow In Dump>Memory Address. _Cuộn lên cho đến khi bạn gặp chỗ bắt đầu cuả IAT. _Cuộn xuống dưới đến khi gặp kết thúc cuả IAT. _Độ dài IAT = 49A893-49A168=72B _Chúng ta cần đặt một Hardware breakpoint on Write, Dword tại điểm khởi đầu của IAT 49A168. Đóng cửa sổ OllyDBG của process con lại, restart OllyDBG process cha, làm các bước tương tự cho đến chỗ patch org bytes 55 8B. Tại đây bạn qua cửa sổ Memory Dump, Ctrl+G, nhập vào 49A168, chọn 4 bytes đầu, đặt HardwareBreakpoint on write kiểu Word. Nhấn Shift+F9 để run. _ Nhấn Shift+F9 lần nữa bạn sẽ ở đây: _Cuộn chuột lên trên để tìm dấu hiệu cuả magic jump: _Ghi nhớ địa chỉ của lệnh call trước hàm msvcrt._stricmp là 00C158CA E8 A826FEFF CALL 00BF7F77. _Lập lại một lần nữa: bây giờ bạn đóng cửa sổ OllyDBG của process con lại, restart OllyDBG process cha, làm các bước tương tự cho đến chỗ patch org bytes 55 8B. Tại đây bạn qua cửa sổ Memory Dump, Ctrl+G, nhập vào 49A168, chọn 4 bytes đầu, đặt HardwareBreakpoint on write kiểu Word. Nhấn Shift+F9. _Tại đây bạn nhấn Ctrl+G, nhập vào 00C158CA, bạn sẽ nhảy tới đoạn code này: _Tại địa chỉ 00C158CA, bạn click phải, đặt một HE (HardwareBreakpoint on Excution), bây giờ xoá breakpoint on write đi, nhấn F9 bạn tới đây: _Chúng ta cần patch hàm này, Enter tại 00C158CA E8 A826FEFF CALL 00BF7F77, bạn nhảy vào trong hàm, Ctrl+E, đổi 55 thành C3: _Bấm ‘-‘, Bấm Ctrl+G, nhập vào địa chỉ của OEP: 495514, ta cũng đặt một breakpoint HE: _Yeah, yeah: _PETools Full Dump: _Fix IAT, Show Invalid, Cut Thunks. Run dumped_.exe. Oh my God, nó run, trước khi nó run, tui run trước nó . _Unpacked Success full. TUT#3: Destroy DWK 3.x – Armadillo 4.30 -Debug-Blocker. _Nhân dịp đọc cái tut anti DWK của lão tlandn, tui lục lại mấy cái project delphi cũ, thấy cái này hay hay, tui dùng Armadillo 4.30 Pro full pack lại với options như sau: _Cái này hoàn toàn các lão có thể làm theo phương pháp trên, thậm chí khi trace tới OEP (dĩ nhiên phải tìm ra IAT thật) các lão dump nó cũng chạy nữa . _Các lão làm sao mà cuối cùng ra vầy là OK: TUT#4: Unpackme – Armadillo 4.10 -Debug-Blocker+ 2 options. _Cái target này thật sự unpack kiểu kia cũng được nhưng nó khá rắc rối cho phần child. Phần father thì chúng ta làm hoàn toàn giống như các tuts trên, nhưng tui muốn giới thiệu cho các bạn một phương pháp khác cũng đi tới đích là remove được debug blocker như khá dài. Nếu bạn muốn lâu thì chọn phương pháp này. _Load target lên Olly, nhấn Alt+E, right click tại module target.exe chọn View Names. _Cuộn màn hình xuống kiếm hàm WriteProcessMemory, right click chọn Follow import in Disassembler. _Bạn sẽ tới đây, nhấn F2 đặt breakpoint tại 77E61A95 8BEC MOV EBP,ESP: _Shift+F9, Alt+F9 bạn tới đây: _Click phải tại 00428572 chon Follow in Dump> Immediate constant: _Nhìn xuống cửa sổ Dump ta thấy: _Ta 55 8B thành EB FE,: _Nhấn F9 để run, trong khi chương trình đang chạy, nhấn Alt+F1, nhập vào WaitForDebugEvent: _Olly dừng tại đây tại hàm WaitForDebugEvent, tiếp ta nhấn Alt+F9, tới đây: _Trở lại như xưa, nhấn Space để Assemble. _Xử xong thằng cha, giờ đến thằng con, Mở một Olly khác lên, attach, patch bytes, nhấn Alt+F1 nhập vào bp CreateThread, Shift+F9, Ctrl+F9, F7, Ctrl+F9, F7. Xong bạn tới đây: _Call EDI là một dấu hiệu nhảy tới OEP. Nhấn F2 đặt breakpoint tại 00A589CD. Nhấn Shift+F9, F7. He he, OEP. _Fix IAT làm tương tự tut 2. _Ok, done. TUT#5: SnD Unpackme – Armadillo 3.70a -Debug-Blocker. _Bạn tự viết vào đây! TUT#6: hacnho Unpackme – Armadillo 3.75a1 -Debug-Blocker. _Bạn tự viết vào đây! TUT#7: SnD Unpackme – Armadillo 4.10 -Debug-Blocker. _Bạn tự viết vào đây! _Bạn tự viết vào đây! TUT#8: SnD Unpackme – Armadillo 4.20 -Debug-Blocker. _Bạn tự viết vào đây! IV. Conclusion Hix, thế là xong một phần của dạng debug blocker. Dạng này thì muôn trùng, vì tui chỉ có bản pub cracked nên test vậy thôi, đụng soft Custom build sẽ khác đi chút ít. Mất 3h để write tut này. Hẹn gặp tui sau đề cập đến một số dạng đã làm cộng thêm CopyMEM II. Vừa qua có một số bạn gửi soft nhờ tui unpack dùm, hồi gửi thì anh này anh nọ, tui unpack xong gửi lại thì cả lời cảm ơn chẳng có, từ nay không nhận bất cứ request nào! Ai gửi tui report spam ráng chịu . Chúc thành công. Hẹn gặp trong series# với CopyMem II. GrEeTs Fly Out: Deux, INFINITE,Computer_Angel, Zombie, NVH(c),softcracker_vn, luucorp, Aaron, JMI, Canterwood, hhphong, R@dier, tlandn, , RCA, CTL, Moonbaby, kienmanowar, benina,TQN, the_lighthouse, Nini, hoadongnoi, dqtln, hosiminh, Nilrem, Teerayoot, Ferrari, Kruger, Kelvin, Devilz, anh_surprised ...and you ! Special Thanx Cracks Latinos. Merci FFF, RiF, N-Gen (closed), ICI-TEAM pour me-aider des connaissances du Game Cracking! Thanx to author of OllyDBG. To be continued... Written by hacnho (tutorial date: Sai Gon 24/08/2005)

Các file đính kèm theo tài liệu này:

  • pdfArmadillo_tut_serie#2.pdf
Tài liệu liên quan