Adding a code into a program
Khi dùng Olly để trade, các bạn thường sẽ thấy những đoạn code DB 00. Đây là những "phần thừa" của chương trình mà ta có thể tận dụng để làm việc gì đó (chẳng hạn như ghi tên mình vào).
I - LÝ THUYẾT :
Trước hết, tui xin nêu khái quát 1 vài điều về cách làm này :Chúng ta sẽ tận dụng đoạn code không dùng tới để đặt vào đó đoạn code của mình :Sau đó chúng ta sẽ cho chương trình nhảy đến đoạn code của chúng ta bằng lệnh jump :Xong ta sẽ cho "nhảy" ngược lại về điểm đầu của chương trình :Đó là toàn bộ phần lý thuyết. Sau đây chúng ta sẽ bước vào thực hành.
II - THỰC HÀNH :
Tool : Olly
Victim : game freecell (vừa nhẹ lại có sẵn trong bất kì máy nào)
Dùng Olly load file freecell.exe lên, xong chúng ta sẽ ở tại 01005438 - ta sẽ gọi đây là điểm đầu của chương trình.
Bây giờ ta cần tìm chỗ để đặt đoạn code của mình. Kéo xuống dưới, ta tìm được 1 chỗ khá "rộng rãi" ở 0100617D.
Bây giờ ta sẽ bắt đầu viết code cho 1 cái MessageBox. Trong ASM đoạn code gọi hàm MessgeBoxA được viết như sau :
Quote:
Push 0
Push "reaonline" <== tiêu đề của MessageBox Push "welcome" <== nội dung của MessageBox Push 0 Call User32.MessageBoxA |
Để nhập được đoạn code trên vào chương trình ta làm như sau : Trong Olly chúng ta kéo chuột chọn 1 khoảng dài. Sau đó ấn Ctrl-E. Trong khung ASCII đánh vào reaonline, xong ấn OK. Olly lúc này sẽ có 1 đoạn code rất "khó hiểu". Không sao, các bạn ấn Ctrl-A để chương trình Analyse lại đoạn code. Và bây giờ chúng ta sẽ thấy dòng này :
Quote:
0100617D . 72 65 61 6F 6E 6C 69 6E 65 00 ASCII "reaonline",0
|
Ta sẽ ghi ra giấy địa chỉ 0100617D để dùng sau này.
Làm tương tự bước trên, ta có được dòng chữ welcome :
Làm tương tự bước trên, ta có được dòng chữ welcome :
Quote:
01006187 . 77 65 6C 63 6F 6D 65 00 ASCII "welcome",0
|
Ghi lại địa chỉ 01006187.
Tại địa chỉ 01006190 , ta ấn Space và nhập vào Push 0 xong ấn Assemble.
Tại địa chỉ 01006192 , ta ấn Space và nhập vào Push 0100617D xong ấn Assemble.
Tại địa chỉ 01006197 , ta ấn Space và nhập vào Push 01006187 xong ấn Assemble.
Tại địa chỉ 0100619C , ta ấn Space và nhập vào Push 0 xong ấn Assemble.
Tại địa chỉ 0100619E , ta ấn Space và nhập vào Call User32.MessageBoxA xong ấn Assemble.
Lưu ý, ở đây ta hãy ghi ra giấy địa chỉ 01006190.
Nếu các bạn làm đúng, chúng ta sẽ có như sau :
Tại địa chỉ 01006190 , ta ấn Space và nhập vào Push 0 xong ấn Assemble.
Tại địa chỉ 01006192 , ta ấn Space và nhập vào Push 0100617D xong ấn Assemble.
Tại địa chỉ 01006197 , ta ấn Space và nhập vào Push 01006187 xong ấn Assemble.
Tại địa chỉ 0100619C , ta ấn Space và nhập vào Push 0 xong ấn Assemble.
Tại địa chỉ 0100619E , ta ấn Space và nhập vào Call User32.MessageBoxA xong ấn Assemble.
Lưu ý, ở đây ta hãy ghi ra giấy địa chỉ 01006190.
Nếu các bạn làm đúng, chúng ta sẽ có như sau :
Quote:
0100617D . 72 65 61 6F 6E 6C 69 6E 65 00 ASCII "reaonline",0
01006187 . 77 65 6C 63 6F 6D 65 00 ASCII "welcome",0 0100618F 00 DB 00 01006190 6A 00 PUSH 0 01006192 68 7D610001 PUSH freecell.0100617D ; ASCII "reaonline" 01006197 68 87610001 PUSH freecell.01006187 ; ASCII "welcome" 0100619C 6A 00 PUSH 0 0100619E E8 D302D676 CALL USER32.MessageBoxA |
Bây giờ ta ấn * để trở về đâu chương trình. Tại đây, để chắc chắn chúng ta hãy copy từ địa chỉ 01005438 đến địa chỉ 01005447 ra Notepad. Sau đó trong Olly, kéo chọn từ địa chỉ 01005438 đến địa chỉ 01005447 và ấn Space. Nhập vào JMP 01006190 (đây là địa chỉ mà lúc nãy tui kêu các bạn ghi lại) xong ấn Assemble.
Mở lại Notepad (đang giữ đoạn code lúc nãy chúng ta copy lại), ta hãy so sánh xem đoạn code nào đã bị mất để khôi phục lại sau. Ta thấy 2 dòng lệnh 01005438 > $ 6A 70 PUSH 70 và 0100543A . 68 70150001 PUSH freecell.01001570 đã bị mất. Vậy ta chỉ cần giữ lại 2 dòng này và xóa hết các dòng lệnh kia đi.
Ghi ra giấy địa chỉ 0100543D - đây sẽ là nơi chương trình "trở về" sau khi cho chạy xong cái MessageBox của chúng ta. Tại địa chỉ 01005438 ta ấn Enter để nhảy thử xem đoạn code của chúng ta có đúng không. Oh, vậy là đoạn code của chúng ta không sai :D
Tại 010061A4 ta ấn Space và nhập Push 70 và tại 010061A6 ta ấn Space rồi nhập Push 1001570 (đây là 2 đoạn code đang nằm trong Notepad).
Tại 010061AB ta ấn Space và nhập vào JMP 0100543D.
Mở lại Notepad (đang giữ đoạn code lúc nãy chúng ta copy lại), ta hãy so sánh xem đoạn code nào đã bị mất để khôi phục lại sau. Ta thấy 2 dòng lệnh 01005438 > $ 6A 70 PUSH 70 và 0100543A . 68 70150001 PUSH freecell.01001570 đã bị mất. Vậy ta chỉ cần giữ lại 2 dòng này và xóa hết các dòng lệnh kia đi.
Ghi ra giấy địa chỉ 0100543D - đây sẽ là nơi chương trình "trở về" sau khi cho chạy xong cái MessageBox của chúng ta. Tại địa chỉ 01005438 ta ấn Enter để nhảy thử xem đoạn code của chúng ta có đúng không. Oh, vậy là đoạn code của chúng ta không sai :D
Tại 010061A4 ta ấn Space và nhập Push 70 và tại 010061A6 ta ấn Space rồi nhập Push 1001570 (đây là 2 đoạn code đang nằm trong Notepad).
Tại 010061AB ta ấn Space và nhập vào JMP 0100543D.
The_lighthouse(REA)
In bài này