itprofes
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Cơ chế Hook và ứng dụng to lớn của nó (Phần 2)

Go down

Cơ chế Hook và ứng dụng to lớn của nó (Phần 2) Empty Cơ chế Hook và ứng dụng to lớn của nó (Phần 2)

Bài gửi  admin 7/5/2010, 10:13 am

Bài viết liên quan: Cơ chế Hook và ứng dụng to lớn của nó (Phần 1)/Cơ chế Hook và ứng dụng to lớn của nó (Phần 3)



h em xin trình bày 1 ứng dụng quan trọng khác của Hook là làm keylogger hay malware!
phần này em nêu ra chỉ với mục đích "cọ xát" và "học hỏi" là chính, vì bản thân em cũng mới tìm hiểu về lĩnh vực này thôi, và cũg chưa hiểu tường tận lắm Very Happy

Keylogger chắc ai cũg biết Very Happy, đó là phần mêm dùng để thu thập thông tin vê password hay ID bằng cách bắt các thông điệp về bàn phím. ở đây em xin nói đến 1 loại keylogger khác, mục đích cũng giống như trên nhưng cách làm "nông dân" hơn. đó là lấy thông tin của edit text chứa pass hay ID.

cách làm của Keylogger này khá là đơn giản, giống cách làm các loại autoplay bây h.
trước hết cần phải quy ước 1 số thuật ngữ
remote process: là ứng dụng chứa thông tin về pass và ID. Hoặc với các loại autoplay thì nó chính là các loại game oline(vltk...)

cách thức chung của các loại này là chèn ("lây") code vào remote process. Gọi là "lây" bởi vì đoạn code đó thực sự kô nằm trong remote process. chỉ là remote process sẽ thực hiện các đoạn code đã bị "lây nhiễm". Có 3 cách để lây nhưng em xin chỉ nói 1 cách dùng Hook thôi, đó là:
+ đặt code cân thiết vào 1 file DLL, nghĩa là khi viết 1 hàm thay vì ta viết hàm đó vào chương trinh chính thì ta viết trong DLL.
+ dùng Hook để map file DLL của ta vào remote process.

Sau khi đã thực hiện 2 bước trên thì remote process sẽ tự thực hiện các lệnh đã có trong đoạn code của ta:rolleyes:
--2 bước trên thực hiện đêu rất dễ--cách viết DLL thì search trên mạng kô thiếu và thực hiện cũng khá dễ

đến đây thì có 2 hướng là keylogger và autoplay.
trước tiên nói về keylogger:
mục đích của keylogger là thu thập pass và ID, vậy trong file DLL ta chỉ cần xài hàm SendMessage là đủ. Khi đó ta tạo ra 1 hàm đệm trong DLL có các nhiệm vụ sau: cài Hook vào remote process, gọi hàm SendMessage với thông điệp WM_GETTEXT để lấy thông tin về pass và ID , bỏ cài đặt Hook (bước này giống như khi ta giải phóng 1 bộ nhớ đã đc cấp phát)

sau đây là cách thức thực hiện chi tiết:
B1: tạo 1 DLL có hàm đệm như trên
B2: tạo chương trinh chính có các chức năng như sau:
+ lấy handle của edit text chứa pass hay ID
+ link chương trinh chính này với DLL ở trên (khi link 1 DLL với 1 ứng dụng thi ứng dụng sẽ sử dụng đc các hàm trong DLL--đó là lí do tại sao nó đc gọi la DLL - thư viện liên kết động)
+ gọi hàm đệm trong DLL ra. Đến đây thì ta đã lấy đc pass và ID rồi Very Happy, chỉ việc gửi pass này về mail của mình là xong Very Happy

B1 thì kô nói làm j nữa
B2 có các chú ý sau:
- làm sao lây đc handle của edit text chứa pass hay ID đây???
trong sample em down trên mạng vê thì nó dùng cơ chế bắt chuột. Khi con chuột rê đến đâu nó sẽ dùng 1 số hàm API để định vị cửa sổ mà con chuột đang chỉ đến, vì muốn gõ pass thì các pác phải click chuột vào cái khung password, khi đó con chuột chỉ đúng edit text chứa password Very Happy tuy nhiên theo kinh nghiệm của em thi cái đó rất hiếm xảy ra. Khi gõ ID xong thì các pác gõ pass thế nào, dùng chuột click vào khung password hay ấn tab? Em nghĩ là 80% là ấn Tab Very Happy => làm keylogger theo cách này không ổn lắm, em cũng chỉ đưa ra loại này để làm quen hơn với Hook thôi. Pác nào quan tâm làm thử cũng hay Very Happy

dưới đây là đoạn code dùng để định vị cửa sổ:

HWND SmallestWindowFromPoint( const POINT point )
{
RECT rect, rcTemp;
HWND hParent, hWnd, hTemp;

hWnd = ::WindowFromPoint( point );
if( hWnd != NULL )
{
::GetWindowRect( hWnd, &rect );
hParent = ::GetParent( hWnd );

// Has window a parent?
if( hParent != NULL )
{
// Search down the Z-Order
hTemp = hWnd;
do{
hTemp = ::GetWindow( hTemp, GW_HWNDNEXT );

// Search window contains the point, hase the same parent, and is visible?
::GetWindowRect( hTemp, &rcTemp );
if(::PtInRect(&rcTemp, point) && ::GetParent(hTemp) == hParent && ::IsWindowVisible(hTemp))
{
// Is it smaller?
if(((rcTemp.right - rcTemp.left) * (rcTemp.bottom - rcTemp.top)) < ((rect.right - rect.left) * (rect.bottom - rect.top)))
{
// Found new smaller window!
hWnd = hTemp;
::GetWindowRect(hWnd, &rect);
}
}
}while( hTemp != NULL );
}
}

return hWnd;
}

như vậy là xong thằng keylogger Very Happy

à, ở bài trước em có nhầm 1 chút: hàm SendMessage có thể gửi thông điệp đi bất kỳ đâu, kô cứ phải trong cùng 1 ưng dụng, nó chỉ kô thể gửi thông điệp WM_GETTEXT tới 1 cửa sổ có đặt flag ES_PASSWORD mà nằm ngoài ứng dụng gọi nó thôi, do vậy nếu ta chỉ dùng hàm SendMessage với mục đích khác thì kô cần xài Hook đâu.

(*)flag ES_PASSWORD có tác dụng biến các ký tự nhập vào thành 1 ký tự đặc biệt duy nhất, thông thường là * ví dụ các pác gõ abcd thì nó hiển thị là ****

còn thằng autoplay em cũng chưa tim hiểu nhiêu nên chưa dám nói Smile, hẹn hum sau sẽ nói tiếp Very Happy

cái này ngoài lề thôi, nó kô liên quan j đến Hook cả, nhưng nó sẽ giúp các pác tìm HANDLE 1 cách dễ dàng
http://msdn.microsoft.com/en-us/magazine/cc301495.aspx
admin
admin
Thiếu Úy III
Thiếu Úy III

Tổng số bài gửi : 627
Diem : 6547
Thank : 4
Join date : 24/03/2010
Đến từ : Bỉm Sơn - Thanh hóa

https://itprofes.forumvi.com

Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết