Tác giả: mfeng
Mục lục
1. Kiến trúc Windows Mobile
1.1. Quản lý bộ nhớ
1.2. Quản lý tiến trình
2. Kiến trúc hệ xử lý ARM
2.1 Thanh ghi
2.2 Mã lệnh (opcodes)
- Tập lệnh xử lý dữ liệu
- Tập lệnh copy dữ liệu
- Tập lệnh điều khiển, rẽ nhánh
3. Reverse Engineering trên Windows Mobile
3.1 Hàm APIs
3.2 Công cụ
- Editor
- Disassembler
- Debuger
3.3 Debug trên Windows Mobile
3.4. Case study 1: example1.exe
3.5. Case study 2: example2.exe
4. Kết luận
5. Greetings
6. Tài liệu tham khảo
--------
Bài viết này tổng kết những gì mfeng đã tìm hiểu về Windows Mobile với mục đích tiện việc tra cứu và tham khảo sau này .
1. Kiến trúc Windows Mobile
1.1. Quản lý bộ nhớ
Mô hình quản lý bộ nhớ của Windows Mobile khác hẳn so với các hệ điều hành Windows khác. Bộ nhớ được chia làm hai loại: ROM & RAM.
ROM chứa toàn bộ hệ điều hành và chương trình đi kèm hệ điều hành. Công dụng của ROM tương tự như một HDD trên PC, ngay cả khi cạn hết pin, dữ liệu trong ROM vẫn bảo toàn. Windows Mobile.NET ứng dụng Execute In Place (XIP) đối với các file DLL nằm trên ROM cho phép tiết kiệm lượng RAM so với trước kia. Đối với các file DLL thông thường nằm trên Flash Memory (SD card) hay RAM (phần Object Store), nội dung các file này cần copy vào RAM và thực thi.
RAM của Windows Mobile chia thành hai phần: Object Store và Program Memory. Object Store có tác dụng như một virtual ram HDD, dùng để chứa tạm thời chương trình và dữ liệu. Khi hết pin, dữ liệu trong Object Store sẽ mất. Program Memory mang công dụng tương tự RAM trên PC, dùng cho hoạt động của HĐH và chương trình.
Không gian bộ nhớ của Windows Mobile như sau [1]
Code:
Nửa trên 2GB từ 0x80000000 trở đi là vùng nhớ hệ thống (kernel space) dành cho hệ điều hành. Nửa dưới từ 0x00000000 cho tới 0x7FFFFFFF là vùng nhớ cho ứng dụng user (user space), trong đó phần trên 0x42000000 dùng để quản lý dữ liệu kích thước lớn như memory-mapped files (Ai đã biết lập trình Windows trên PC sẽ quen thuộc đối tượng này). Object Store cũng được ánh xạ trong vùng địa chỉ này. Phần dưới 0x42000000 chia thành 33 slots, kích thước mỗi slot là0x2000000 bytes (32MB).
Slot 0 quản lý tiến trình hiện hành, bao gồm [1]:
Code:
64KB đầu tiên chứa thông tin của HĐH về tiến trình; mã chương trình từ file exe được nạp từ địa chỉ 0x10000 (là ImageBase của các file exe trên Windows Mobile). Tiếp đó là Stack & Heap dành cho thread chính trong tiến trình. Các thư viện được nạp phần cuối vùng nhớ của slot.
1.2. Quản lý tiến trình
Nhìn chung quản lý tiến trình của Windows Mobile khác hẳn so với các bản Windows x86. Số lượng tối đa tiến trình chạy song song là 32. Có 4 tiến trình hệ thống được nạp từ ban đầu: NK.EXE, dành cho kernel service, ở slot 97; FILESYS.EXE, dành cho system services, ở slot2; DEVICE.EXE, quản lý device drivers hệ thống, thường ở slot 3; GWES.EXE, quản lý GUI hệ thống, ở slot 4. Shell process (SHELL.EXE) được nạp ngay sau FILESYS.EXE.
Tương tự Windows truyền thống, mỗi tiến trình có ít nhất một thread chính. Các threads trong cùng tiến trình chia sẻ cùng không gian bộ nhớ, nhưng khác biệt nhau về Heap và Stack. Kích thước Stack mặc định cho mỗi thread là 64KB, trừ khi được thay đổi khi biên dịch chương trình bằng tùy chọn compiler thích hợp.
Khi một chương trình được chạy, hệ thống tìm kiếm một slot còn trống và tải mã lệnh, dữ liệu lên slot đó. Các thư viện DLLs được nạp vào slot. Điều độ tiến trình (task schedule) của HĐH sẽ lần lượt kích hoạt các tiến trình bằng cách ánh xạ tiến trình điều độ vào slot 0, tiến trình không kích hoạt được trả về slot cũ tương ứng.
2. Kiến trúc hệ xử lý ARM
Hệ vi xử lý ARM (The Advanced RISC Microprocessor) sử dụng kiến trúc RISC 32 bit, thường được sử dụng trong các thiết bị nhỏ, bị giới hạn về nguồn năng lượng như PDA, các thiết bị truyền thông.... Các thiết bị PocketPC sử dụng Windows Mobile sử dụng họ CPU này. Thế hệ CPU dành cho PPC là thế hệ 5, có mã là XScale ARM. Chi tiết về các thế hệ CPU ARM, xin tham khảo ở http://en.wikipedia.org/wiki/ARM_architecture
Phần này không mô tả chi tiết về kiến trúc của vi xử lý Xscale ARM mà chỉ đề cập tới những kiến thức tối thiểu cần thiết cho công việc reverse engineering trên Windows Mobile.
2.1. Thanh ghi (registers)
XScale ARM có một số chế độ hoạt động (mode): user mode, fast interrupt handling, general purpose interrupt handling,
supervisor mode, system mode, abort mode và undefined mode. Chế độ hoạt động thông thường cho các ứng dụng trên Windows Mobile là User Mode.
XScale ARM có tổng cộng 31 thanh ghi, trong số đó chỉ 16 thanh ghi từ r0 tới r15 có thể sử dụng tại User Mode. Các thanh ghi đều có độ dài 32 bits, có chức năng như sau [2]:
Code:
APCS: ARM Procedure Call Standard
Thanh ghi R15 có chức năng tương tự như thanh ghi IP (Instruction Pointer) trên hệ x86, dùng để trỏ tới địa chỉ chứa lệnh đang thực hiện. R14 chứa giá trị của R15 khi thực hiện lệnh Branch and Link (BL) - Lệnh này tương tự lệnh Call trên x86. R13 là thanh ghi Stack, chức năng tương tự thanh ghi SP trên x86.
ARM có thanh ghi trạng thái CPSR (Current Program Status Register) chứa các bit trạng thái sau [2]:
Code:
2.2. Tập lệnh (opcodes)
Tập lệnh của ARM có thể chia ra các nhóm sau [2]
- Tập lệnh xử lý dữ liệu
- Tập lệnh copy dữ liệu
- Tập lệnh điều khiển, rẽ nhánh
a) Tập lệnh xử lý dữ liệu
- Phép toán số học
Code:
C: là cở carry được lưu trong thanh ghi CPSR
- Phép toán xử lý bitCode:
BIC viết tăt của Bit Clear
- Lệnh chuyển dữ liệu giữa các thanh ghi
Code:
Chú ý: MVN (Move Negated)
- Phép so sánh (Comparison operations): các lệnh này thay đổi trạng thái các cờ N,Z,C,O trong thanh ghi CPSR, dùng làm điều kiện cho các lệnh rẽ nhánh.
Code:
Trong các phép toán số học & bit trên, toán hạng thứ 2 (r2) có thể thay bằng hằng số.
- Phép toán dịch bit: được dùng kết hợp như sau, vd:
Code:
LSL, LSR mean 'logical shift left / right'
ASL, ASR mean 'arithmetic shift left / right'
ROR means 'rotate right'
RRX means 'rotate right extended'
- Phép toán có thay đổi bit trạng thái: các phép toán loai này thường có thêm chữ "S" (Set Condition Codes) ở cuối. Ví dụ cho phép cộng 64-bit, số thứ nhất lưu ở r1:r0, số thứ 2 lưu ở r3:r2, kết quả lưu ở r5:r4
Code:
- Phép nhân
Code:
Phép nhân có tính cả phần tích lũy:
Code:
Phép toán 64-bit trên ARM được hỗ trợ bởi thư viện coredll trong hệ điều hành Windows Mobile.
Tổng kết các phép toán của ARM:
Code:
--------
1. "Hacking Windows CE", Phrack Magazine, Volume 0x0b, Issue 0x3f, Phile #0x06 of 0x14
2. http://www.ra.informatik.uni-stuttgart.de/~ghermanv/Lehre/SOC02/ARM_Presentation.pdf
<còn tiếp>
Mục lục
1. Kiến trúc Windows Mobile
1.1. Quản lý bộ nhớ
1.2. Quản lý tiến trình
2. Kiến trúc hệ xử lý ARM
2.1 Thanh ghi
2.2 Mã lệnh (opcodes)
- Tập lệnh xử lý dữ liệu
- Tập lệnh copy dữ liệu
- Tập lệnh điều khiển, rẽ nhánh
3. Reverse Engineering trên Windows Mobile
3.1 Hàm APIs
3.2 Công cụ
- Editor
- Disassembler
- Debuger
3.3 Debug trên Windows Mobile
3.4. Case study 1: example1.exe
3.5. Case study 2: example2.exe
4. Kết luận
5. Greetings
6. Tài liệu tham khảo
--------
Bài viết này tổng kết những gì mfeng đã tìm hiểu về Windows Mobile với mục đích tiện việc tra cứu và tham khảo sau này .
1. Kiến trúc Windows Mobile
1.1. Quản lý bộ nhớ
Mô hình quản lý bộ nhớ của Windows Mobile khác hẳn so với các hệ điều hành Windows khác. Bộ nhớ được chia làm hai loại: ROM & RAM.
ROM chứa toàn bộ hệ điều hành và chương trình đi kèm hệ điều hành. Công dụng của ROM tương tự như một HDD trên PC, ngay cả khi cạn hết pin, dữ liệu trong ROM vẫn bảo toàn. Windows Mobile.NET ứng dụng Execute In Place (XIP) đối với các file DLL nằm trên ROM cho phép tiết kiệm lượng RAM so với trước kia. Đối với các file DLL thông thường nằm trên Flash Memory (SD card) hay RAM (phần Object Store), nội dung các file này cần copy vào RAM và thực thi.
RAM của Windows Mobile chia thành hai phần: Object Store và Program Memory. Object Store có tác dụng như một virtual ram HDD, dùng để chứa tạm thời chương trình và dữ liệu. Khi hết pin, dữ liệu trong Object Store sẽ mất. Program Memory mang công dụng tương tự RAM trên PC, dùng cho hoạt động của HĐH và chương trình.
Không gian bộ nhớ của Windows Mobile như sau [1]
Code:
+----------------------------------------+ 0xFFFFFFFF | | | Kernel Virtual Address: | | | 2 | KPAGE Trap Area, | | | G | KDataStruct, etc | | | B | ... | | | |--------------------------------+ 0xF0000000 | 4 | K | Static Mapped Virtual Address | | G | E | ... | | B | R | ... | | | N |--------------------------------+ 0xC4000000 | V | E | NK.EXE | | I | L |--------------------------------+ 0xC2000000 | R | | ... | | T | | ... | | U |---|--------------------------------+ 0x80000000 | A | | Memory Mapped Files | | L | 2 | ... | | | G |--------------------------------+ 0x42000000 | A | B | Slot 32 Process 32 | | D | |--------------------------------+ 0x40000000 | D | U | ... | | R | S |--------------------------------+ 0x08000000 | E | E | Slot 3 DEVICE.EXE | | S | R |--------------------------------+ 0x06000000 | S | | Slot 2 FILESYS.EXE | | | |--------------------------------+ 0x04000000 | | | Slot 1 XIP DLLs | | | |--------------------------------+ 0x02000000 | | | Slot 0 Current Process | +---+---+--------------------------------+ 0x00000000
Nửa trên 2GB từ 0x80000000 trở đi là vùng nhớ hệ thống (kernel space) dành cho hệ điều hành. Nửa dưới từ 0x00000000 cho tới 0x7FFFFFFF là vùng nhớ cho ứng dụng user (user space), trong đó phần trên 0x42000000 dùng để quản lý dữ liệu kích thước lớn như memory-mapped files (Ai đã biết lập trình Windows trên PC sẽ quen thuộc đối tượng này). Object Store cũng được ánh xạ trong vùng địa chỉ này. Phần dưới 0x42000000 chia thành 33 slots, kích thước mỗi slot là0x2000000 bytes (32MB).
Slot 0 quản lý tiến trình hiện hành, bao gồm [1]:
Code:
+---+------------------------------------+ 0x02000000 | | DLL Virtual Memory Allocations | | S | +--------------------------------| | L | | ROM DLLs:R/W Data | | O | |--------------------------------| | T | | RAM DLL+OverFlow ROM DLL: | | 0 | | Code+Data | | | +--------------------------------| | C +------+-----------------------------| | U | A | | R V | | | R +-------------------------+----------| | E | General Virtual Memory Allocations| | N | +--------------------------------| | T | | Process VirtualAlloc() calls | | | |--------------------------------| | P | | Thread Stack | | R | |--------------------------------| | O | | Process Heap | | C | |--------------------------------| | E | | Thread Stack | | S |---+--------------------------------| | S | Process Code and Data | | |------------------------------------+ 0x00010000 | | Guard Section(64K)+UserKInfo | +---+------------------------------------+ 0x00000000
64KB đầu tiên chứa thông tin của HĐH về tiến trình; mã chương trình từ file exe được nạp từ địa chỉ 0x10000 (là ImageBase của các file exe trên Windows Mobile). Tiếp đó là Stack & Heap dành cho thread chính trong tiến trình. Các thư viện được nạp phần cuối vùng nhớ của slot.
1.2. Quản lý tiến trình
Nhìn chung quản lý tiến trình của Windows Mobile khác hẳn so với các bản Windows x86. Số lượng tối đa tiến trình chạy song song là 32. Có 4 tiến trình hệ thống được nạp từ ban đầu: NK.EXE, dành cho kernel service, ở slot 97; FILESYS.EXE, dành cho system services, ở slot2; DEVICE.EXE, quản lý device drivers hệ thống, thường ở slot 3; GWES.EXE, quản lý GUI hệ thống, ở slot 4. Shell process (SHELL.EXE) được nạp ngay sau FILESYS.EXE.
Tương tự Windows truyền thống, mỗi tiến trình có ít nhất một thread chính. Các threads trong cùng tiến trình chia sẻ cùng không gian bộ nhớ, nhưng khác biệt nhau về Heap và Stack. Kích thước Stack mặc định cho mỗi thread là 64KB, trừ khi được thay đổi khi biên dịch chương trình bằng tùy chọn compiler thích hợp.
Khi một chương trình được chạy, hệ thống tìm kiếm một slot còn trống và tải mã lệnh, dữ liệu lên slot đó. Các thư viện DLLs được nạp vào slot. Điều độ tiến trình (task schedule) của HĐH sẽ lần lượt kích hoạt các tiến trình bằng cách ánh xạ tiến trình điều độ vào slot 0, tiến trình không kích hoạt được trả về slot cũ tương ứng.
2. Kiến trúc hệ xử lý ARM
Hệ vi xử lý ARM (The Advanced RISC Microprocessor) sử dụng kiến trúc RISC 32 bit, thường được sử dụng trong các thiết bị nhỏ, bị giới hạn về nguồn năng lượng như PDA, các thiết bị truyền thông.... Các thiết bị PocketPC sử dụng Windows Mobile sử dụng họ CPU này. Thế hệ CPU dành cho PPC là thế hệ 5, có mã là XScale ARM. Chi tiết về các thế hệ CPU ARM, xin tham khảo ở http://en.wikipedia.org/wiki/ARM_architecture
Phần này không mô tả chi tiết về kiến trúc của vi xử lý Xscale ARM mà chỉ đề cập tới những kiến thức tối thiểu cần thiết cho công việc reverse engineering trên Windows Mobile.
2.1. Thanh ghi (registers)
XScale ARM có một số chế độ hoạt động (mode): user mode, fast interrupt handling, general purpose interrupt handling,
supervisor mode, system mode, abort mode và undefined mode. Chế độ hoạt động thông thường cho các ứng dụng trên Windows Mobile là User Mode.
XScale ARM có tổng cộng 31 thanh ghi, trong số đó chỉ 16 thanh ghi từ r0 tới r15 có thể sử dụng tại User Mode. Các thanh ghi đều có độ dài 32 bits, có chức năng như sau [2]:
Code:
Reg# APCS Meaning R0 a1 Working registers R1 a2 " R2 a3 " R3 a4 " R4 v1 Must be preserved R5 v2 " R6 v3 " R7 v4 " R8 v5 " R9 v6 " R10 sl Stack Limit R11 fp Frame Pointer R12 ip R13 sp Stack Pointer R14 lr Link Register R15 pc Program Counter
Thanh ghi R15 có chức năng tương tự như thanh ghi IP (Instruction Pointer) trên hệ x86, dùng để trỏ tới địa chỉ chứa lệnh đang thực hiện. R14 chứa giá trị của R15 khi thực hiện lệnh Branch and Link (BL) - Lệnh này tương tự lệnh Call trên x86. R13 là thanh ghi Stack, chức năng tương tự thanh ghi SP trên x86.
ARM có thanh ghi trạng thái CPSR (Current Program Status Register) chứa các bit trạng thái sau [2]:
Code:
31 28| 8 7 6 5| 4 0 N Z C V| I F T| mode
- N - kết quả âm - Negative
- Z - kết quả Zero
- C - kết quả có nhớ (Carry).
- V - kết quả tràn (oVerflow).
2.2. Tập lệnh (opcodes)
Tập lệnh của ARM có thể chia ra các nhóm sau [2]
- Tập lệnh xử lý dữ liệu
- Tập lệnh copy dữ liệu
- Tập lệnh điều khiển, rẽ nhánh
a) Tập lệnh xử lý dữ liệu
- Phép toán số học
Code:
ADD r0, r1, r2 ; r0 := r1 + r2 ADC r0, r1, r2 ; r0 := r1 + r2 + C SUB r0, r1, r2 ; r0 := r1 - r2 SBC r0, r1, r2 ; r0 := r1 - r2 + C - 1 RSB r0, r1, r2 ; r0 := r2 - r1 RSC r0, r1, r2 ; r0 := r2 - r1 + C - 1
C: là cở carry được lưu trong thanh ghi CPSR
- Phép toán xử lý bitCode:
AND r0, r1, r2 ; r0 := r1 and r2 ORR r0, r1, r2 ; r0 := r1 or r2 EOR r0, r1, r2 ; r0 := r1 xor r2 BIC r0, r1, r2 ; r0 := r1 and not r2
BIC viết tăt của Bit Clear
- Lệnh chuyển dữ liệu giữa các thanh ghi
Code:
MOV r0, r2 ; r0 := r2 MVN r0, r2 ; r0 := not r2
Chú ý: MVN (Move Negated)
- Phép so sánh (Comparison operations): các lệnh này thay đổi trạng thái các cờ N,Z,C,O trong thanh ghi CPSR, dùng làm điều kiện cho các lệnh rẽ nhánh.
Code:
CMP r1, r2 ; set cc on r1 - r2 CMN r1, r2 ; set cc on r1 + r2 TST r1, r2 ; set cc on r1 and r2 TEQ r1, r2 ; set cc on r1 or r2
Trong các phép toán số học & bit trên, toán hạng thứ 2 (r2) có thể thay bằng hằng số.
- Phép toán dịch bit: được dùng kết hợp như sau, vd:
Code:
ADD r3, r2, r1, LSL #3 ; r3 := r2 + 8*r1 ADD r5, r5, r3, LSL r2 ; r5 += 2r2*r3
LSL, LSR mean 'logical shift left / right'
ASL, ASR mean 'arithmetic shift left / right'
ROR means 'rotate right'
RRX means 'rotate right extended'
- Phép toán có thay đổi bit trạng thái: các phép toán loai này thường có thêm chữ "S" (Set Condition Codes) ở cuối. Ví dụ cho phép cộng 64-bit, số thứ nhất lưu ở r1:r0, số thứ 2 lưu ở r3:r2, kết quả lưu ở r5:r4
Code:
ADDS r4,r2,r0 ; 32-bit carry-out -> C ADC r5,r3,r1 ; added into top 32 bits
- Phép nhân
Code:
MUL r4, r3, r2 ; r4 := (r3 *r2)[31:0]
Phép nhân có tính cả phần tích lũy:
Code:
MLA r4, r3, r2, r1 ; r4 := (r3*r2+r1)[31:0]
Phép toán 64-bit trên ARM được hỗ trợ bởi thư viện coredll trong hệ điều hành Windows Mobile.
Tổng kết các phép toán của ARM:
Code:
Opcode Mnemonic Meaning Effect [24:21] 0000 AND Logical bit-wise AND Rd:= Rn AND Op2 0001 EOR Logical bit-wise exclusive OR Rd:= Rn EOR Op2 0010 SUB Subtract Rd:= Rn - Op2 0011 RSB Reverse subtract Rd:= Op2 - Rn 0100 ADD Add Rd:= Rn + Op2 0101 ADC Add with carry Rd:= Rn + Op2 + C 0110 SBC Subtract with carry Rd:= Rn - Op2 + C - 1 0111 RSC Reverse subtract with carry Rd:= Op2 - Rn + C - 1 1000 TST Test Scc on Rn AND Op2 1001 TEQ Test equivalence Scc on Rn EOR Op2 1010 CMP Compare Scc on Rn - Op2 1011 CMN Compare negated Scc on Rn + Op2 1100 OPR Logical bit-wise OR Rd:= Rn OR Op2 1101 MOV Move Rd:= Op2 1110 BIC Bit clear Rd:= Rn AND NOT Op2 1111 MVN Move negated Rd:= NOT Op2
--------
1. "Hacking Windows CE", Phrack Magazine, Volume 0x0b, Issue 0x3f, Phile #0x06 of 0x14
2. http://www.ra.informatik.uni-stuttgart.de/~ghermanv/Lehre/SOC02/ARM_Presentation.pdf
<còn tiếp>
0 nhận xét:
Post a Comment