|
|
only1bit wrote:
Các bạn thân mến để chứng minh VB6.0 hoàn toàn có thể viết virus.
Con này được viết bởi nhóc bit.killer 1 trong tứ quái nhóm bọn mình.
http://vg.vn2k.net/vr.zip
Bạn nào muốn bàn về antidebug thì bài viết sau mình sẽ bàn tiếp.
Hix ! hôm bửa bạn nào nói rằng VB6.0 sử dụng PCODE
Bạn ơi VB5.0 mới sài PCODE thui
Từ VB6.0 thì sử dụng một thứ tương tự như máy tính ảo tương tác qua MSVB60.DLL.
Đọc lại "Bí quyết lập trình VB6.0 (NGỌC ANH THƯ PRESS)".
Còn chuyện AV thì không có chuyện nhận diện virus bằng chuổi đâu bạn ^_^.
VB (5 hoặc 6) có 2 chế độ dịch: pcode và native code. Native Code là mã chạy thẳng trên x86, nhưng vẫn gọi API thông qua msvbvm{50|60}.dll, còn pcode được đưa thẳng vào virtual machine của msvbvm{50|60}.dll. Cái này thấy rõ khi disassembly file exe viết bằng VB. Nếu pcode, thì decompile ra lại càng dễ .
PS: vr.zip không download được.
|
|
|
Hacker Cracker: A Journey from the Mean Streets of Brooklyn to the Frontiers of Cyberspace
http://www.amazon.com/Hacker-Cracker-Brooklyn-Frontiers-Cyberspace/dp/0066210798/ref=pd_bbs_sr_2?ie=UTF8&s=books&qid=1209571911&sr=8-2
http://rapidshare.com/files/111534001/hcrk.rar
Định dạng file: ảnh PNG.
Password: hvaonline.net
|
|
|
vuadapass wrote:
Để em giải thích rõ hơn : em đang nói trong vb6, nó cho phép tạo một file nguồn (resource - .res) để mình lưu trữ các thông số vào đó . Chẳng hạn một bức ảnh, một đoạn media, hay chỉ là một đoạn chữ ... .
Để lây lan virus của mình vào một exe khác, mình sẽ code cho nó đọc hex của exe cần lây rồi bỏ vào resource. Sau đó ghi đè lên tệp exe mình cần lây. File được ghi lên chính là file đã bị nhiễm . Khi mình chạy file bị nhiễm, nó sẽ đọc phần resource mà mình đã lấy của file nguyên bản . Extra ra một góc nào đấy trên máy tính (thông thường là thư mục ~temp) . Tiếp đến công đoạn cuối cùng là tự động chạy nó.
Phương án này tạm có thể gọi là "virus", nó vác theo file gốc sau lưng, khi cần trả quyền điều khiển cho file gốc thì quăng ra ngoài để chạy. Để phát hiện lớp các "viruses" dạng này không đến nỗi khó:
- Cực đoan: "virus" viết bằng VB dựa vào file msvbvm*.dll, chỉ cần xóa mấy file này khỏi Windows, đảm bảo "virus" chết toi. Tuy nhiên điều này làm các chương trình VB trong sạch bị "vạ lây".
- Khả thi hơn: Chạy một chương trình bị nhiễm "virus", kết quả kiểm tra tiến trình đó lại nằm ở thư mục %temp% nào đó chứ không phải file gốc vừa chạy => biết ngay chương trình này đã bị "đóng gói"!
|
|
|
Code:
mov ax, @.data
mov ds, ax
x86 không cho phép truy cập cả thanh ghi đoạn và địa chỉ bộ nhớ trong cùng một lệnh, vì vậy phải lấy thanh ghi ax làm trung gian khi khởi tạo giá trị DS tới địa chỉ segment của vùng nhớ .data
|
|
|
Để gửi file log (hay bất cứ file gì) kèm theo mail, bạn cần nắm vững giao thức SMTP và định dạng file mail (MIME format), cách mã hóa BASE64 trong MIME...
Mail server của yahoo.com có thể tìm được khi truy cập bản tin MX của domain yahoo.com. Bạn có thể dùng lệnh nslookup với tùy chọn set type=MX để tìm SMTP Server của Yahoo. Nếu muốn tự động hóa khâu tìm mail server, bạn cần lập trình truy xuất DNS service.
|
|
|
Bạn đã hỏi về chủ đề này ở /hvaonline/posts/list/20837.html và đã được trả lời chi tiết. Không nên tạo nhiều chủ đề trùng lặp như vậy.
|
|
|
IPhone sử dụng hệ điều hành Mac OS X, vì vậy các phần mềm trên iphone có cùng định dạng file thực thi với Mac OS, là Mach-O File Format. Có thể dùng IDA để reverse các file thực thi này.
Để lập trình cho iPhone, hiện nay có 2 bộ công cụ là iPhone SDK do Apple phát hành và Toolchain do các hãng thứ 3. Môi trường lập trình của iPhone SDK là Mac OS, còn toolchain có thể là Mac OS, Linux, Cygwin. Chi tiết về toolchain xem http://www.tuaw.com/2007/09/11/installing-the-iphone-developer-toolchain-a-simple-how-to/
|
|
|
Bạn thử sử dụng các hàm Int 21h dành cho truy nhập file xem sao: Các hàm như mở file (AH=3Dh), đóng file (AH=3Eh), đọc từ file vào buffer (AH=3Fh) ...
|
|
|
Bạn nên học lập trình C (Visual C++) với WinAPIs (Không phải lập trình VC với thư viện MFC nhé). Ngoài ra nên đọc cuốn "Programming Windows 5th Ed" của Petzold cho dễ hiểu.
|
|
|
CK wrote:
Khi em "xem" csdl của 1 site, password, username, email của table user đã bị mã hóa. Tất cả đều có 30 ký tự: (A_Z a_z 1_9 + và /) như dưới đây. Nhưng khi em view profiles của mình thì có username + email, (password thì bằng thủ thuật mới thấy).
Bạn có chắc chắn các dữ liệu về user, email & password được lưu trữ trong 240 bits không?. Chỉ từ 240 bits dữ liệu này có thể giải mã được username, email & password (như bạn nói khi view profiles)? Hay website có lưu các thông tin này ở chỗ khác?
Theo ý kiến cá nhân, 240 bits để lưu user name, email, password có vẻ hơi ít. Nhóm kí tự trong 240 bits là A-Z,a-z,0-9,+,/ cho thấy bước cuối cùng trước khi lưu vào CSDL có thể là encode BASE64.
Trường hợp đây là mã hóa 2 chiều (mã hóa đối xứng - symmetric encryption), nếu website sử dụng các thuật toán đơn giản hoặc DES, khả năng bạn có thể vét cạn để tìm khóa là khả thi (trong trường hợp này bạn phải biết rõ tên thuật toán mã hóa). Còn với 3DES, IDEA, RC4, RC5, RC6 và nhất là AES, khả năng với một cá nhân tìm ra khóa mã là cực khó. Cho nên hướng giải quyết của gammar95 có lẽ là khả thi hơn.
|
|
|
Yêu cầu bạn đưa ra thuộc dạng ciphertext-only attack. Thông thường mô hình tấn công này sử dụng thống kê tần suất xuất hiện của ký tự, và chỉ đạt được khi có số lượng ciphertext đủ lớn (như trường hợp bẻ gãy khóa của RC4 trong WEP). Nhưng ở đây, nhiệm vụ dường như khó khăn hơn khi cả thuật toán mã hóa cũng chưa biết (Cũng có thể không phải mã hóa mà chỉ là sử dụng hàm băm (hash function) thì khả năng giải mã gần như bằng 0).
|
|
|
Để chống keygen thì theo em cách sau sẽ hiệu quả:
Input: usr, serial
serial = E(H(usr), private_key)
Check: D(serial, pub_key) == H(usr) ?
Scheme trên bị sơ hở rất dễ bị patch ở đoạn kiểm tra: D(serial, pub_key) == H(usr). Do đó cần có biện pháp chống patch cho hợp lý. Mời mọi người đóng góp ý kiến .
Một số ý kiến chống patch bên cạnh cách anti-debug và code obfuscator:
- Dùng timer check CRC đoạn mã kiểm tra key không thường xuyên
- Không hiện thông báo serial sai, yêu cầu restart soft sau khi nhập user & serial
|
|
|
Sơ bộ ban đầu về virus này:
- Lợi dụng lỗi MDAC cũ để phát tán virus khi dùng IE chưa cập nhật truy cập vào trang web hxxp://girltinh.tk.
- Virus gồm 2 file: SVCHOST.EXE và SVCHOST32.EXE để ở trong thư mục TMP:
TMP=C:\DOCUME~1\[usr]\LOCALS~1\Temp
- File SVCHOST32.EXE bị KAV phát hiện ra là Trojan-Spy.Win32.SCKeyLog.au. File còn lại chưa bị phát hiện.
To hack9x: đề nghị cậu không trả lời mấy câu vô nghĩa như trên nữa.
|
|
|
Các bạn có thể download phiên bản pdf của bài viết trên ở dưới đây (đã bao gồm 2 file case study)
|
|
|
3.4. Case study 1: example1.exe
Trong phần này, chúng ta sẽ thử nghiệm debug file example1.exe, chương trình có nội dung như sau:
Tùy theo giá trị nhập vào, kết quả “Check key” sẽ hiện ra “Correct” hay “Incorrect”.
Mục tiêu của Debug là tìm ra giá trị Key khi nhập vào tên User bất kỳ.
Bước 1: Khảo sát
Chạy example1.exe trên máy ảo Windows Mobile, nhập vào:
User: mfeng-hvaonline
Key: 123456789
và tap “Check Key”, kết quả:
Bước 2: Dùng IDA phân tích file example1.exe
Sau khi mở file example1.exe bằng IDA, một cửa sổ hiện ra như ở hình bên dưới, hãy click OK.
Dùng tab String, tìm tới chuỗi “Incorrect Key”:
Ta được:
Ngược lên đoạn mã tham chiếu tới chuỗi này, ta sẽ ở đây:
và tiếp theo:
Chú ý tới đoạn code từ 0x0001183C tới 0x00011848, ta có thể suy ra đoạn mã kiểm tra dạng như sau:
Code:
if (sub_116F0() == 0)
//Incorrect key
else
//Correct Key
Việc cần thiết bây giờ là đặt breakpoint tại 0x0001183C
Bước 3: Debug
Menu Debug -> Process options, đặt các thông số như sau:
Sau đó click OK
Đặt breakpoint tại 0x0001183C:
F9 để bắt đầu debug.
Nhập User: mfeng-hvaonline & Key: 123456789. Tap “Check Key”, IDA breaks tại vị trí sau:
Xem giá trị R0 = 0x2404F954, không thấy trỏ tới chuỗi ký tự đặc biệt nào. (Thực chất, R0 là con trỏ this).
Xem giá trị R1 = 0x00055EF0:
Và R2 = 0x00055F30
Trace vào bên trong hàm sub_116F0, đoạn code của hàm này như sau:
Tại 0x00011704, hàm wcslen lấy độ dài chuỗi ký tự User: mfeng-hvaonline. Kết quả trả về là R0 = 0x0000000F (15).
Tại 0x00011710, độ dài user được so sánh với #4, nếu nhỏ hơn, sub_116F0 trả về giá trị 0 tại 0x00011730.
Tại 0x00011720, so sánh hai chuỗi user và key, nếu giống nhau, sub_116F0 trả về giá trị 1, còn lại trả về giá trị 0.
Như vậy, chỉ cần user & key giống hệt nhau, chương trình sẽ cho ra kết quả “Correct”.
Tóm lại, đoạn debug vừa rồi cho ta thấy hoạt động của example1.exe ở cấp độ assembly, cho biết cách thức kiểm tra giữa User và Key để cho ra kết quả “Correct” hay “Incorrect”.
3.5. Case study 2: example2.exe
Trong case study này, các bạn hãy tự mình giải quyết cơ chế tìm key theo user. Khác với example1, case study này có đôi chút khó khăn hơn
4. Kết luận
Bài viết trên đã trình bày các nội dung cơ bản nhất để tiến hành reverse một chương trình trên Windows Mobile, đồng thời minh họa cách thức debug thông qua hai case study đơn giản nhất. Từ các kiến thức này, bạn đọc có thể hoàn toàn tự mình nghiên cứu reverse và phân tích các ứng dụng phức tạp hơn.
5. Greetings
Greats thanks to all HVA and REA members.
6. Tài liệu tham khảo
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
3. http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001l/QRC0001_UAL.pdf
---
Hết.
|
|
|
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ả:
|
|
|
b) Lệnh copy dữ liệu
Nhóm lệnh này có chức năng đọc/ghi dữ liệu giữa bộ nhớ và thanh ghi. Có ba nhóm:
- Đọc dữ liệu từ bộ nhớ vào một thanh ghi: dữ liệu là byte, word (32bit) hay half-word (16bit)
- Đọc dữ liệu từ bộ nhớ vào nhiều thanh ghi: dữ liệu là words
- Đổi chỗ giá trị bộ nhớ - thanh ghi.
*) Đọc dữ liệu từ bộ nhớ cho một thanh ghi
32 bits:
Code:
LDR r0, [r1] ; r0 := mem [r1]
STR r0, [r1] ; mem [r1] := r0
LDR r0,[r1, #4] ; r0 := mem[r1+4]
Giá trị chuyển dịch (như #4 trong vd trên) tối đa là +/- 4KB
8 bits:
Code:
LDRB r0, [r1] ; r0 := mem [r1] [7:0]
STRB r0, [r1] ; mem [r1] [7:0] := r0
Cập nhật luôn giá trị thanh ghi địa chỉ:
Code:
LDR r0, [r1], #4 ; r0 := mem[r1]
; r1 := r1 + 4
*) Đọc dữ liệu từ bộ nhớ vào nhiều thanh ghi:
Code:
LDMIA r1,{r0, r2, r5} ; r0 := mem [r1]
; r2 := mem [r1+4]
; r5 := mem [r1+8]
Copy khối dữ liệu: trong các lệnh loại này, thanh ghi địa chỉ có thể tăng (Increase), giảm (Decrease) trước (Before) hoặc sau (After) khi dữ liệu được copy. Các lệnh này hay được dùng để quản lý stack.
Ví dụ: lệnh sau đây hay được dùng trong code prolog và code epilog của các hàm:
Code:
STMFD SP!, {R4-R6,LR} ; Lưu giá trị R4, R5 & LR
; vào stack, trừ SP đi 4 x 4 = 0x10
SUB SP, SP, #0x24 ; Dành 0x24 bytes cho local vars
....
ADD SP, SP, #0x24 ; Phục hồi trạng thái stack
LDMFD SP!, {R4-R6,PC} ; Phục hồi thanh ghi R4, R6, trả về địa chỉ sau khi gọi BL vào thanh ghi PC (R15)
*) Đổi chỗ giá trị bộ nhớ - thanh ghi.
Code:
Ý nghĩa của lệnh này như sau: đọc giá trị từ bộ nhớ [Rn] vào thanh ghi Rd, sau đó ghi giá trị ở thanh ghi Rm vào [Rn].
c) Tập lệnh điều khiển, rẽ nhánh
Các lệnh rẽ nhánh thực hiện dựa trên trạng thái của các bit trong thanh ghi CPSR, bao gồm bit N, S, C, V.
- Rẽ nhánh vô điều kiện:
Code:
- Rẽ nhánh có điều kiện:
Code:
MOV r0, #0 ; initialize counter
LOOP: ...
ADD r0, r0, #1 ; increment counter
CMP r0, #10 ; compare with limit
BNE LOOP ; repeat if not equal
... ; else continue
Tổng kết các lệnh rẽ nhánh:
Code:
Branch Interpretation Normal Uses
--------------------------------------------------------------
B Unconditional Always take this branch
BAL Always Always take this branch
BEQ Equal Comparison equal or zero result
BNE Not equal Comparison not equal or zero result
BPL Plus Result positive or zero
BMI Minus Result minus or negative
BCC Carry clear Arithmetic operation did not give carry-out
BLO Lower Unsigned comparison gave lower
BCS Carry set Arithmetic operation gave carry-out
BHS Higher or same Unsigned comparison gave higher or same
BVC Overflow clear Signed integer operation ; no overflow occurred
BVS Overflow set Signed integer operation ; overflow occurred
BGT Greater than Signed integer comparison gave greater than
BGE Greater or equal Signed integer comparison gave greater or equal
BLT Less than Signed integer comparison gave less than
BLE Less or equal Signed integer comparison gave less than or equal
BHI Higher Unsigned comparison gave highe
BLS Lower or same Unsigned comparison gave lower or same
Chú ý: các lệnh xử lý dữ liệu có thể bao gồm chức năng điều kiện:
Code:
CMP r0, #5 ; if (r0 != 5) {
ADDNE r1, r1, r0 ; r1 := r1 + r0 - r2
SUBNE r1, r1, r2 ; }
Mã điều kiện:
Code:
Opcode Mnemonic Interpretation Status flag state
[31:28] extension for execution
----------------------------------------------------------------------------------
0000 EQ Equal / equals zero Zset
0001 NE Not equal Zclear
0010 CS/HS Carry set / unsigned higher or same Cset
0011 CC/LO Carry clear / unsigned lower Cclear
0100 MI Minus / negative Nset
0101 Pl Plus / positive or zero Nclear
0110 VS Overflow Vset
0111 VC No overflow Vclear
1000 HI Unsigned higher Cset and Zclear
1001 LS Unsigned lower or same Cclear or Zset
1010 GE Signed greater than or equal N equals V
1011 LT Signed less than N is not Equal to V
1100 GT Signed greater than Z clear and N equals V
1101 LE Signed less than or equal Z set or Nis not equal to
1110 AL Always any
1111 NV Never (do not use!) none
Cơ chế gọi hàm của ARM : dùng thanh ghi r14 (LR) lưu trữ địa chỉ lệnh kế tiếp sau lệnh BL để quay trở về.
Code:
BL SUBR ; branch to SUBR
... ; return to here
SUBR ... ; subroutine entry point
MOV pc, r14 ; return
Gọi hàm nhiều lớp (nested subroutines): thanh ghi R14 (LR) cần được cất vào stack trước khi gọi hàm.
Code:
BL SUB1 ; branch to SUB1
...
SUB1 STMDA r13!, {r0-r2, r14} ; save regs
BL SUB2
...
LDMIB r13!, {r0-r2, pc} ; restore regs + return
SUB2 ...
MOV pc, r14 ; return
Chú ý: ARM không có phép toán NOP (như x86). Để thay thế lệnh này, có thể dùng llệnh MOV R0, R0 có opcode là 0000A0E1
Đến đây, với nội dung đã trình bày, bạn đã có thể đọc hiểu mã lệnh assembly của VXL ARM. Phần tiếp theo đề cập tới các công cụ debug, disassembler và editor hỗ trợ cho reverse engineering trên Windows Mobile.
|
|
|
Zombie wrote:
Hiện Zom cũng đang mún vọc thử với Symbian. Nên không biết lão mf rành không thì xin được học hỏi.
Hì hì, em chưa động vào Symbian bao giờ bác ạ. Có cái tut về Symbiancủa ARTeam bác hacnho up lên đó bác
|
|
|
Em định đặt reference ở cuối loạt bài, nhưng để tiện lợi hơn, có lẽ nên đặt dưới mỗi bài post
|
|
|
Kiến thức cơ bản về Reverse Engineering trên Windows Mobile
Version: 1.0
Last Rev: Jan 2008.
Tác giả: mfeng
HVAOnline: http://hvaonline.net
REAOnline: http://reaonline.net
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
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:
31 28| 8 7 6 5| 4 0
N Z C V| I F T| mode
- N - kết quả âm - Negative
- 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>
|
|
|
Theo tớ biết thì các HĐH *nix có khả năng phần quyền và giới hạn truy cập rất hiệu quả, nên virus trên *nix không nhiều, và thường không gây thiệt hại lớn.
Tham khảo các viruses & worms trên *nix http://en.wikipedia.org/wiki/List_of_Linux_computer_viruses.
Dĩ nhiên, các virus thuần Windows không thể lây nhiễm trên *nix được Có virus multi-platform (W32.Winux - Lindose) nhưng mới chỉ ở dạng concept, không có payload
|
|
|
|
|
|
|