REVERSING GENERALS – PART 3
Dịch : Benina
TỔNG QUAN VỀ ĐẢO MÃ – PHẦN 3
Case
Đây cũng là đọan code trong Opera 3.62. Nó chọn lựa những trang help nào hiển thị trong browser. Tôi lướt qua đọan code này một cách ngẫu nhiên, nhưng nó là một ví dụ hữu ích cho lệnh switch/case. Trước khi bạn tìm hiểu về nó, tôi muốn bạn chú ý rằng , có
2 cách khác nhau trong phát biểu switch. Một là viết ra 1 chuổi các lệnh nhảy jump. Điều này tương đương với “if then sldif elseif ….end” và Một nữa là lọai mà Opera 3.62 sử dụng ở đây. Nó nhanh hơn lọai đã đề cập trước đó (lọai “if then sldif elseif ….end”). Ở
đây, chương trình tính tóan một một “điểm nhảy”(jumpmark) [4*eax+004932A3] đến code tương đương, thay vì đi qua mọi dòng line để check lệnh jump như lọai đầu tiên. Đây đơn giản chỉ là cách làm việc của code, bởi code có chiều dài giống nhau cho mọi
nhánh – 4 byte. Thông thường đây ko phải là case, vì bạn phải đề cập một chuổi các phát biểu “cmp jne” mà chúng tham chiếu đến lọai “if then elsif elsif elsif…end”. Bây giờ hảy xem đọan code sau:
:00493070 mov eax, dword ptr [ebp+10]; eax = Par1
:00493073 add eax, FFFFB1DD
; Par1 = Par1 – 20003d “look at stringrefs”
:00493078 cmp eax, 0000008A
; if eax smaller than 138d jump toindex.html
:0049307D ja 0049305E
:0049307F movzx eax, byte ptr [eax+00493357]
:00493086 jmp dword ptr [4*eax+004932A3]
; switch statement, calculate jumpmark* Data Obj ->”keys.htm”
|
:0049308D push 0051DD58 ; a jumpmark
:00493092 jmp 00493063* Data Obj ->”prefmenu.htm#print”
|
:00493094 push 005256B0 ; another jumpmark
:00493099 jmp 00493063* Data Obj ->”dialogs.htm#direct”
|
:0049309B push 0052569C ; …
:004930A0 jmp 00493063* Data Obj ->”prefmenu.htm#sethome”
|
:004930A2 push 00525684
:004930A7 jmp 00493063* Data Obj ->”dialogs.htm#fileuplf”
|
:004930A9 push 0052566C
:004930AE jmp 00493063* Data Obj ->”dialogs.htm#hotlist”
|
:004930B0 push 00525658
:004930B5 jmp 00493063* Data Obj ->”dialogs.htm#locked”
|
:004930B7 push 00525644
:004930BC jmp 00493063
; and so on …
Các biến Global :
Trong phần lớn các chương trình có nhiều biến và hằng số mà chúng có khả năng truy xuất mọi lúc, mọi nơi. Đây ko phải là biến local, bởi chúng bị lọai bỏ sau khi hàm kết thúc. Vì vậy chúng (biến loacal) chỉ có thể truy xuất bới chính hàm của chúng. Các biến
có thể được truy xuất đến mọi lúc, mọi nơi được gọi là các biến global (biến tòan cục) (trái với local). Vì vậy một reverser sẽ phải chú ý “theo dõi” chúng, bởi chúng chứa các cờ flags giống như registrationflags (cờ cho biết soft đăng ký chưa), demoflags (cờ xác
định soft có phải là lọai demo hay FULL), trialdate (cờ xác định cho dùng thử, giới hạn tgian ) , …và các dữ liệu khác như tên chương trình, các tham số, …..Xác định các biến global có thể là một công việc khó. Tôi đã tìm hiểu có 2 cách Opera truy xuất các biến của nó. Một là dùng addr trực tiếp. Điều này có ý nghĩa là , nếu biến là 00543380 chương trình truy xuất đến nó bởi chính là số này (00543380)
direct mode: mov eax, dword prt [00543380]
Một cách khác nữa, nó có thể dùng mode addr liên quan. Bạn có thể thấy một ví dụ cho trường hợp này trong phần kế tiếp. Với mode này, chương trình truy xuất biến liên quan đến một “địa chỉ nền” (baseaddress). Base này được chứa trong một thanh ghi. Nếu bạn thấy vài thứ giống như vậy, thì nó là 1 lọai khó để xác định biến global. Nhưng vẫn có thể, bạn chỉ phải search giá trị của offset. Đừng rối với những thứ lọai này, nó sẽ “sáng sủa” hơn trong lần thứ 2 chương trình “chạm” đến nó. Nhìn vào ví dụ sau:
mov eax, [esi + 4EC]
| |
base offset
Download toàn bộ bài viết:
reversing-generals_phan3