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.
29 trang |
Chia sẻ: tlsuongmuoi | Lượt xem: 2560 | Lượt tải: 0
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:
- Armadillo_tut_serie#2.pdf