Chủ Nhật, 14 tháng 3, 2010

C++.Tương Tác Với Mmàn hình Logon Trên Windows XP & Vista

Posted by Unknown Chủ Nhật, tháng 3 14, 2010, under | No comments

Ghi chú : Lượm được bài viết này trên PCWORD, vứt lên để anh em vọc chơi, khá hay.Tự nhiên thực hành windows service với C# lên máu system programing lại trỗi dậy,anh em cùng nghiên cứu nhé.

Nguồn : PCWORDVN

Màn hình đăng nhập của Windows là một đối tượng được bảo vệ kĩ lưỡng vì đó là nơi người dùng cung cấp tên và mật khẩu để bắt đầu sử dụng hệ thống. Màn hình này được gọi là WinLogon desktop, được quản lý bởi tiến trình WinLogon.exe và bắt đầu hoạt động trước khi có bất kì người dùng nào đăng nhập. Về mặt kĩ thuật, để tương tác được với màn hình này, ứng dụng cần hoạt động dưới dạng một Windows service bằng tài khoản LocalSystem và được tự khởi động khi hệ thống bắt đầu làm việc. Điều này có thể thực hiện dễ dàng trên Windows XP và các phiên bản trước, tuy nhiên kiến trúc mới của Windows Vista hoàn toàn không cho phép các service và ứng dụng tương tác với màn hình này. Trên thực tế vẫn có những ứng dụng được yêu cầu phải tương tác được với cửa sổ đăng nhập của Windows Vista, ví dụ hiển thị một hộp thoại, vẽ một hình ảnh hoặc xuất một thông báo trực tiếp lên màn hình nền của cửa sổ đăng nhập.

Bài viết này sử dụng một số thuật ngữ lập trình và bảo mật sử dụng Windows API, do đó bạn cần chuẩn bị các kiến thức liên quan để dễ tiếp cận hơn với vấn đề này và một trình biên dịch như Microsoft Visual C++.


Hình 1 - Hiện thông báo trên màn hình WinLogon của Windows Vista

Service tương tác với WinLogon desktop trong Windows XP

Trong Windows XP hay Windows Server 2003, các service và ứng dụng của người dùng đầu tiên đăng nhập vào hệ thống hoạt động chung ở session 0. Khi đó service có thể tương tác dễ dàng với màn hình WinLogon vì tiến trình WinLogon.exe cũng hoạt động ở session 0 này. Điều này dẫn đến nguy cơ bảo mật khi một ứng dụng có hại có thể nâng cao quyền của mình để tương tác với các ứng dụng điều khiển hệ thống.



Hình 3 - Mô hình ứng dụng cà service hoạt động trong các session của Windows XP



Hình 4 - Các service và ứng dụng của người dùng đầu tiên hoạt động ở session 0 trên Windows XP

Để cho phép service tương tác với WinLogon desktop hoặc các desktop khác, bạn có thể sử dụng một trong ba cách sau:

- Thiết lập bằng tay thông số Allow service to interact with desktop của service, sử dụng Service Management Console. Bạn chạy dòng lệnh services.msc tại trình đơn Start/Run và thiết lập thuộc tính cho service như hình vẽ bên dưới.


Hình 5 - Thiết lập một interactive service bằng Services Management Console

- Sử dụng công cụ dòng lệnh Service Controller sc.exe có sẵn để cài đặt service với các thông số tương tác. Bạn cần có quyền quản trị (administrator) để có thể cài đặt thành công service.

Ví dụ: sc.exe create MyService binPath= C:\MyTools\MyService.exe type= own type= interact start= auto

Trong đó, tham số “type= own type= interact” kết hợp với nhau để cho phép service tương tác với desktop, “start= auto” cho phép service tự động chạy khi hệ thống Windows vừa bắt đầu. Lưu ý, cú pháp của “sc.exe” bắt buộc phải có một dấu cách sau mỗi dấu bằng “=” ở danh sách thông số trên.

- Sử dụng Windows API CreateService để cài đặt service như ví dụ sau:

Mở Services Control Manager để có thể cấu hình các service

Để đoạn mã cài đặt thành công, bạn phải thực thi với quyền quản trị.

#include

SC_HANDLE handleMgr = ::OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_CREATE_SERVICE);

Cài đặt một service mới, ví dụ ta có một service MyService.exe

SC_HANDLE handleSvc = ::CreateService(handleMgr, _T(“MyService”), _T(“MyService”), SERVICE_ALL_ACCESS, SERVICE_INTERACTIVE_PROCESS | SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, _T(“C:\\Z0rr0\\MyTools\\MyService.exe”), NULL, NULL, NULL, NULL, _T(“”));

if (handleSvc != NULL)

{

::CloseServiceHandle(handleSvc);

}

::CloseServiceHandle(handleMgr);

Thao tác vẽ hoặc xuất thông báo lên WinLogon desktop trong Windows XP có thể thực hiện ngay trong entry point ServiceMain của service ngay khi nó vừa bắt đầu hoạt động vì như đã đề cập, Windows XP cho phép một service có thể tương tác.

Các bước thực hiện như sau:

- Mở WinLogon desktop bằng Windows API OpenDesktop

- Đọc và lưu giữ handle của desktop hiện tại mà service đang hoạt động bằng API GetThreadDesktop

- Gán service thread sử dụng WinLogon desktop bằng API SetThreadDesktop

- Thực hiện việc vẽ hoặc xuất thông báo bằng các GDI, API

- Phục hồi desktop cũ mà service hoạt động và đóng WinLogon desktop bằng API SetThreadDesktop

Dưới đây là đoạn mã tham khảo:

Biến lưu giữ desktop hiện tại để phục hồi sau khi thực hiện xong tương tác

HDESK hCurrDesk = NULL;

Mở WinLogon desktop

HDESK hDesktop = ::OpenDesktop(_T(“Winlogon”), 0, FALSE, GENERIC_ALL);

if (NULL != hDesktop)

{

Đọc / lưu giữ desktop hiện tại (default) và chuyển sang WinLogon desktop

hCurrDesk =::GetThreadDesktop(::GetCurrentThreadId());

Gán WinLogon desktop cho thread hiện tại của service

if (!::SetThreadDesktop(hDesktop))

{

::CloseDesktop(hDesktop);

hCurrDesk = NULL;

}

}

Xuất một thông báo lên desktop hiện tại của thread, chính là WinLogon desktop

HDC hDC = ::GetWindowDC(NULL);

TCHAR strMsg[] = _T(“Message on WinLogon desktop of Windows XP”);

DrawTextDC(hDC, strMsg, 200, 200);

Quay lại desktop cũ sau khi đã thực hiện xong việc tương tác

if (NULL != hCurrDesk)

{

::CloseDesktop(hDesktop);

::SetThreadDesktop(hCurrDesk);

}

Phương thức tiện ích xuất một chuỗi thông báo có thể hiện thực như sau:

void DrawTextDC(HDC hdc, LPTSTR str, int x, int y)

{

LOGFONT lf;

HFONT hFont;

Lưu trữ device context (DC) hiện tại để phục hồi sau khi vẽ

::SaveDC(hdc);

Tạo kiểu font chữ cho chuỗi thông báo

memset(&lf, 0, sizeof(LOGFONT));

lf.lfWeight = FW_BOLD;

lf.lfHeight = 22;

_tcscpy(lf.lfFaceName, _T(“Arial”));

hFont = ::CreateFontIndirect (&lf);

Sử dụng font vừa tạo cho device context hiện tại

hFont = (HFONT)::SelectObject (hdc, hFont);

Thiết lập hiệu ứng nền trong suốt và màu chữ

::SetBkMode(hdc, TRANSPARENT);

::SetTextColor(hdc, ::GetSysColor(COLOR_3DFACE));

Vẽ bóng chữ

::SetTextColor(hdc, COLORREF(RGB(111, 111, 111)));

::TextOut(hdc, x, y, str, _tcslen(str));

Vẽ thông báo

::SetTextColor(hdc, COLORREF(RGB(255, 255, 255)));

::TextOut(hdc, x - 2, y - 2, str, _tcslen(str));

:eleteObject(SelectObject (hdc, hFont));

Phục hồi DC cũ

::RestoreDC(hdc, -1);

}

Tương tác với WinLogon desktop trong Windows Vista

Với Windows Vista, các service bắt buộc hoạt động ở session 0 và ứng dụng của người dùng sẽ hoạt động ở các session còn lại với đặc quyền hạn chế. Service chạy ở session 0 sẽ không có khả năng tương tác với desktop cũng như lấy các thông tin liên quan đến đồ họa và tiến trình WinLogon cho mỗi người dùng sẽ hoạt động bắt đầu ở session 1 trở đi. Các thông số cho phép tạo service tương tác trong Services Management Console từng hoạt động tốt trên Windows XP sẽ vô hiệu trên Windows Vista. Thuật ngữ kĩ thuật gọi sự thay đổi này là session 0 isolation. Điều này dẫn đến việc tạo một service tương tác với cửa sổ WinLogon không còn đơn giản như ở các phiên bản trước vì bây giờ service và tiến trình WinLogon nằm ở hai session khác nhau được bảo vệ chặt chẽ bởi cơ chế bảo mật của Windows Vista.



Hình 6 - Mô hình ứng dụng và service hoạt động trong các session của Windows Vista

Hình 7 - Các service ở session 0 và WinLogon ở session 1 trở đi trên Windows Vista

Tương tác với WinLogon desktop từ một service trong Windows Vista

Mặc dù không cho phép trực tiếp truy xuất đến giao diện từ service ở session 0, Vista cho phép service gọi thực thi một ứng dụng ở session khác, hoặc trao đổi với ứng dụng đó dạng client – server thông qua các lời gọi RPC hoặc IPC named pipe, socket hoặc shared memory.

Như vậy mọi chuyện đã trở nên rõ ràng hơn, thay vì thực hiện thao tác vẽ ngay trong service như ở Windows XP, từ service ở session 0 ta sẽ gọi thực thi một ứng dụng ở cùng session với tiến trình WinLogon, tức là session 1, 2,... Ứng dụng ẩn này sau đó sẽ thực hiện việc tương tác tương tự như với Windows XP.

Hình 8 - Service tương tác thông qua một ứng dụng ẩn trong Windows Vista

Ta sẽ phác thảo các bước thực hiện như sau:

- Trong service, tìm tiến trình WinLogon để lấy được access token của người dùng thuộc session tương ứng mà WinLogon đang hoạt động.

- Tạo bản sao token này và tạo thông tin môi trường để áp dụng cho việc thực thi tiến trình ẩn. Phương pháp này gọi là impersonate user token.

- Tạo tiến trình để thực thi ứng dụng ẩn bằng API CreateProcessAsUser với access token vừa lấy ở trên.

- Ứng dụng ẩn này sẽ mở và tương tác với màn hình WinLogon.

Giải pháp trên được hiện thực với mã ví dụ sau, cài đặt trong ServiceMain:

#include

#include

PROCESS_INFORMATION processInfo;

STARTUPINFO startupInfo;

DWORD dwWinlogonPid = 0;

HANDLE hPToken, hProcess;

Tìm tiến trình WinLogon để lấy access token tương ứng. Ví dụ chỉ áp dụng cho trường hợp tương tác với màn hình Winlogon khi chưa có người dùng đăng nhập, nên giả định lúc này chỉ có duy nhất một tiến trình WinLogon hoạt động ở session khác 0

PROCESSENTRY32 procEntry;

HANDLE hSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if (hSnap == INVALID_HANDLE_VALUE) return FALSE;

procEntry.dwSize = sizeof(PROCESSENTRY32);

if (!:rocess32First(hSnap, &procEntry)) return FALSE;

do

{

if (_stricmp(procEntry.szExeFile, _T(“WinLogon.exe”)) == 0)

{

// Để mở rộng, bạn có thể kiểm tra SessionID của tiến trình WinLogon tương ứng

dwWinlogonPid = procEntry.th32ProcessID;

break;

}

} while (:rocess32Next(hSnap, &procEntry));

Đọc access token của tiến trình WinLogon

hProcess = ::OpenProcess(MAXIMUM_ALLOWED, FALSE, dwWinlogonPid);

DWORD dwUserResponse;

if (!::OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILE GES|TOKEN_QUERY
|
TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_ADJUST_ SESSIONID

|TOKEN_READ|TOKEN_WRITE,&hPToken))

{

// Xử lý lỗi không đọc được token }

Bạn có thể impersonate một token và tạo thông tin môi trường ở đây bằng các API DuplicateTokenEx và CreateEnvironmentBlock, tuy nhiên để đơn giản, trong ví dụ này tôi sẽ sử dụng trực tiếp primary token của tiến trình WinLogon khi thực thi ứng dụng ẩn

ZeroMemory(&processInfo, sizeof(processInfo));

ZeroMemory(&startupInfo, sizeof(STARTUPINFO));

Chỉ định ứng dụng ẩn dạng console sẽ hoạt động ở Winlogon desktop của Winsta0, trong cùng session với tiến trình WinLogon

startupInfo.cb = sizeof(STARTUPINFO);

startupInfo.lpDesktop = _T(“Winsta0\\Winlogon”);

startupInfo.dwFlags = STARTF_USESHOWWINDOW;

startupInfo.wShowWindow = SW_HIDE;

Tạo một tiến trình mới thực thi ứng dụng ẩn sử dụng access token của tiến trình WinLogon, đồng nghĩa với việc ứng dụng ẩn của chúng ta sẽ hoạt động cùng session với WinLogon

Trong ví dụ này, giả định ứng dụng ẩn đã được tạo tại C:\Z0rr0\MyTools\HiddenApp.exe

if (!::CreateProcessAsUser(hPToken,

_T(“C:\\Z0rr0\\MyTools\\HiddenApp.exe”),

NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS,

NULL, NULL, &startupInfo, &processInfo)

{

// Xử lý lỗi không tạo được process

}

CloseHandle(hPToken);

CloseHandle(hProcess);

Để hoàn tất một service tương tác hoạt động cho cả Windows XP và Vista, trong ServiceMain ta cần xác định phiên bản Windows trước khi thực hiện phương pháp tương tác tương ứng.

Chuẩn bị dữ liệu để đọc phiên bản Windows đang dùng

OSVERSIONINFOEX osvi;

BOOL bOsVersionInfoEx;

ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));

osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

if( !(bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *) &osvi)) )

{

osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

if ( !GetVersionEx((OSVERSIONINFO*) &osvi))

return FALSE;

}

Xác định phiên bản Windows để thực hiện việc tương tác phù hợp

if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)

{

if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 )

{

Thực hiện tương tác trên Windows Vista hoặc Longhorn server

}

else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )

{

Thực hiện tương tác trên Windows XP workstation

}

else return FALSE;

}

Việc còn lại là tạo một ứng dụng ẩn HiddenApp.exe dạng Windows console bằng Visual Studio C++, có mã như sau:

#include

Hàm vẽ DrawTextDC đã được hiện thực ở ví dụ với Windows XP

void DrawTextDC(HDC hdc, LPTSTR str, int x, int y);

int _tmain(int argc, _TCHAR* argv[])

{

HDC hDC = GetWindowDC(NULL);

TCHAR strMsg[ ] = _T(“Message on WinLogon desktop of Windows Vista”);

DrawTextDC(hDC, strMsg, 200, 200);

return 0;

}

Lưu ý: Các đoạn mã ví dụ trên chỉ mang tính tham khảo, bạn cần điều chỉnh để phù hợp với yêu cầu thực tế của mình hoặc có thể tham khảo mã nguồn kèm theo bài viết này.

Khi đã hoàn tất việc biên dịch service và ứng dụng ẩn, để kiểm nghiệm kết quả bạn cần phải chạy cửa sổ dòng lệnh Command Prompt cmd.exe dưới quyền quản trị (Run as Administrator) trước khi thực hiện lệnh sc.exe để cài đặt service vào hệ thống Windows Vista và đồng thời chép ứng dụng ẩn vào vị trí được chỉ định trong lệnh gọi của service. Cuối cùng là khởi động lại hệ thống và chờ một khoảng thời gian ngắn trước khi đăng nhập để service của bạn tự động chạy và xuất thông điệp lên màn hình.
Bài viết đề cập đến nhiều thuật ngữ và vấn đề lập trình hệ thống và bảo mật trên Windows, đặc biệt là Windows Vista. Hy vọng đây sẽ là đề tài mở để các bạn bắt tay tìm hiểu một vùng đất mới, màu mỡ nhưng cũng không kém phần phức tạp. Chúc các bạn thành công.

Mô Hình TCP/IP

Posted by Unknown Chủ Nhật, tháng 3 14, 2010, under | No comments

I. Mô hình TCP/IP
TCP/IP có cấu trúc tương tự như mô hình OSI, tuy nhiên để đảm bảo tính tương thích giữa các mạng và sự tin cậy của việc truyền thông tin trên mạng, bộ giao thức TCP/IP được chia thành 2 phần riêng biệt: giao thức IP sử dụng cho việc kết nối mạng và giao thức TCP để đảm bảo việc truyền dữ liệu một cách tin cậy.
Hình 1.3 bên dưới cho thấy sự giống và khác nhau giữa 2 mô hình OSI và TCP/IP.
http://uitstyle.com/upload/download....20131/IP 1.JPG
Lớp ứng dụng: Tại mức cao nhất này, người sử dụng thực hiện các chương trình ứng dụng truy xuất đến các dịch vụ hiện hữu trên TCP/IP Internet. Một ứng dụng tương tác với một trong những protocol ở mức giao vận (transport) để gửi hoặc nhận dữ liệu. Mỗi chương trình ứng dụng chọn một kiểu giao vận mà nó cần, có thể là một dãy tuần tự từng thông điệp hoặc một chuỗi các byte liên tục. Chương trình ứng dụng sẽ gửi dữ liệu đi dưới dạng nào đó mà nó yêu cầu đến lớp giao vận.
Lớp giao vận: Nhiệm vụ cơ bản của lớp giao vận là cung cấp phưng tiện liên lạc từ một chương trình ứng dụng này đến một chưng trình ứng dụng khác. Việc thông tin liên lạc đó thường được gọi là end-to-end. Mức chuyên trở có thể điều khiển luông thông tin. Nó cũng có thể cung cấp sự giao vận có độ tin cậy, bảo đảm dữ liệu đến nơi mà không có lỗi và theo đúng thứ tự. Để làm được điều đó, phần mềm protocol lớp giao vận cung cấp giao thức TCP, trong quá trình trao đổi thông tin nơi nhận sẽ gửi ngược trở lại một xác nhận (ACK) và nơi gửi sẽ truyền lại những gói dữ liệu bị mất. Tuy nhiên trong những môi trường truyền dẫn tốt như cáp quang chẳng hạn thì việc xy ra lỗi là rất nhỏ. Lớp giao vận có cung cấp một giao thức khác đó là UDP.
Lớp Internet: Nhiệm vụ cơ bản của lớp này là xử lý việc liên lạc của các thiết bị trên mạng. Nó nhận được một yêu cầu để gửi gói dữ liệu từ lớp cùng với một định danh của máy mà gói dữ liệu phi được gửi đến. Nó đóng segment vào trong một packet, điền vào phần đầu của packet, sau đó sử dụng các giao thức định tuyến để chuyển gói tin đến được đích của nó hoặc trạm kế tiếp. Khi đó tại nơi nhận sẽ kiểm tra tính hợp lệ của chúng, và sử dụng tiếp các giao thức định tuyến để xử lý gói tin. Đối với những packet được xác định thuộc cùng mạng cục bộ, phần mềm Internet sẽ cắt bỏ phần đầu của packet, và chọn một trong các giao thức lớp chuyên trở thích hợp để xử lý chúng. Cuối cùng, lớp Internet gửi và nhận các thông điệp kiểm soát và sử lý lỗi ICMP.
Lớp giao tiếp mạng: Lớp thấp nhất của mô hình TCP/IP chính là lớp giao tiếp mạng, có trách nhiệm nhận các IP datagram và truyền chúng trên một mạng nhất định. Người ta lại chia lớp giao tiếp mạng thành 2 lớp con là:
Lớp vật lý: Lớp vật lý làm việc với các thiết bị vật lý, truyền tới dòng bit 0, 1 từ ni gửi đến nơi nhận.
Lớp liên kết dữ liệu: Tại đây dữ liệu được tổ chức thành các khung (frame). Phần đầu khung chứa địa chỉ và thông tin điều khiển, phần cuối khung dành cho viêc phát hiện lỗi.
Ðề: Mô Hình TCP/IP
II.1. The Process/Application Layer Protocols
II.1.1. Dịch vụ đăng nhập từ xa TELNET
Telnet là ứng dụng sử dụng giao thức telnet cho phép người dùng có thể đăng nhập vào một hệ thống ở xa và làm việc giống như đang sử dụng máy tính nội bộ vậy. Người sử dụng dùng chương trình Telnet Client (chưng trình Telnet trên máy tính trên máy khách) thực hiện một số kết nối TCP với một Telnet Server (chương trình phục vụ telnet trên máy chủ) ở cổng 23
II.1.2. Dịch vụ truyền file FTP
Dịch vụ truyền File FTP (File Transfer Protocol) là một trong những dịch vụ sớm nhất ứng dụng giao thức TCP/ IP. FTP cho phép người dùng thực hiện các chức năng.
+ Sao chép.
+ Đổi tên.
+ Xóa file.
+ Tạo thư mục …..ở một hệ thống ở xa.
Hệ thống FTP ở xa thường yêu cầu người dùng cung cấp định danh ID và mật khẩu trước khi truy nhập hệ thống. Các máy chủ thường cung cấp hai dạng dịch vụ truy nhập.
Truy nhập vào các file công cộng dùng chung qua tài khoản ẩn danh (Anonymous).
Truy nhập vào các file riêng chỉ dành cho những người sử dụng với quyền truy nhập ở mức hệ thống.
FTP sử dụng cổng TCPở lớp Transport để truyền file một cách tin cậy. Tại FTP Server thì sẽ được gán các cổng cố định là 20, 21, còn ở Client thì sẽ được gán giá trị bất kỳ lớn hơn 1023. Để có thể hoạt động FTP thiết lập 2 kết nối. Một cho login và theo đó là giao thức Telnet. Hai là cho quản lý truyền dữ liệu.
II.1.3. Trivial File Transfer Protocol (TFTP)
Mặc dù FTP là giao thức truyền tập tin tổng quát nhất trong bộ giao thức TCP/IP, nhưng nó rất phức tạp. Nhiều ứng dụng không cần đến tất c các tính năng mà FTP cung cấp. Do đó người ta đưa ra một giao thức thứ hai cung cấp dịch vụ ít tốn kém và không phức tạp. Được biết dưới tên Trivial File Transfer Protocol (TFTP), giao thức này không cần đến những tưng tác phức tạp giữa client và server. TFTP giới hạn thao tác chỉ trong việc truyền tập tin và không cung cấp việc xác minh.
Không giống như FTP, TFTP không cần dịch vụ chuyển tin đáng tin cậy. Mà nó sử dụng giao thức UDP của tầng Transport, có sử dụng timeout và việc truyền lại để đảm bảo dữ liệu được truyền đến nơi. Bên gửi truyền một tập tin theo những khối có kích thước cố định (512 byte) và đợi lời đã nhận của mỗi trước khi gửi tiếp. Bên phía nhận gửi tr lời đã nhận sau khi nhận được mỗi khối.
II.1.4 Network File System (NFS)
Được phát triển đầu tiên bởi công ty Sun Microsoft, Hệ tập tin mạng (Network File System-NFS) cung cấp việc truy xuất trực tuyến các tập tin dùng chung. Người sử dụng có thể thực hiện một chưng trình ứng dụng bất kỳ và sử dụng bất kỳ một tập tin nào trong việc xuất nhập. Bản thân tên các tập tin không cho biết chúng cục bộ hay ở xa. NFS là một RPC (Remote Procedure Call ).
II.1.5. Simple Mail Transfer Protocol (SMTP)
Giao thức SMTP là giao thức tiêu chuẩn trên Internet cho việc chuyển thư điện tử giữa các máy tính. SMTP được thiết kế để chuyển giao những thông điệp text và cũng hỗ trợ những ứng dụng multimedia. SMTP thực hiện bên trên một phiên kết nối Telnet NVT.
Có hai thành phần chính trong SMTP: nơi gửi và nơi nhận. Nơi gửi được coi như là máy khách thực hiện lập một kết nối TCP với nơi nhận đóng vai trò là máy chủ. Cổng tiêu chuẩn để thực hiện kết nối TCP là 25. Trong một phiên của SMTP, nơi gửi & nhận trao đổi một chuỗi các lệnh và trả lời.
II.1.6. Simple Network Management Protocol (SNMP)
Giao thức quản lý mạng chuẩn của TCP/IP là SNMP định nghĩa giao thức quản lý cấp để quản lý hai thao tác cơ sở: trích giá trị từ một biến và lưu trữ giá trị vào một biến.
II.1.7. Domain Name Service (DNS)
Đối với những người truy nhập Internet, việc nhớ nhiều địa chỉ IP cùng một lúc là rất khó. Do đó, các nhà thiết kế tạo nên những tên dễ nhớ như: www.yahoo.com, www.google.com, www.windycoffe.com, www.uitstyle.com
Người dùng muốn truy nhập đến địa chỉ nào thì chỉ việc gõ bàn phím những tên đó vào. Tuy nhiên, giao thức lớp mạng IP chỉ có thể hiệu và làm việc được với địa chỉ IP. Do vậy cần có sự chuyển đổi qua lại giữa tên và địa chỉ IP. Việc chuyển đổi tên thành địa chỉ được thực hiện qua hệ thống tên miền (Domain Name System – DNS). Hệ thống DNS thực chất là những CSDL (DNS database) chứa tên và địa chỉ tưng ứng cùng với các thông tin khác đi kèm.
II.1.7. Dynamic Host Configuration Protocol (DHCP)/BootP (Bootstrap Protocol)
Giao thức Bootstrap, gọi là BOOTP, cung cấp một cách khác với RARP cho máy tính nào cần xác định địa chỉ IP của nó. BOOPTP tổng quát hơn RARP vì nó sử dụng UDP, nên có thể mở rộng việc bootstrap đi qua bộ định tuyến. BOOTP cũng cho phép máy tính xác định địa chỉ của bộ định tuyến, địa chỉ server và tên của chương trình mà máy tính phải chạy. BOOTP được thiết kế đủ nhỏ và để chứa được trong bootstrap ROM. Client sử dụng địa chỉ Broadcast có giới hạn để thông tin liên lạc với Server, có trách nhiệm truyền lại nếu Server không trả lời. BOOTP hiệu quả hơn RARP bởi vì một thông điệp BOOTP xác định nhiều dữ liệu cần thiết vào lúc khởi động, bao gồm địa chỉ IP của máy tính, địa chỉ của bộ định tuyến, và địa chỉ của Server.
Được thiết kế như là bước nối tiếp của BOOTP, Dynamic Boat Configuration Protocol (DHCP) là sự mở rộng của BOOTP trên một số phương diện. Quan trọng nhất là DHCP cho phép server cấp phát địa chỉ IP một cách động. Việc cấp phát động là cần thiết đối với những môi trường mạng không giây (wireless), trong đó máy tính có thể kết nối và tách ra khỏi mạng một cách nhanh chóng.
Hình 1.4 dưới đây sẽ mô tả chi tiết hơn về kiến trúc của mô hình TCP/IP.
Ðề: Mô Hình TCP/IP
II.2. The Internet Layer Protocols
II.2.1. Internet Protocol (IP)
Giao thức IP là một giao thức lớp mạng, được sử dụng phổ biến cho các mạng tham gia Internet. Thực chất, Internet là mạng của các mạng nối với nhau qua bộ định tuyến (Router). IP là giao thức được sử dụng để hướng các gói dữ liệu đến nút mạng mà nó cần đến. Mục đích ra đời của IP là để thống nhất việc sử dụng các máy chủ và router từ các hãng sản xuất khác nhau. Cho nên, IP cho phép kết nối nhiều loại mạng có đặc điểm khác nhau mà không làm gián đoạn hoạt động của mạng và kết nối với Internet.
Giao thức IP có ba nhiệm vụ chính đó là:
Thứ nhất: giao thức IP định nghĩa đơn vị cơ sở của lớp Internet.
Thứ hai : thực hiện chức năng định tuyến(routing), chọn ra con đường đi tối ưu mà dữ liệu cần gửi đi.
Thứ ba : điều khiển và xử lý lỗi.
II.2.1.1. Định dạng IP
Trên một mạng vật lý, đơn vị truyền dữ liệu là một frame bao gồm phần đầu và phần sữ liệu, với phần đầu cung cấp địa chỉ nguồn và địa chỉ đích (vật lý). Internet gọi đn vị truyền dữ liệu của nó là IP datagram hoặc là datagram (có những tài liệu thì lại gọi là packet). Cũng giống như một frame trong mạng vật lý, một datagram bao gồm 2 phần:
Phần tiêu đề (header).
Phần dữ liệu (data).
Sau đay ta sẽ tìm hiểu chi tiết nội dung từng trường một trong header của IP datagram.
Trong đó:
VERS (4-bit): chỉ phiên bản hiện hành của IP được sử dụng. Với IP thông thường là 4, thế hệ IP tiếp theo là 6.
HLEN(4-bit): chỉ độ dài phần tiêu đề của datagram tính theo đơn vị từ (32bit). Độ dài tối thiểu là 5 (20 octet).
Service Type: là chỉ số chất lượng dịch vụ yêu cầu cho IP datagram. Trường này bao gồm những thông tin sau:
Total Length: xác định độ dài của toàn bộ datagram,c header và data.
Identification: cùng với các tham số khác như Source IP addres, Destinaton IP address dùng để định danh duy nhất cho một datagram trong khong thời gian gói tin tồn tại trên mạng, dùng để tập hợp fragmented datagram.
Flags: Liên quan đến sự phân đoạn của datagram.
Trong đó:
+0: chưa sử dụng và luôn bằng 0.
+DF(Do not Fragment): bằng 0 có nghĩa là cho phép phân mnh, bằng 1 là không cho phép phân mnh.
+ MF (More Fragments): = 0 đây là đoạn phân mnh cuối cùng (the last fragment). = 1 đây là phân đoạn tiếp theo (more fragments).
Fragment Offset (13 bit): chỉ vị trí của đoạn (fragment) trong datagram ban đầu, tính theo đn vị 8 octet. Mỗi đoạn (trừ đoạn cuối cùng) phi chứa vùng dữ liệu là bội số của 8 octet.
Time to Live (8-bit): quy định thời gian tồn tại (tính bằng giây) của datagram trên mạng để tránh tình trạng datagram không đến được đích và cứ đi lòng vòng trên mạng. Thời gian này được thiết lập bởi trạm gửi và gim đi mỗi đi datagram đi qua một nút mạng. TTL = 0 gói dữ liệu sẽ bị discard.
Protocol Number: This field indicates the higher level protocol to which IP should deliver the data in this datagram. These include:
- 0: Reserved
- 1: Internet Control Message Protocol (ICMP)
- 2: Internet Group Management Protocol (IGMP)
- 3: Gateway-to-Gateway Protocol (GGP)
- 4: IP (IP encapsulation)
- 5: Stream
- 6: Transmission Control Protocol (TCP)
- 8: Exterior Gateway Protocol (EGP)
- 9: Private Interior Routing Protocol
- 17: User Datagram Protocol (UDP)
- 41: IP Version 6 (Ipv6)
- 50: Encap Security Payload for Ipv6 (ESP)
- 51: Authentication Header for Ipv6 (AH)
- 89: Open Shortest Path First
Source IP Address (32bit): địa chỉ IP của trạm gửi.
Destination IP Address(32 bit):địa chỉ IP của trạm nhận.
Header Checksum (16 bit): m• kiểm soát lỗi 16 bit theo phưng pháp CRC, chỉ áp dụng cho vùng header. Trường này luôn được cập nhật khi một gói tin đi qua router trung gian.
Options: khai báo các tuỳ chọn do ni gửi yêu cầu. Trường option không bắt buộc phi có trong mọi datagram và chủ yếu dùng để kiểm tra lỗi trên mạng. Option là một phần quan trọng của giao thức IP nên mọi tiêu chuẩn thực hiện phi dựa trên IP phi bao gồm tiến trình xử lý trường này. Độ dài của trường Option thay đổi tuỳ thuộc vào các tham số đi kèm. Khi các Option xuất hiện trong datagram, nó sẽ kéo dài liên tục mà không có sự ngắt quãng.
II.2.1.2. Định tuyến
Một trong những chức năng của giao thức IP là có kh năng thiết lập kết nối giữa các mạng vật lý khác nhau. Đó chính là định tuyến. Một hệ thống thực hiện chức năng này được gọi là IP router. Sẽ trình bày cụ thể trong phần 2.
II.2.1.3. Điểu khiển và xử lý lỗi
Như ta đã biết giao thức IP cung cấp dịch vụ “unreliable”, chuyển dữ liệu connectionless bằng cách dàn xếp cho mỗi bộ định tuyến chuyển dữ liệu. Mỗi packet sẽ di chuyển từ bộ định tuyến này đến bộ định tuyến khác cho đến bộ định tuyến mà có thể chuyển packet trực tiếp đến đích cuối cùng của nó. Nếu một bộ định tuyến không thể gửi một packet, hay nếu nó phát hiện một dấu hiệu không bình thường có nh hưởng đến việc truyền dữ liệu (ví dụ: nghẽn mạch trên mạng), bộ định tuyến cần phải thông báo cho nơi xuất phát của packet, để tránh hoặc khắc phục lỗi. Do đó cần phải một cơ chế để thông báo lỗi cho bên gửi gói tin.
Giao thức bn tin điều khiển liên mạng ICMP (Internet Control Message Protocol) ra đời để giải quyết vấn đề trên. ICMP cũng giúp cho các host định tuyến trên mạng và cho phép các nhà qun lý mạng theo dõi tình trạng các node trên mạng. Tất cả các host và Router đều phải có khả năng tạo và xử lý các bản tin ICMP nhận được.
Ðề: Mô Hình TCP/IP
II.2.2. Giao thức bản tin điểu khiển liên mạng (ICMP)
Giao thức IP hoạt động tại lớp Network được sử dụng bởi IP cho nhiều dịch vụ khác nhau. Bản tinICMP được mang trực tiếp trong gói tin IP với trường Protocol Number bằng 1.
Có rất nhiều trường hợp khiến cho gói tin IP bị loại bỏ: Đường truyền có sự cố, trường Time-to-Live hết hạn, không phân mảnh được gói tin kích thước lớn hn MTU cho phép....Khi một gói tin cần loại bỏ, bn tin ICMP được sử dụng để thông báo về địa chỉ gửi gói tin.
Tuy nhiên, không phi trường hợp nào ICMP cũng cần phi báo lỗi.Sau đây là một số trường hợp mà khi xảy ra sự cố, ICMP không cần báo lỗi:
Định tuyến hay chuyển giao bản tin ICMP.
Phát quảng bá hay phát theo nhóm gói tin IP.
Các phân đoạn gói tin khác với phân đoạn đầu tiên.
Bn tin có địa chỉ nguồn không xác định một host duy nhất (ví dụ: 127.0.0.1, 0.0.0.0).
Định dạng của bn tin ICMP như sau :
Bản tin ICMP được mang trogn phần dữ liệu của gói tin IP. Mặcdù mỗi bản tin ICMP có dạng riêng của nó, nhưng chúng đều bắt đầu với ba trường sau:
TYPE (8bit): là một số nguyên 8bit để xác định thông điệp.
CODE (8bit):cung cấp thêm thông tin về kiểu thông điệp.
CHECKSUM(16bit) : ICMP sử dụng thuật giải checksum như IP, nhưng ICMP checksum chỉ tính đến thông điệp ICMP.
Hơn nữa, các thông điệp ICMP thông báo lỗi luôn luôn bao gồm phần đầu và 64bit đầu tiên của packet gây nên lỗi. Lý do có thêm phần đầu này cùng với phần đầu packet là để cho phép nơi nhận xác định chính xác hơn những giao thức nào và chương trình ứng dụng có trách nhiệm đối với packet.
Trường TYPE của ICMP xác định ý nghĩa của thông điệp cũng như định dạng của nó.Các kiểu bao gồm:
- 0: Echo reply
- 3: Destination unreachable
- 4: Source quench
- 5: Redirect
- 8: Echo
- 9: Router advertisement
- 10: Router solicitation
- 11: Time exceeded
- 12: Parameter problem
- 13: Timestamp request
- 14: Timestamp reply
- 15: Information request (obsolete)
- 16: Information reply (obsolete)
- 17: Address mask request
- 18: Address mask reply
- 30: Traceroute
- 31: Datagram conversion error
- 32: Mobile host redirect
- 33: Ipv6 Where-Are-You
- 34: Ipv6 I-Am-Here
- 35: Mobile registration request
- 36: Mobile registration reply
- 37: Domain name request
- 38: Domain name reply
- 39: SKIP
- 40: Photuris
Ðề: Mô Hình TCP/IP
II.2.3. ARP và RARP
II.2.3.1. ARP
a/ Khái niệm
Địa chỉ IP được dùng để định danh các trạm và mạng tưng ứng với tưng ứng lớp mạng của mô hình OSI và không phải địa chỉ vật lý của trạm đó trên một mạng cục bộ LAN (Ethernet, Token Ring....). Trên một mạng LAN như vậy, hai trạm chỉ có thể liên lạc với nhau nếu chúng biết địa chỉ vật lý của nhau. Như vậy vấn đề đặt ra là phải có cơ chế ánh xạ giữa địa chỉ IP (32bit) và địa chỉ vật lý (48bit).
Để giải quyết vấn đề trên, người ta xây dưng nên một giao thức ARP. Các thiết bị trên mạng LAN sử dụng ARP để tìm ra thông tin về địa chỉ vật lý của các thiết bị đó trên mạng.
ý tưởng về giải địa chỉ động dua ARP : khi máy A muốn gii địa chỉ IP là IB, nó phát đi một thông điệp quảng bá trên toàn mạng trong đó có chứa địa chỉ IP và vât lý của nó và địa chỉ IP của B. Tất cả các trạm đều nhận được, nhưng chỉ có B nhận ra địa chỉ IP của mình và sẽ trả lời A bằng một thông điệp trong đó có chứa địa chỉ vật lý của B.
Tuy vậy không phải lúc nào khi cần truyền dữ liệu, A đều phát đi thông điệp quảng bá để yêu cầu địa chỉ vật lý của trạm nào đó. Việc phát thông điệp quảng bá như vậy sẽ tốn rất nhiều băng thông trên mạng thậm chí có thể gây ra tình trạng tắc nghẽn không đáng có ở những mạng có tốc độ truyền tải chậm. Do đó, mỗi trạm đều có một bộ đệm ARP (ARP cache) để lưu giữ những địa chỉ IP và vật lý tương ứng tìm được gần đây nhất. Mỗi khi một trạm nhận được một thông điệp ARP yêu cầu hoặc trả lời của một trạm khác, nó đều cập nhật trong ARP cache của mình. Khi truuyền một gói dữ liệu, trạm sẽ tìm xem trong bộ đệm ARP của nó có chứa địa chỉ vật lý tương ứng hay chưa. Nếu tìm thấy, nó sẽ không phát quảng bá ARP nữa. Các địa chỉ trong ARP cache sẽ bị xoá bỏ sau một khoảng thời gian nhất định để đề phòng sự cố xảy ra đối với một trạm nào đó. Ví dụ: một trạm có card mạng bị hỏng, cần thay thế và như vậy địa chỉ vật lý của trạm đó sẽ thay đổi. Nhưng các trạm không biết gì về sự cố đó nên vẫn giữ địa chỉ cũ của trạm này. Đó là lý do vì sao cần phi cài đặt một bộ đếm thờn gian và thông tin trạng thái sẽ bị xoá bỏ sau khi thời gian hết hạn. Ví dụ bất cứ khi nào thông tin về địa chỉ liên kết được đặt vào bộ đệm ARP, giao thức này sẽ yêu cầu thời gian bắt đầu đếm, thông thường là 20 phút. Khi hết hạn (sau 20 phút) thông tin phi được xoá bỏ. Sẽ có 2 khả năng xảy ra khi xoá bỏ.
Nếu không còn dữ liệu được gửi tới máy tính đích này, thì không có gì xy ra nữa.
Nếu vẫn còn dữ liệu được gửi tới máy tính đích này và không còn thông tin về địa chỉ này trong bộ đệm ARP, máy tính sẽ phi lặp lại địa chỉ thông thường là broadcast một yêu cầu ARP và lấy lại thông tin địa chỉ. Nếu máy tính đích vẫn còn đó, thông tin địa chỉ lại được đặt vào bộ đệm ARP. Nếu không, nI gửi sẽ phát hiện được rằng máy đích không còn nối mạng nữa.
b/ Định dạng gói tin ARP
Hardware address space (16bit): xác định loại giao diện sử dụng trên mạng ví dụ: Ethernet, Packet Radio Net.
Protocol address space: xác định loại giao thức ở lớp trên được sử dụng, nó có giá trị080016 dành cho địa chỉ IP.
Hardware address length: Xác định độ dài địa chỉ vật lý trong gói tin ví dụ : IEEE 802.3 và IEEE 802.5 là 6.
Protocol address length: xác định độ dài của địa chỉ của giao thức lớp 3 tương ứng trong mô hình OSI. ví dụ IP là 4.
Operation code: xác định một trong 4 loại thông điệp:
+ARP yêu cầu (ARP request)-1
+ARP tr lời (ARP reply)-2
+RARP yêu cầu (RARP request)-3
+RARP tr lời (RARP reply)-4
Source/target hardware address: bao gồm địa chỉ vật lý của mạng, ví dụ với IEEE 802.3 là 48-bit addresses.
Source/target protocol address: gồm địa chỉ của giao thức, ví dụ với TCP/IP là 32-bit IP addresses.
II.2.3.2. RARP
a/ Khái niệm
Ngược lại với giao thức ARP, giao thức RARP (Reverse ARP) được dùng để tìm địa chỉ IP khi biết địa chỉ vật lý của một trạm. Điều này thường xảy ra khi một số trạm không có đĩa cứng để lưu giữ địa chỉ IP của mình. Những trạm chỉ có địa chỉ vật lý lưu ở trong ROM của card mạng. Chúng phải tìm địa chỉ IP ở trong server quản lý địa chỉ IP khi khởi động. RARP cũng tương tự như ARP gồm 2 loại thông điệp:
+RARP yêu cầu địa chỉ (RARP request).
+ RARP tr lời (RARP reply).
b/ Ý tưởng:
Một máy khi cần biết địa chỉ của nó dưới dạng Broadcast, trên mạng sẽ có RARP server sẽ trả lời bằng cách cấp cho máy của bạn một địa chỉ IP. Định dạng gói tin RARP
Định dạng của RARP giống hệt ARP, tương ứng trường Operation code bằng 3,4.
Ðề: Mô Hình TCP/IP
II.3 The Host-to-Host Layer Protocols
Giao thức IP được thiết kế để thực hiện một chức năng : tạo gói tin và định tuyến đến nơi nhận. Không có cơ chế nào trong giao thức IP đảm bảo các gói tin không bị thất lạc trên đường truyền và đến đúng với thứ tự được truyền đi. Nhiệm vụ đó do giao thức TCP ở tầng giao vận đảm nhiệm. TCP bảo đảm dữ liệu được phân phát tin cậy, theo thứ tự, và không có lỗi.
Một giao thức khác cũng rất phổ biến ở lớp giao vận là giao thức UDP, UDP có đơn vị truyền dữ liệu đơn giản hơn và độ tin cậy kém hơn TCP rất nhiều. UDP thường dùng cho những ứng dụng yêu cầu về tốc độ nhiều ho8n là độ tin cậy.
II.3.1Transmission Control Protocol (TCP)
II.3.1.1. Khái niệm
Một kết nối TCP sẽ được thực hiện khi ứng dụng ở một host truyền và nhận dữ liệu đến một host khác. TCP cung cấp khả năng truyền song công (full-duplex) giữa hai ứng dụng ở hai đầu kết nối.
TCP phi có nhiệm vụ chuyển dữ liệu của lớp ứng dụng thành các đơn vị dữ liệu có thể truyền để có thể đóng gói thành packet ở lớp Internet. Ưng dụng chuyển dữ liệu đến TCP và TCP đặt vào bộ đệm gửi. TCP chia nhỏ dữ liệu và thêm phần tiêu đề (header) tạo thành đơn vị dữ liệu gọi là segment. Kích thước của segment phi luôn được điều chỉnh ở mức tối ưu với tài nguyên hiện có trên mạng. TCP sẽ chờ cho đến khi nhận đủ dữ liệu từ lớp trên trước khi tạo một segment có kích thước phù hợp.
Một máy khách phải được xác định được loại dịch vụ yêu cầu từ máy chủ. Điều này được thực hiện bằng việc sử dụng cặp địa chỉ IP và số hiệu cổng TCP. Cổng TCP nằm trong khong từ 0 đến 65535. Từ 0 đến 1023 là các cổng cho những dịch vụ thông thường.
Sự kết hợp giữa địa chỉ IP và số hiệu cổng tạo thành cặp địa chỉ socket. Một kết nối TCP giữa hai đầu cuối được nhận diện hay phân biệt nhờ địa chỉ socket này. Trong header của packet chứa thông tin địa chỉ nguồn và địa chỉ đích, số hiệu cổng nằm trong segment của TCP.
TCP là một giao thức Connection-Oriented nên để truyền được dữ liệu thì trước đó nó phải thiết lập kết nối rồi duy trì kết nối và sau khi hết dữ liệu cần gửi nó phải giải phóng kết nối. Trong quá trình truyền dữ liệu có sử dụng cơ chế điều khiển luồng (flow control) và điều khiển lỗi.
II.3.1.2. Định dạng dữ liệu của TCP
Mỗi segment của giao thức TCP bao gồm phần tiêu đề (header) và phần dữ liệu (data).
Trong đó:
Source port (16 bit) và Destination port (16 bit): số hiệu cổng của host nguồn và đích.
Sequence Number (32 bit): số hiệu xác định vị trí byte đầu tiên của segment khi bit SYN không được thiết lập. Nếu bit SYN được thiết lập thì đây là số hiệu tuần tự khởi đầu của dữ liệu.
Ackknowledgment Number (32 bit): ký hiệu là ACK, là số hiệu của segment kế tiếp trong dòng dữ liệu mà bên nhận đang chờ. Data Offset (4 bit): chỉ kích thước của phần header TCP tính theo đn vị từ 32 bit. Trường này đồng thời cũng xác định vị trí bắt đầu của phần dữ liệu.
Reserved (6 bit): trường này hiện vẫn dự phòng và luôn bằng 0.
Flags (6 bit): là các bit cờ có ý nghĩa như sau:
-URG: bằng 1 nếu có dữ liệu khẩn. Dữ liệu khẩn sẽ được chỉ ra trong trường Urgent Pointer. Ngược lại thì bằng 0.
-ACK: bằng 0 nếu là segment khởi đầu và khi đó trường ACK Number mới có hiệu lực.
-PSH: thông báo dữ liệu cần chuyển đi ngay.
-RST: xác định lỗi, đồng thời để khởi động lại kết nối.
-SYN:bằng 1 khi thiết lập kết nối.
-FIN: bằng 1 khi trạm nguồn hết thông tin.
Window (16 bit): Đây là số lượng các byte dữ liệu, bắt đầu từ byte được chỉ ra trong trường ACK Number mà trạm nguồn sẵn sàng để nhận.
Checksum (16bit): m• kiểm soát lỗi theo phương pháp CRC của toàn bộ segment.
Urgent Pointer (16 bit): đây là con trỏ tới số hiệu tuần tự của byte đi sau dữ liệu khẩn, cho phép bên nhận biết được độ dài của dữ liệu khẩn. Trường này có hiệu lực khi bit URG được thiết lập 1.
Padding (độ dài thay đổi): Phần mềm chèn thêm vào header để đảm bảo header luôn kết thúc ở một mốc 32 bit. Phần chèn thêm này luôn = 0.
Data (độ dài thay đổi): chứa dữ liệu cần gửi đi của lớp trên TCP.
Options (độ dài thay đổi): khai báo các tuỳ chọn của TCP, trong đó có độ dài tối đa của vùng TCP data trong một segment.
II.3.2. User Datagram Protocol (UDP)
II.3.2.1. KháI niệm
Giao thức UDP là giao thức kết nối không định hướng (connectionless) được sử dụng trên lớp IP theo yêu cầu của ứng dụng. Khác với TCP, UDP không có quá trình thiết lập và giải phóng kết nối. UDP cũng không hỗ trợ chức năng báo nhận (acknowledgement), không sắp xếp tuần tự các đơn vị dữ liệu (packet) đến và có thể dấn đến tình trạng mất hoặc trùng dữ liệu (packet) mà không hề có thông báo lỗi cho ứng dụng sử dụng UDP. Có thể nói UDP không cung cấp các dịch vụ truyền tin tin cậy như TCP.
Giống như TCP, UDP cũng hoạt động dựa trên chế sử dụng các số hiệu cổng (port number) để định danh duy nhất một ứng dụng chạy trên một máy tính nối mạng. Do có it chức năng phức tạp nên UDP có tốc độ truyền và nhận nhanh hơn TCP trong các mạng có độ tin cậy cao như LAN. UDP thường dùng cho các ứng dụng đơn giãn.
II.3.2.2. Định dạng dữ liệu của UDP
Trong đó:
Source port (16 bit) và Destination port (16 bit): số hiệu cổng của host nguồn và đích.
Length: chỉ độ dài của bn tin UDP bao gồm c phần header và data.
Checksum: sử dụng kiểm tra lỗi cho phần header.
TCP/IP cần phải nắm rõ cho những ai theo mạng máy tính.Đừng hiểu phức tạp,hãy hiểu nôm na TCP là "ngôn ngữ" để 2 máy tính có thể nói chuyện với nhau dc,có thể truyền dữ liệu cho nhau dc ,giống như chúng ta,giao tiếp nhau bằng ngôn ngữ là tiếng Việt.Đó là cách thức để truyền,điều kiện cần và đủ để truyền share dữ liệu cho nhau là chúng phải cùng NetID.Còn vì sao như thế các bạn lập ra topic rùi cùng thảo luận,hiện nay trên mạng có khá nhiều cách xác định tuy nhiên rất khó hiểu và phải dùng vào các lớp A,B,C,D phức tạp lắm,k cần như thế vẫn xác định dc

Nguyên Lý Tấn Công ARP Poisoning Và Cách Phòng Thủ

Posted by Unknown Chủ Nhật, tháng 3 14, 2010, under | No comments


Mỗi thiết bị trong hệ thống mạng của chúng ta có ít nhất hai địa chỉ. Một địa chỉ là Media Access Control ( MAC ) và một địa chỉ Internet Protocol ( IP ). Địa chỉ MAC là địa chỉ của card mạng gắn vào bên trong thiết bị, nó là duy nhất và không hề thay đổi. Địa chỉ IP có thể thay đổi theo người sử dụng tùy vào môi trường mạng. ARP là một trong những giao thức của IP, chức năng của nó dùng để định vị một host trong một segment mạng bằng cách phân giải địa chỉ IP ra địa chỉ MAC. ARP thực hiện điều đó thông qua một tiến trình broadcast gói tin đến tất cả các host trong mạng, gói tin đó chứa địa chỉ IP của host cần giao tiếp. Các host trong mạng đều nhận được gói tin đó và chỉ duy nhất host nào có địa chỉ IP trùng với địa chỉ IP trong gói tin mới trả lời lại, còn lại sẽ tự động drop gói tin.

ARP là một giao thức hết sức đơn giản, nó đơn thuần có 4 loại message cơ bản sau:

  • An ARP Request: máy tính A sẽ hỏi toàn mạng : " ai có địa chỉ IP này? "
  • An ARP Reply: máy tính B trả lời máy tính A : "tôi có IP đó, địa chỉ MAC của tôi là..."
  • An Reverse ARP Request: máy tính A sẽ hỏi toàn mạng : " ai có địa chỉ MAC này? "
  • An Reverse ARP Reply: máy tính B trả lời máy tính A: " tôi có MAC đó, địa chỉ IP của tôi là..."

Host A gửi một ARP Request và nhận được một ARP Reply từ một host B có thực trong mạng. sau khi tiến trình này hoàn tất, host Ahost B sẽ có MAC như thế nào. Tiếp theo, host A sẽ lưu lại sự hiểu biết đó lên bộ nhớ của mình gọi là ARP table. ARP table giúp host A không phải thực hiện ARP Request đến host B một lần nữa. đã biết được IP của

MÔ TẢ QUÁ TRÌNH ARP REQUEST VÀ ARP REPLY

  • Trong mạng LAN hiện nay có 4 host: host A, host B, host C, host D.
  • Host A muốn giao tiếp với host C, đầu tiên sẽ broadcast gói tin ARP Requset.
  • Host C nhận thấy đúng IP của mình liền trả lời MAC của mình thông qua gói tin ARP Reply, các host còn lại sẽ drop gói ARP Request.
  • Host A nhận được địa chỉ MAC của host C và ghi nhớ vào ARP table.


NGUYÊN LÝ TẤN CÔNG
Giao thức ARP là rất cần thiết và quan trọng trong hệ thống mạng của chúng ta, tuy nhiên nó lại không đề cập đến vấn đề xác thực nào cả. Khi một host nhận được gói tin ARP Reply, nó hoàn toàn tin tưởng và mặc nhiên sử dụng thông tin đó để sử dụng sau này mà không cần biết thông tin đó có phải trả lời từ một host mà mình mong muốn hay không. ARP không có cơ chế nào để kiểm tra việc đó cả và trên thực tế một host có thể chấp nhận gói ARP Reply mà trước đó không cần phải gửi gói tin ARP Request. Lợi dụng điều này, hacker có thể triển khai các phương thức tấn công như: Man In The Middle, Denial of Service, MAC Flooding



MAN IN THE MIDDLE

Giả sử hacker muốn theo dõi host A gởi thông tin gì cho host B. Đầu tiên, hacker sẽ gởi gói ARP Reply đến host A với nội dung là địa chỉ MAC của hacker và địa chỉ IP của hostB.
Tiếp theo, hacker sẽ gửi gói ARP Reply tới host B với nội dung là MAC của máy hacker và IP của host A. Như vậy, cả hai host Ahost B đều tiếp nhận gói ARP Reply đó và lưu vào trong ARP table của mình. Đến lúc này, khi host A muốn gửi thông tin đến host B, nó liền tra vào ARP table thấy đã có sẵn thông tin về địa chỉ MAC của host B nênsẽ lấy thông tin đó ra sử dụng, nhưng thực chất địa chỉ MAC đó là của hacker. Đồng thời máy tính của hacker sẽ mở chức năng gọi là IP Forwading giúp chuyển tải nội dung mà host A gửi qua host B. Host A host B giao tiếp bình thường và không có cảm giác bị qua máy trung gian là máy của hacker.

Trong trường hợp khác, hacker sẽ nghe lén thông tin từ máy bạn đến Gateway. Như vậy mọi hành động ra Internet của bạn đều bị hacker ghi lại hết, dẫn đến việc mất mát các thông tin nhạy cảm.


DENIAL OF SERVICE


Cũng vận dụng kỹ thuật trên, hacker tiến hành tấn công bằng cách gởi gói ARP Reply đến toàn bộ các host trong mạng với nội dung mang theo là địa chỉ IP của Gateway và địa chỉ MAC không hề tồn tại. Như vậy các host trong mạng tin tưởng rằng mình đã biết được MAC của Gateway và khi gửi thông tin đến Gateway, kết quả là gửi đến một nơi hoàn toàn không tồn tại. Đó là điều hacker mong muốn, toàn bộ các host trong mạng đều không thể đi ra Internet được.

MAC FLOODING

Cách tấn công này cũng dùng kỹ thuật ARP Poisoning mà đối tượng nhắm đến là Switch. Hacker sẽ gửi những gói ARP Reply giả tạo với số lượng khổng lồ nhằm làm Switch xử lý không kịp và trở nên quá tải. Khi đó, Switch sẽ không đủ sức thể hiện bản chất Layer2 của mình nữa mà broadcast gói tin ra toàn bộ các port của mình. Hacker dễ dàng bắt được toàn bộ thông tin trong mạng của bạn.


CÁCH PHÒNG THỦ
ARP Poisoning là một kiểu tấn công dạng local, nghĩa là hacker thực hiện tấn công từ bên trong mạng của bạn. Hậu quả của cách tấn công này là rất lớn, những người quản trị mạng cần nắm bắt rõ về kỹ thuật tấn công này. Sau đây là một số kỹ thuật giúp phòng chống tấn công kiểu ARP Poisoning.
1. Đối với một mạng nhỏ:
Ta có thể sử dụng địa chỉ IP tĩnh và ARP table tĩnh, khi đó, bạn sẽ liệt kê bằng tay IP nào đi với MAC nào. Trong Windows có thể sử dụng câu lệnh ipconfig /all để xem IP và MAC, dùng câu lệnh arp -s để thêm vào ARP table. Khi mà ép tĩnh như vậy sẽ ngăn chặn hacker gởi các gói ARP Reply giả tạo đến máy của mình vì khi sử dụng ARP table tĩnh thì nó luôn luôn không thay đổi. Chú ý rằng cách thức này chỉ áp dụng được trong môi trường mạng với quy mô nhỏ, nếu mạng lớn hơn là không thể vì chúng ta phải thêm vào ARP table bằng tay với số lượng quá nhiều.
2. Đối với một mạng lớn:
Khi quản trị trong một mạng quy mô lớn, ta có thể sử dụng chức năng Port security. Khi mở chức năng Port security lên các port của Switch, ta có thể quy định port đó chỉ chấp nhận một địa chỉ MAC. Như vậy sẽ ngăn chặn việc thay đổi địa chỉ MAC trên máy hacker.

Ngoài ra cũng có thể sử dụng các công cụ, ví dụ như ArpWatch. Nó sẽ phát hiện và báo cáo cho bạn các thông tin liên quan đến ARP đang diễn ra trong mạng. Nhờ đó, nếu có hiện tượng tấn công bằng ARP Poisoning thì bạn có thể giải quyết kịp thời.

Các LệnhTrong CMD Dành Cho Security

Posted by Unknown Chủ Nhật, tháng 3 14, 2010, under | No comments


Chào anh em, trong lúc tham khảo trang HVA mình thấy bài này hữu ích cho các anh em đang quan tâm đến các câu lệnh CMD phục vụ cho việc bảo mật nên muốn cùng chia sẻ. Anh em nào có thêm các lệnh khác thì cùng bổ sung cho bộ sưu tầm thêm hoành tráng nhé.

NET là lệnh nội trú của Windows 2003, XP nên anh em không cần phải đi tìm nó ở đâu hết, cứ gõ là chạy. Chức năng của lệnh này được phân ra theo một số nhóm sau:

1. Managing Services: Quản lý dịch vụ

NET - START, STOP, PAUSE, CONTINUE

2. Managing File Shares and Printer Shares: Kiểm sóat, chia xẻ tài nguyên

NET - SHARE, VIEW, USE, FILE, SESSIONS

3. Managing Network Print jobs and Network Time: Kiểm sóat tác vụ in ấn và thời gian vào mạng

NET - TIME, PRINT

4. Managing Security: Kiểm sóat bảo mật hệ thống

NET - ACCOUNTS, USER, GROUP, LOCALGROUP

5. Network Messaging: Giao dịch nhắn tin trong mạng

NET - NAME, SEND

6. Managing Network configuration: Quản lý cấu hình của mạng

NET - COMPUTER, CONFIG_WORKSTATION, CONFIG_SERVER, STATISTICS_WORKSTATION, STATISTICS_SERVER

Bây giờ tôi xin đi vắn tắt một số lệnh của NET theo từng nhóm.

1. Managing service:

Cú pháp của lệnh như sau:

NET START [service]

NET STOP [service]

NET PAUSE [service]

NET CONTINUE [service]

Trong đó [service] chính là từ khóa hiển thị trong phần service của Control Panel

Bốn lệnh START, STOP, PAUSE và CONTINUE tương ứng với KHỞI ĐỘNG, DỪNG, TẠM NGỪNG, TIẾP TỤC cái service mà

anh em sẽ chỉ định cho nó thực thi. Để biết tên của các service đang chạy, anh em gõ vào dòng lệnh:

NET START

Lệnh này liệt kê tên đầy đủ của các service đang chạy. Muốn dừng chúng thì phải gõ NET STOP [service] với tên service viết gọn giống như trong Control Panel. Ví dụ anh em đang dùng Norton Antivirus, rủi có chép một trình nào đó như Brutus chẳng hạn thì nó cứ nhảy ra và la lên là cái file đó có trojan bên trong. Thế là nó không cho anh em chép vào máy của mình. Bây giờ gõ lệnh sau:

NET STOP navapsvc

Màn hình sẽ hiện ra

The Norton AntiVirus Auto Protect Service service is stopping.

The Norton AntiVirus Auto Protect Service service was stopped successfully.

Bây giờ anh em ngó xuống cái icon của NAV phía dưới System Tray thì thấy nó bị gạch chéo (disabled) rồi. Đó là do mình tắt bằng NET STOP.

2. Managing File Shares and Printer Shares: Kiểm sóat, chia xẻ tài nguyên

Lệnh NET này đi kèm một số tham số sau: SHARE, VIEW, USE, FILE, SESSIONS

SHARE - hiển thị những chia xẻ trên máy, ví dụ

Share name Resource Remark

-----------------------------------------------------------
IPC$ Remote IPC

D$ D:\ Default share

F$ F:\ Default share

ADMIN$ E:\WINDOWS Remote Admin

C$ C:\ Default share

E$ E:\ Default share

The command completed successfully.

Các share có dấu $ là chia xẻ tài nguyên ở mức hệ thống cho admin, thường gọi là share ẩn.

VIEW - hiển thị tất cả các máy trong cùng domain hoặc workgroup

Server Name Remark

-----------------------------------------

\\CPQ25981604619 DTLong

\\DEFAULT-EBGQAMU

\\FERRARI Formula 1

\\JITH

\\JOE-VT6094JJ9

\\KACE

\\KENGCOM KengCOM

\\LOTUS

The command completed successfully.

Bây giờ ta bàn cách chiến đấu một số máy để tìm tài nguyên. Lệnh Net View cho phép xem tài nguyên chia xẻ của các máy cùng subnet. Cú pháp câu lệnh như sau:

NET VIEW [tên máy]

Ví dụ: NET VIEW \\KACE

Nếu máy này có chia xẻ tài nguyên, màn hình sẽ hiện ra tên của các share directory, lúc này ta chỉ việc phát lệnh sử dụng tài nguyên đó mà thôi.

Để chiếm dụng tài nguyên chia xẻ, anh em có thể dùng My Network Places / Network Neighborhood để truy nhập vào, ở đây ta dùng lệnh NET USE thay cho việc dùng My Network Places

NET USE * \\tên máy\tên share
hoặc

NET USE xxx.xxx.xxx.xxx

Trong đó tên máy là tên hiện ra qua lệnh NET VIEW. Trường hợp sử dụng IP của máy trong NET USE, anh em phải gõ IP vào.

Để biết IP của máy nạn nhân, có thể lace w:st="on">PINGlace> vào tên của máy. Ví dụ

PING LOTUS

Pinging lotus [202.129.41.106] with 32 bytes of data:

Reply from 202.129.41.106: bytes=32 time<1ms TTL=128

Reply from 202.129.41.106: bytes=32 time<1ms TTL=128

Reply from 202.129.41.106: bytes=32 time<1ms TTL=128

Reply from 202.129.41.106: bytes=32 time<1ms TTL=128

Ping statistics for 202.129.41.106:

Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),

Approximate round trip times in milli-seconds:

Minimum = 0ms, Maximum = 0ms, Average = 0ms

Như vậy, máy LOTUS có địa chỉ IP là 202.129.41.106

Trong lệnh NET USE, dấu * có nghĩa là lấy tên một ổ đĩa bất kỳ (từ A-Z) rồi ánh xạ share đó vào ổ đĩa tùy chọn ấy. Nếu trên LOTUS có share một thư mục là SharedDocs thì lúc này lệnh NET USE dùng như sau:

NET USE * \\LOTUS\SharedDocs

hoặc

NET USE * \\202.129.41.106\SharedDocs

Sau khi thành công, SharedDocs biến thành ổ đĩa Z (chẳng hạn) trên máy của anh em.

Có thể chiếm dụng sâu hơn vào trong tài nguyên ẩn của máy. Lệnh gõ như sau:

NET USE * \\202.129.41.106\C$

Nếu lệnh này thành công, ổ C của máy nạn nhân sẽ "bay" về máy anh em như một ổ đĩa của mình vậy. Dùng như trên máy mình và cũng có thể xóa lung tung như nó là của mình vậy. Tương tự, phỏng đoán máy nạn nhân có thể có vài ổ đĩa như D, E, F, anh em có thể thử lệnh trên với D$, E$, F$, G$ tới khi nào nó báo lỗi thì tức là ổ đĩa đó không có trên máy của nạn nhân.

Thường thì các share ẩn này share cho account admin nên khi mình gõ lệnh đó nó sẽ hỏi Username và Password. Nếu đoán được Username (ví dụ: LOTUS) thì gõ vào rồi cũng đóan luôn mật khẩu nhé (hơi khó đấy), bằng không thì anh em nhập Administrator vào cho Username, còn để password là rỗng (sau khi nhập Username thì gõ ENTER tiếp cho phần mật khẩu). Nếu may mắn tiếp thì có thể thóat qua được. Trường hợp này là do admin máy đó sơ sẩy không đổi password mặc định của Windows sau khi cài hệ điều hành. Và như vậy anh em có thể ung dung chiếm tài nguyên của nạn nhân rồi. Anh em sẽ đi du lịch trong máy nạn nhân, chép bất cứ cái gì anh em thích như là đang trên máy mình vậy. Tuy nhiên cơ hội thành công là rất thấp. Vì thế, lệnh NET USE này thường chỉ phát huy tác dụng cao với các máy có share tài nguyên cho mọi người (ví dụ như SharedDocs).

Lưu ý, có một mẹo nhỏ. Nếu anh em chiếm được quyền admin với account Administrator và password rỗng rồi thì anh em có thể dùng con Hyena tạo ra một account cho mình trên máy nạn nhân, đề phòng trong tương lai chúng cài service pack thì NET USE hết đường làm ăn. Lúc đó có con account kia rồi dễ bề tung hoành hơn.

Mấy lệnh trên là những lệnh chính thường dùng. Các lệnh còn lại xin anh em tham khảo thêm trên mạng nhé. Chúng đơn giản nói ra sợ anh em mất thời gian đọc.

Đoạn cuối của phần này xin được giới thiệu cùng anh em các câu lệnh về máy in và kiểm sóat thời gian.

3. Managing Network Print jobs and Network Time:

TIME, PRINT

Lệnh NET TIME cho biết thời gian của đồng hồ trên máy mạng. Câu lệnh là:

NET TIME \\tên máy

Ví dụ: NET TIME \\LOTUS

Lệnh này có nhiều biến thể khác, anh em chịu khó tham khảo. Tôi giới thiệu thêm về lệnh đồng bộ hóa đồng hồ máy mình với máy chủ trên mạng, cú pháp như sau:

NET TIME \\servername /SET /YES

Trong đó servername là tên của máy chủ

Lệnh NET PRINT có cú pháp như sau: NET PRINT \\ComputerName\ShareName




Hiển thị tác vụ hiện thời trên máy in, giống như việc xem xét thông qua Printer Manager xem có những tài liệu nào đang được máy in đó in ra.

ComputerName là tên máy chủ có share máy in
ShareName là tên share của máy in đó.

Để tạm ngưng (PAUSE) một lệnh in, có thể dùng lệnh sau

NET PRINT [\\ComputerName] job# /HOLD

ComputerName là tên máy có share printer còn job# tương đương số thứ tự của tài liệu in trên danh sách các tài liệu đang được in (1,2,3,4...)
Để tiếp tục in sau khi lệnh HOLD được thi hành, gõ vào lệnh

NET PRINT [\\ComputerName] job# /RELEASE

Để xóa, delete một lệnh in, ví dụ trong trường hợp in nhầm một văn bản lớn, anh em có thể gõ lệnh

NET PRINT [\\ComputerName] job# /DELETE

Để Bạn An Toàn Trên Internet

Posted by Unknown Chủ Nhật, tháng 3 14, 2010, under | No comments

Phần lớn chúng ta đều rất hồn nhiên khi kết nối vào Internet. Chúng ta cảm thấy Internet quả là một kho dữ liệu vô tận về muôn mặt cuộc sống, và khi lướt qua các trang web chúng ta không khỏi trầm trồ về sự kỳ diệu, sự phi thường mà Internet mang lại cho cuộc sống của chúng ta.

Nhưng chúng ta cũng phải hết sức cảnh giác. Internet, hiểu một cách hình tượng, cũng giống như xã hội loài người. Nghĩa là: nó cũng bao gồm tất cả những gì là tốt là xấu, là cao quí cũng như thấp hèm, là thật thà cũng như lừa đảo... Tuy nhiên chúng ta lại không thể sống mà không tham gia vào cộng đồng xã hội, không thể tiến hành cuộc cách mạnh khoa học công nghệ mà lại bỏ qua Internet. Chính vì vậy, bài viết này có tham vọng giúp các bạn tăng cường các biện pháp bảo vệ chính mình khi tham gia vào mạng toàn cầu Internet.

Tạo mật khẩu (password):

Đừng bao giờ tạo một mật khẩu (password) dễ dàng. Đừng bao giờ tự bằng lòng với mình và đừng bao giờ, chỉ vì để dễ nhớ mà dùng một hoặc hai password khi bạn đăng ký làm thành viên với nhiều địa chỉ (site) khác nhau. Nhớ đừng dùng những từ dễ đoán ra, hãy kết hợp các chữ cái, các biểu tượng và con số với nhau, và nhớ phải tạo password dài hơn 7 ký tự. Bạn không nên dùng ngày sinh, tên người yêu, con cái... hoặc đơn giản như ABCD1234. Hãy ghi nhớ password của mình nhưng không nên lưu trên máy tính. Bạn không nên dùng chức năng nhớ password và hãy chịu khó nhập password mỗi lần đăng nhập.

Xóa file tạm của trình duyệt (cache):

Bạn không nên giữ các file tạm (cache) mà trình duyệt lưu giữ. Các trình duyệt lưu giữ các thông tin về những trang mà bạn đã ghé thăm trong một thư mục đặc biệt trên ổ cứng. Chức năng này là một con dao hai lưỡi: một mặt nó nâng cao tốc duyệt web, mặt nó lại cho phép bất cứ ai tiếp cận được máy tính của bạn cũng có thể biết được bạn vừa làm gì. Cho nên, lời khuyên của tôi là bạn nên thường xuyên xóa cache.

Thứ Sáu, 12 tháng 3, 2010

Vài Cách Diệt Virus Autorun Hiệu Quả

Posted by Unknown Thứ Sáu, tháng 3 12, 2010, under | No comments

Virus autorun chắc bạn nào dùng windows đều đã từng bị virus autorun làm cho bực mình! (mỗi khi muốn mở ổ đều phải nhấn chuột phải)
Dưới đây tôi sẽ đưa ra cho các bạn vài cách để tiêu diệt loại virus này một cách hiệu quả (thậm chí là tuyệt đối!)
Cách 1:
Tại cửa sổ run đánh: ”cmd cd\ dir *:\autorun.inf/a” trong đó * là ổ mà bạn muốn kiểm tra tham số a là cho hiện ra những file ẩn,nếu như ổ của bạn có virus autorun thì sẽ hiện ra 1 file ở đó có 1 đuạn mã mà bạn chỉ cần sửa đoạn mã đó như sau:
 
[AutoRun] open=setup.exe icon=setup.exe,0  

Sau đó các bạn save nó lại rồi khởi động lại máy phải lưu ý với các bạn 1 điều là cách này không được hiệu quả lắm!
Cách 2:
Cũng tại cửa sổ cmd đánh: ”del *:\autorun.inf/f/a“ trong đó f là tham số để cưỡng chế xoá, sau đó các bạn khởi động lại máy!
Cách 3:
Các bạn hãy mở winrar tại thư mục gốc của mỗi ổ hãy tạo một folder có tên là “autorun.inf” đồng thời trong file autorun này các bạn lại tiếp tục tạo 1 file mới lấy tên la: “khong the xoa..\” xin lưu ý là đằng sau chữ không thể xoá là ba dấu chấm và 1 dấu gạch chéo, nếu như không có 2 dấu chấm trở lên và 1 dấu \ thì không được,còn tên này thì các bạn tuỳ chọn! (đây là một cách lợi dụng winrar) cũng làm như vậy nhưng là trong cmd nhập lệnh như sau: 
cd\ d: (nếu bạn muốn làm ở ổ d) mkdir autorun.inf 
 cd autorun.inf mkdir khong the xoa…\ 
cd.. cd.. attrib +s +r +h autorun.inf 
 
Vậy là ok cũng tương tự như vậy các bạn có thể làm với các ổ khác. Cách này có thể coi là miễn dịch với autorun (cho ổ cứng uống vacxin autorun) sau này đảm bảo các bạn sẽ không bị nhiễm autorun nữa!
Hoặc các bạn có thể copy đoạn mã dưới đây vào notepad: 
@echo off mkdir c:\autorun.inf\khongthexoa...\
attrib +s +h +r c:\autorun.inf 
 
sau đó đổi thành đuôi “.bat” va kích vào đó là ok, nếu bạn muốn làm với các ổ khác thì chỉ cần sửa tên ổ c thành ổ đó là được! đây là 1 cách rất hay vì nó tận dụng việc trong windows không thể xuất hiện cùng luc 2 file có tên giống nhau.
Chúc các bạn thành công!

Diệt Virus Không Cho Logon Windows

Posted by Unknown Thứ Sáu, tháng 3 12, 2010, under | No comments

Hiện tượng: Bạn không thể logon (đăng nhập) vào máy vì người dùng sẽ bị chuyển sang chế độ Logoff ngay khi vừa gõ username và password để đăng nhập vào Windows.
Đặc điểm của loại virus này là thay đổi giá trị Registry tại khóa :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
"Userinit"="C:\\Windows\\system32\\userinit.exe," ( có dấu " , " ở cuối) để chỉ đến files của chính nó.  
Phương pháp diệt 1:
Vì vậy, ta chỉ cần chỉnh sửa giá trị Userinit về giá trị mặc định thì sẽ lại logon được! Nhưng làm sao để vào Registry khi không logon được? Chúng ta sẽ lơi dụng lỗ hổng của file sethc.exe.
Các bước thực hiện:
B1: Khởi động từ đĩa Hiren's Boot, sử dụng chương trình quản lý file trong Hiren's Boot để vào thư mục System32.
B2: Thay thế file Sethc.exe bằng cmd.exe
B3: Lấy đĩa Hiren's Boot ra và Khởi động lại máy
B4: Tại cửa sổ Logon, nhấn phím Shift 5 lần để hiện cửa sổ Command Line
B5: Gõ vào regedit.exe
B6: Duyệt đến khóa: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
sửa lại giá trị mặc định là:  "Userinit"="C:\\Windows\\system32\\userinit.exe,
Phương pháp diệt 2:
Cách làm như sau: bạn chuẩn bị 1 CD có tích hợp Windows mini, PE....
- Ở đây sử dụng Windows mini có trong CD Hiren Boot 9.8
- Sau khi cho CD vào, các bạn chọn boot from CD
- Tiếp theo chọn Start Windows Mini
- Sau khi hệ thống khởi động vào win mini rồi, các bạn xoá lần lượt các files autorun và Mixa_I nếu có ở C:\ và C:\WINDOWS, và các ổ đĩa cứng khác trên máy.
- Tiếp theo tìm đến file RegEditPE trong CD boot ở đường dẫn HBCD\win tools\files
- Bạn kích hoạt file RegEditPE đó, sau khi chạy xong, máy sẽ hiện ra 1 bảng thông báo là Browse For Folder, các bạn chọn đường dẫn C:\Windows. Xin nói thêm về tác dụng của việc này là chương trinh sẽ load những hive bị lỗi do virus gây ra trên hệ thống.
- Sau đó là một cửa sổ khác tên là "Select the remote SAM hive!", các bạn double click vào file SAM trong cửa sổ đang mở, lần lượt tiếp là các file Security, Software, System. Lưu ý là chỉ chọn những file với phần tên như mình nêu ra thôi nghen, đừng click vào các file có phần đuôi .* nhé.
- Lúc này máy sẽ hiện ra một bảng thông báo nửa, các bạn chọn "No" vì hệ thống hỏi chúng ta có cần load thêm remote user hay ko?
- Sau khi load xong các hive bị lỗi, hệ thống hiện ra cửa sổ Regedit, các bạn theo đường dẫn sau: _REMOTE_HKEY_LOCAL_MACHINE_\SOFTWARE\Microsoft\Win dows NT\CurrentVersion\Winlogon
- Nhìn sang bên phải cửa sổ, tìm đến String Value tên là Userinit, double click vào giá trị này sẽ hiện ra 1 bảng chỉnh sửa thông tin của file Userinit, các bạn sửa lại đường dẫn đúng là: "C:\WINDOWS\system32\userinit.exe," lưu ý là có dấu phẩy "," sau cùng nha.
- Xong rồi sẽ làm gì tiếp đây? Đóng cửa sổ RegEdit, tiếp theo là reset computer và tận hưởng Windows như ngày nào chứ làm gì...

Thứ Năm, 11 tháng 3, 2010

Programming Anti-Cracking

Posted by Unknown Thứ Năm, tháng 3 11, 2010, under | No comments

1/-Anti Set breakpoint on API function:
Một ví dụ để chứng minh việc ko cần import hàm API MessageBox nhưng vẫn sử dụng được hàm API này. Mục đích chính là để tránh các cracker set breakpoint trên hàm API để crack.
Phương pháp đầu tiên tui mới giới thiệu là dùng hàm LoadLibrary và GetProcAddress
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
.data
dwMessageBox dd 0
szUser32 db "USER32.dll",0
szMessageBox db "MessageBoxA",0
szTitle db 'No import func',0
szMessage db 'Show MessageBox but no import it!',0
.code
start:
invoke LoadLibrary,addr szUser32
invoke GetProcAddress,eax,offset szMessageBox
mov dwMessageBox,eax
push MB_OK
lea eax,szTitle
push eax
lea eax,szMessage
push eax
push 0
call dword ptr [dwMessageBox]
invoke ExitProcess,NULL
end start
2/-Anti Search for All referenced text strings:
Các cracker dùng tính năng search for all referenced text strings của debug để tìm addr của chuổi thông báo invalid key (bad boy). Do đó để ko để lộ string, chúng ta phải mã hóa (encrypt) nó trước tiên. Sau đó khi cần dùng string chúng ta decrypt lại string.
Sau đây là func vừa encrypt vừa decrypt chuổi string. Hàm này tui tham khảo trong code yC12 của yoda:
EnDeCryptString proc pAddressString:DWORD
PUSH ESI
PUSH EDI
MOV EAX,pAddressString
MOV ESI,EAX
MOV EDI,EAX
DllCryptLoop:
LODSB
ROR AL,4
STOSB
CMP BYTE PTR [EDI],0
JNZ DllCryptLoop
POP EDI
POP ESI
RET
EnDeCryptString endp
;--------------------------------------------------------------------------------------------------
Đây là tòan bộ code ví dụ. Tui ko giải thích nhiều ở đây. Tui chỉ nói sơ qua về cách tìm chuổi szMessage đã mã hóa như phần khai báo .data trong ví dụ. Tôi đã coding một chương trình encrypt chuổi ‘Show MessageBox but no import it!’. Rồi dùng Olly và plugin DataRipper để copy data chuổi đã mã hóa và past vào ví dụ của chúng ta.
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
EnDeCryptString PROTO :DWORD
.data
dwMessageBox dd 0
szUser32 db "USER32.dll",0
szMessageBox db "MessageBoxA",0
szTitle db 'Cryted String',0
szMessage db 035h, 086h, 0F6h, 077h, 002h, 0D4h, 056h, 037h
db 037h, 016h, 076h, 056h, 024h, 0F6h, 087h, 002h
db 026h, 057h, 047h, 002h, 0E6h, 0F6h, 002h, 096h
db 0D6h, 007h, 0F6h, 027h, 047h, 002h, 096h, 047h
db 012h, 000h
;db 'Show MessageBox but no import it!',0
.code
start:
invoke LoadLibrary,addr szUser32
invoke GetProcAddress,eax,offset szMessageBox
mov dwMessageBox,eax
invoke EnDeCryptString, addr szMessage
push MB_OK
lea eax,szTitle
push eax
lea eax,szMessage
push eax
push 0
call dword ptr [dwMessageBox]
invoke ExitProcess,NULL
EnDeCryptString proc pAddressString:DWORD
PUSH ESI
PUSH EDI
MOV EAX,pAddressString
MOV ESI,EAX
MOV EDI,EAX
DllCryptLoop:
LODSB
ROR AL,4
STOSB
CMP BYTE PTR [EDI],0
JNZ DllCryptLoop
POP EDI
POP ESI
RET
EnDeCryptString endp
end start
Sau khi biên dịch chương trình, chúng ta load vào olly thử xem nó search được badboy ko nhé.
3/-Anti Patching:
Thuở ban đầu khi tôi mới nghiên cứu reversing thì tôi đã đụng đến dạng anti patching này rồi. Kỹ thuật cũ kỹ này chính là dùng thuật tóan CRC để check các bytes tại 1 đọan code nào đó trong code section. Nếu CRC của đọan code đó bằng CRC chuẩn thì coi như đọan code đó ko bị patching. Nếu ko thì chương trình bị cracker patched code. Ta thử thí nghiệm như sau:
Ví dụ đầu tiên ta có một chương trình đơn giản sau:
.386
.model flat, stdcall
option casemap:none
include c:\masm32\include\windows.inc
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\kernel32.lib
include c:\masm32\include\user32.inc
includelib c:\masm32\lib\user32.lib
.data
szTitle db 'No import func',0
szMessage db 'Show MessageBox but no import it!',0
.code
start:
push MB_OK
lea eax,szTitle
push eax
lea eax,szMessage
push eax
push 0
lea eax,MessageBox
call eax
invoke ExitProcess,NULL
end start
Nếu ta debugging nó trong Olly thì sẽ như nhận được như sau:
00401000 >/$ 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
00401002 |. 8D05 00304000 LEA EAX,DWORD PTR DS:[403000] ; |
00401008 |. 50 PUSH EAX ; |Title = NULL
00401009 |. 8D05 0F304000 LEA EAX,DWORD PTR DS:[40300F] ; |
0040100F |. 50 PUSH EAX ; |Text = NULL
00401010 |. 6A 00 PUSH 0 ; |hOwner = NULL
00401012 |. 8D05 28104000 LEA EAX,DWORD PTR DS:[401028] ; |
00401018 |. FFD0 CALL EAX ; \MessageBoxA
0040101A |. 6A 00 PUSH 0 ; /ExitCode = 0
0040101C \. E8 01000000 CALL ; \ExitProcess
Từ addr 00401000 đến addr 0040101A là đọan code thể hiện gọi hàm MessageBoxA. Vậy chúng có chiều dài là 1Ah
Bây giờ ta thử viết một chương trình check xem CRC của đọan code này là bao nhiêu:
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
include \masm32\macros\macros.asm
.data
szTitle db 'No import func',0
szMessage db 'Show MessageBox but no import it!',0
dwCRC dd 0
strBenina db "CRC check",0
strFormat db "%x",0
.data?
strTmp db 20 dup(?)
.code
start:
code_check:
push MB_OK
lea eax,szTitle
push eax
lea eax,szMessage
push eax
push 0
lea eax,MessageBox
call eax
push offset code_check
push 1Ah
call CRC32
mov dwCRC,eax
invoke wsprintf,addr strTmp,addr strFormat,eax
invoke MessageBoxA,NULL,addr strTmp,addr strBenina,MB_OK
mov eax,dwCRC
.if eax==082492b0ah
invoke MessageBoxA,NULL,chr$("Program No Patching"),chr$("Normal"),MB_OK
.elseif
invoke MessageBoxA,NULL,chr$("Program Patched"),chr$("Very Bad"),MB_OK
.endif
invoke ExitProcess,0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CRC32 proc lData:DWORD, ptrData:DWORD
push esi
push ecx
push edx
mov esi, ptrData
xor edx, edx
or eax, -1
mov ecx, lData
CRC32_loop:
mov dl, byte ptr [esi]
xor dl, al
shr eax, 8
xor eax, dword ptr [crc32_table + 4*edx]
inc esi
dec ecx
jnz CRC32_loop
not eax
pop edx
pop ecx
pop esi
ret
crc32_table dd 000000000h, 077073096h, 0EE0E612Ch, 0990951BAh, 0076DC419h, 0706AF48Fh, 0E963A535h, 09E6495A3h, 00EDB8832h, 079DCB8A4h
dd 0E0D5E91Eh, 097D2D988h, 009B64C2Bh, 07EB17CBDh, 0E7B82D07h, 090BF1D91h, 01DB71064h, 06AB020F2h, 0F3B97148h, 084BE41DEh
dd 01ADAD47Dh, 06DDDE4EBh, 0F4D4B551h, 083D385C7h, 0136C9856h, 0646BA8C0h, 0FD62F97Ah, 08A65C9ECh, 014015C4Fh, 063066CD9h
dd 0FA0F3D63h, 08D080DF5h, 03B6E20C8h, 04C69105Eh, 0D56041E4h, 0A2677172h, 03C03E4D1h, 04B04D447h, 0D20D85FDh, 0A50AB56Bh
dd 035B5A8FAh, 042B2986Ch, 0DBBBC9D6h, 0ACBCF940h, 032D86CE3h, 045DF5C75h, 0DCD60DCFh, 0ABD13D59h, 026D930ACh, 051DE003Ah
dd 0C8D75180h, 0BFD06116h, 021B4F4B5h, 056B3C423h, 0CFBA9599h, 0B8BDA50Fh, 02802B89Eh, 05F058808h, 0C60CD9B2h, 0B10BE924h
dd 02F6F7C87h, 058684C11h, 0C1611DABh, 0B6662D3Dh, 076DC4190h, 001DB7106h, 098D220BCh, 0EFD5102Ah, 071B18589h, 006B6B51Fh
dd 09FBFE4A5h, 0E8B8D433h, 07807C9A2h, 00F00F934h, 09609A88Eh, 0E10E9818h, 07F6A0DBBh, 0086D3D2Dh, 091646C97h, 0E6635C01h
dd 06B6B51F4h, 01C6C6162h, 0856530D8h, 0F262004Eh, 06C0695EDh, 01B01A57Bh, 08208F4C1h, 0F50FC457h, 065B0D9C6h, 012B7E950h
dd 08BBEB8EAh, 0FCB9887Ch, 062DD1DDFh, 015DA2D49h, 08CD37CF3h, 0FBD44C65h, 04DB26158h, 03AB551CEh, 0A3BC0074h, 0D4BB30E2h
dd 04ADFA541h, 03DD895D7h, 0A4D1C46Dh, 0D3D6F4FBh, 04369E96Ah, 0346ED9FCh, 0AD678846h, 0DA60B8D0h, 044042D73h, 033031DE5h
dd 0AA0A4C5Fh, 0DD0D7CC9h, 05005713Ch, 0270241AAh, 0BE0B1010h, 0C90C2086h, 05768B525h, 0206F85B3h, 0B966D409h, 0CE61E49Fh
dd 05EDEF90Eh, 029D9C998h, 0B0D09822h, 0C7D7A8B4h, 059B33D17h, 02EB40D81h, 0B7BD5C3Bh, 0C0BA6CADh, 0EDB88320h, 09ABFB3B6h
dd 003B6E20Ch, 074B1D29Ah, 0EAD54739h, 09DD277AFh, 004DB2615h, 073DC1683h, 0E3630B12h, 094643B84h, 00D6D6A3Eh, 07A6A5AA8h
dd 0E40ECF0Bh, 09309FF9Dh, 00A00AE27h, 07D079EB1h, 0F00F9344h, 08708A3D2h, 01E01F268h, 06906C2FEh, 0F762575Dh, 0806567CBh
dd 0196C3671h, 06E6B06E7h, 0FED41B76h, 089D32BE0h, 010DA7A5Ah, 067DD4ACCh, 0F9B9DF6Fh, 08EBEEFF9h, 017B7BE43h, 060B08ED5h
dd 0D6D6A3E8h, 0A1D1937Eh, 038D8C2C4h, 04FDFF252h, 0D1BB67F1h, 0A6BC5767h, 03FB506DDh, 048B2364Bh, 0D80D2BDAh, 0AF0A1B4Ch
dd 036034AF6h, 041047A60h, 0DF60EFC3h, 0A867DF55h, 0316E8EEFh, 04669BE79h, 0CB61B38Ch, 0BC66831Ah, 0256FD2A0h, 05268E236h
dd 0CC0C7795h, 0BB0B4703h, 0220216B9h, 05505262Fh, 0C5BA3BBEh, 0B2BD0B28h, 02BB45A92h, 05CB36A04h, 0C2D7FFA7h, 0B5D0CF31h
dd 02CD99E8Bh, 05BDEAE1Dh, 09B64C2B0h, 0EC63F226h, 0756AA39Ch, 0026D930Ah, 09C0906A9h, 0EB0E363Fh, 072076785h, 005005713h
dd 095BF4A82h, 0E2B87A14h, 07BB12BAEh, 00CB61B38h, 092D28E9Bh, 0E5D5BE0Dh, 07CDCEFB7h, 00BDBDF21h, 086D3D2D4h, 0F1D4E242h
dd 068DDB3F8h, 01FDA836Eh, 081BE16CDh, 0F6B9265Bh, 06FB077E1h, 018B74777h, 088085AE6h, 0FF0F6A70h, 066063BCAh, 011010B5Ch
dd 08F659EFFh, 0F862AE69h, 0616BFFD3h, 0166CCF45h, 0A00AE278h, 0D70DD2EEh, 04E048354h, 03903B3C2h, 0A7672661h, 0D06016F7h
dd 04969474Dh, 03E6E77DBh, 0AED16A4Ah, 0D9D65ADCh, 040DF0B66h, 037D83BF0h, 0A9BCAE53h, 0DEBB9EC5h, 047B2CF7Fh, 030B5FFE9h
dd 0BDBDF21Ch, 0CABAC28Ah, 053B39330h, 024B4A3A6h, 0BAD03605h, 0CDD70693h, 054DE5729h, 023D967BFh, 0B3667A2Eh, 0C4614AB8h
dd 05D681B02h, 02A6F2B94h, 0B40BBE37h, 0C30C8EA1h, 05A05DF1Bh, 02D02EF8Dh
CRC32 endp
end start
Sau khi biên dịch, ta chạy thử chương trình. Đầu tiên nó chạy đọan code cần check CRC và hiện lên thông điệp:
Sau đó nó sẽ báo CRC của đọan code cần check là :
Vậy CRC chuẩn là 0x10fd82e6. Do lúc đầu ta chưa biết CRC là bao nhiêu nên ta giả sử nó là 082492b0ah :
.if eax==082492b0ah
Vì vậy chương trình mới hiện lên hộp thông điệp:
Bây giờ ta thay đổi chương trình trên tại đọan kiểm tra kết quả CRC, nếu CRC chuẩn tức là bằng 0x10fd82e6 thì báo chương trình ko bị patching, nếu ngược lại thì chương trình đã bị cracker can thiệp. Ta sửa đọan thành :
.if eax==010fd82e6h
Save lại và biên dịch lại. Sau khi biên dịch cho chạy chương trình chúng ta sẽ thấy chương trình thông báo như sau:
Bây giờ thử bật Olly lên và patch Nops dòng code “call eax” trong đọan code đó xem sao, chúng ta sẽ bị “tò tí te” liền.
Thôi hé. Phần này cũng khá dài rồi. Để dành tuts sau chúng ta nghiên cứu thêm . Phải nói là muôn vàng kỹ thuật. Viết hòai ko hết đâu. Đây chỉ là phần dạo đầu làm cho các bạn hứng khởi thôi. Các phần sau sẽ phức tạp hơn đôi chút. Chúc các bạn vui vẽ.


Xem Nhiều

Bài đăng phổ biến

Lưu trữ blog

Blog Archive