3. Reverse Engineering trên Windows Mobile
3.1 Hàm APIs
Hàm APIs trên Windows Mobile nhìn chung tương tự như APIs trên Windows for x86. Các hàm quen thuộc với cr@cking như GetWindowTextW, GetDlgItemTextW, MessageBoxW... đều có trên WM. (Chú ý: API của WM hoàn toàn hỗ trợ Unicode). Chi tiết nội dung các hàm này có thể tìm trên MSDN.
Cách thức gọi hàm API cấp độ assembly (calling convention):
- Giá trị trả về được giữ trong thanh ghi R0 (tương tự như EAX trên x86).
- Các tham số từ trái qua phải được tải vào các thanh ghi từ R0 tới R3. Nếu nhiều tham số hơn, các giá trị được đẩy vào stack theo thứ tự từ phải qua trái. VD
Code: .text:00107DB8 LDR R1, =aClsid ; lpSubKey = "CLSID"
.text:00107DBC MOV R6, R0
.text:00107DC0 STR R3, [SP,#0x34+var_34] ;STR R3,[SP]; phkResult
.text:00107DC4 MOV R3, #0 ; samDesired = 0
.text:00107DC8 MOV R2, #0 ; ulOptions = 0
.text:00107DCC MOV R0, #0x80000000 ; hKey = HKEY_CLASS_ROOT
.text:00107DD0 BL RegOpenKeyExW
.text:00107DD4 MOVS R3, R0 ; test operation result
.text:00107DD8 BEQ _OpenFailed
3.2 Công cụ
a) Editor
Editor dành cho PE file trên Windows for x86 hoàn toàn có thể áp dụng cho Windows Mobile như LordPE, PE Explorer, Exe Scope, Stud PE…. Tuy nhiên, để thay đổi mã lệnh của PE file for WM thì hoàn toàn không thể sử dụng chương trình trên x86 như Hiew. Có hai cách để thay đổi mã lệnh (patch):
- Mã hóa lệnh bằng tay sang dạng binary, sau đó sử dụng một hex editor bất kỳ để sửa file binary.
Ví dụ, opcodes của một số lệnh rẽ nhánh như sau:
Code: Command Hex
B xxxxxxEA
BEQ xxxxxx0A
BNE xxxxxx1A
BGE xxxxxxAA
BHI xxxxxx8A
BLT xxxxxxBA
BCC xxxxxx3A
BCS xxxxxx2A
BPL xxxxxx5A
BMI xxxxxx4A
BLS xxxxxx9A
BGT xxxxxxCA
BLE xxxxxxDA
Chương trình này mang chức năng gần tương tự Hiew for x86. Download ChARMeD ở
http://carolos.za.net/software.html (nên dùng phiên bản cho x86 có chức năng sửa code assembly). Một số chức năng:
- Di chuyển tới offset của file exe: F5 -> nhập địa chỉ offset của file theo dạng số hexa.
- Thực hiện thay đổi mã lệnh tại địa chỉ hiện tại: Spacebar -> nhập mã lệnh mới.
b) Disassembler:
Công cụ disassembler cho Windows Mobile phổ biến và mạnh nhất là IDA Pro Disassembler. Vì các ứng dụng trên WM tuân theo định dạng PE file, cách thức disassemble tương tự như các chương trình trên Windows for x86.
c) Debuggers
Có hai debuggers được sử dụng chính trong WM. Debugger thứ nhất là EVC (Embedded Visual C++) của Microsoft. Đây là debugger cơ bản đầu tiên dành cho WM, có nhiều hạn chế so với debugger thứ hai là IDA Pro Disassembler phiên bản từ 4.9 trở lên. Do vậy, phần sau chỉ minh họa cách thức cấu hình và thực hiện debug bằng IDA Pro.
3.3 Debug trên Windows Mobile
Môi trường tiến hành debug bao gồm:
• Một PocketPC (hoặc sử dụng Windows Mobile Emulator của Microsoft).
• Microsoft ActiveSync: dùng để đồng bộ giữa thiết bị PPC (thiết bị thật hoặc Emulator ) và PC.
http://www.microsoft.com/windowsmobile/activesync/default.mspx
• Trình debugger: IDA Pro Disassembler 4.9 trở lên, có module debug cho WM:
wince_remote_arm.dll &
wince_stub.plw
Phần sau đây sẽ hướng dẫn cách cài đặt Windows Mobile Emulator:
Microsoft hỗ trợ nhiều phiên bản Device Emulator tương ứng với các Emulator Images của các phiên bản WM khác nhau. Các thế hệ emulator cũ chỉ mô phỏng cho CPU x86, các phiên bản mới gần đây giả lập hoàn chỉnh CPU ARM, cho phép chạy App như trên thiết bị thật. Có hai phiên bản Device Emulator:
- Version 1.0: dùng để sử dụng cho các Emulator Images của Windows Mobile 5.0 for Pocket PC và Windows Mobile 5.0 for Smartphone.
- Version 2.0: dùng để sử dụng cho các images của WM6.
Ở đây sẽ đề cập tới phiên bản WM5 và Emulator v1.0.
Download
- http://download.microsoft.com/download/c/b/b/cbb8bc58-07b9-46bb-86ba-d12bb0d9b1d9/V1Emulator.zip
- http://download.microsoft.com/download/c/b/b/cbb8bc58-07b9-46bb-86ba-d12bb0d9b1d9/efp.msi
- Virtual Machine Network Driver (VMNet)
: driver này có trong Virtual PC 2004 hoặc Virtual PC 2007. Nếu không muốn cài đặt Virtual PC, có thể download riêng VMNet
http://www.memphistech.net/tools/netsvwrap.msi.
Cấu hình
- Microsoft ActiveSync: menu File Connection Setting
- Khởi động “Device Emulator Manager”, sau đó khởi động “Pocket PC – Cold Boot”. (Sau khi đã lưu lại trạng thái của image, các lần sau sẽ chọn “Pocket PC – SaveState”). Đặt kết nối giữa Emulator và PC thông qua ActiveSync: right click như ở hình dưới, chọn Cradle:
Kết quả: