banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows [Hỏi]Send inject packet???  XML
  [Programming]   [Hỏi]Send inject packet??? 03/05/2007 11:32:47 (+0700) | #1 | 56879
[Avatar]
SuperChicken
Elite Member

[Minus]    0    [Plus]
Joined: 11/07/2006 18:31:27
Messages: 635
Location: bottom of hell
Offline
[Profile] [PM]
Quy trình là như thế này, có 1 process dùng để login, sau đó send/receive packet với server, sau đó ta inject 1 process khác vào process đó, và send những packet do mình tạo ra (kèm trong connection gốc).
Vậy vấn đề ở đây là "họ làm điều đó như thế nào" smilie) . Ý tui muốn hỏi là kỹ thuật họ dùng, trình tự các bước để có thể thực hiện điều đó, cần những thư viện gì, các packet do mình tạo ra (ở trong ví dụ trên, sau khi process inject vào thì show ra 1 textbox cho phép ta gõ nội dung packet vào) có cần phải "đóng gói" lại hay chỉ send đúng như vậy?
Do tui không phải dân lập trình hệ thống nên có lẽ giải thích hơi rắc rối chút.
smilie Các bác thông cảm, với lại em muốn hỏi vậy hơi ... noob nhưng vì không có kinh nghiệm trong lập trình hệ thống và nhất là network programming nên... smilie Ai biết thì trả lời giúp mình nhé :!smilie
[Up] [Print Copy]
  [Question]   [Hỏi]Send inject packet??? 03/05/2007 12:25:03 (+0700) | #2 | 56884
rcrackvn
Elite Member

[Minus]    0    [Plus]
Joined: 27/03/2007 02:04:05
Messages: 42
Offline
[Profile] [PM]
không dễ làm như bạn nghĩ. Tui cho như bạn 'inject' được 1 process. Để craft và send được custom packet thông qua cái process bị 'inject', những thứ sau đây phải có:
- để read packet: phải có quyền tạo raw socket, vì nếu không, những packet đến được bạn thì chỉ còn lại cái content(packet payload), do ip header, tcp/udp header đã tự động bị "bóc" ra bởi kernel do chức năng của tcpip stack. Tại sao cần biết các thông tin về packet header ? Giả sử bạn tự craft 1 packet, nếu không đọc được header từ server gửi về, bạn sẽ điền gì vào các giá trị như checksum ? seq number đang ở số mấy, bởi vì bạn cần những thứ này để server không drop cái packet của mình vì là malformed packet.
- để write socket: 1 app data thông thường sẽ được kernel 'tự động' encapsulate vào tcp header, sao đó vào ip header, và gửi tiếp xuống datalink, với con đường như vậy bạn không cách nào "inject" packet với custom header đã capture được, vậy process của bạn lại phải có datalink access để có thể craft đầy đủ những thông tin về packet, và inject vào network.

cả 2 thứ ở trên đều cần superuser-privilege, vậy cái process của bạn 'injected' được phải có superuser-privilege.

Tuy nhiên những chuyện khó khăn như vậy đã có thiên hạ làm hết rồi. Nếu cần thì tham khảo thêm về 2 thư viện pcap và libnet.
Ngoài ra con nhiều khía cạnh liên quan tới việc bạn 'inject' 1 process , tui chỉ giả sử như bạn đã làm được smilie
[Up] [Print Copy]
  [Question]   [Hỏi]Send inject packet??? 03/05/2007 13:19:41 (+0700) | #3 | 56890
[Avatar]
SuperChicken
Elite Member

[Minus]    0    [Plus]
Joined: 11/07/2006 18:31:27
Messages: 635
Location: bottom of hell
Offline
[Profile] [PM]
Uhm, nãy giờ thử vọc cái Ethereal + mấy điều bạn vừa nói mình cũng hơi hơi "sáng" được chút xíu (sorry vì không có căn bản về network nên nói lung tung quá).
Đúng là muốn send custom packet thì phải biết header, vậy vấn đề làm sao đọc được header, sau khi đọc được rồi thì làm sao "đóng gói" content muốn send?
Mình không hiểu "quyền" ở đây nghĩa là sao (hix, đã nói em dốt sys programming, đừng la em tội nghiệp smilie) ), vậy muốn process có "quyền" đó thì phải làm sao smilie) ?
Nói trắng ra là cái process mà mình muốn inject vào chính là 1 game online (hoặc 1 chương trình auto để tự động chơi). Đã có 1 cái tool do tụi Thái viết, nhưng chỉ inject vào đúng process là game client, thử inject vào chương trình auto thì nó không hoạt động, bây giờ mình muốn viết lại (mục đích ban đầu thì "nhỏ nhoi" thế thôi, nhưng khi tìm hiểu thì thấy nó cũng hay hay, làm cái này cũng học hỏi được chút ít smilie) , tui là dân code web, đã bỏ .Net và VC khá lâu nên hơi mất căn bản + mù network).
Chuyện inject vào 1 process khác mình nghĩ không thành vấn đề (dù chưa thử nhưng đọc tài liệu thấy có vẻ không khó lắm smilie) ).
Vậy bạn có thể nói rõ hơn về super-privilege và raw socket (chỗ này có phải ý bạn là send/receive mà không cần biết header của protocol mà app đó đang sử dụng) được không? Nếu dùng pcap và libnet thì có thể giải quyết được vấn đề "quyền" hay không?
Để tui tóm lại xíu những vấn đề còn vướng mắc nhé:
1. Làm sao lấy được IP và port của "injected" process?
2. Làm sao lấy được header và dùng header đó để đóng gói data mà mình muốn send?
3. Làm sao để send custom packet vào socket mà "injected" process đang dùng?
Rất mong nhận được trả lời của các pro, bí mà không tìm hiểu được thì bực bội không thể tả smilie) (à quên, pcap và libnet có interface cho .Net không các pác?)
*PS: Bài post đầu lỡ dùng charset Vietnamese 1258 nên máy nào chưa cài Vietnamese language sẽ bị nhảy lung tung, sorry mọi người.
[Up] [Print Copy]
  [Question]   [Hỏi]Send inject packet??? 03/05/2007 14:01:11 (+0700) | #4 | 56891
[Avatar]
SuperChicken
Elite Member

[Minus]    0    [Plus]
Joined: 11/07/2006 18:31:27
Messages: 635
Location: bottom of hell
Offline
[Profile] [PM]
Nãy giờ vọc thêm 1 xíu Ethereal, hiểu thêm chút đỉnh, có vẻ như cái header cũng khá đơn giản, bây giờ giả sử xác định được IP và port của server (tất nhiên cả IP và port trên local), vấn đề chỉ còn làm sao xác định seq number và ack number, à còn nữa, mình thấy nó báo check sum error (mình bắt gói khi dùng cái tool nói trên, tức là inject vào process game client để send packet), ethereal ghi là "Checksum: 0x6290 [incorrect, should be 0x9dac]". Vậy có phải packet của mình đã bị drop, và làm sao ethereal lại tính được cái checksum?
[Up] [Print Copy]
  [Question]   [Hỏi]Send inject packet??? 03/05/2007 23:47:44 (+0700) | #5 | 56941
[Avatar]
xnohat
Moderator

Joined: 30/01/2005 13:59:19
Messages: 1210
Location: /dev/null
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!] [MSN]
Mỗi packet đều có chứa 1byte chứa giá trị checksum ở phần màu đầu ( header ).

Việc inject packet của bạn thật là là kĩ thuật làm giả gói tin, làm giả IP và MAC address là ok bạn thoải mái sniff gói tin đó, rồi đáp trả gói tin y chang bạn đã sniff , vấn đề là bạn phải chuyển hướng đc tất cả luồng packet qua máy bạn, ko thì sẽ có sự trùng lặp packet khi bạn làm giả, cái này bạn phải chiếm quyền cái router.
iJust clear, "What I need to do and how to do it"/i
br
brBox tán gẫu dời về: http://www.facebook.com/hvaonline
[Up] [Print Copy]
  [Question]   [Hỏi]Send inject packet??? 04/05/2007 13:15:37 (+0700) | #6 | 57058
rcrackvn
Elite Member

[Minus]    0    [Plus]
Joined: 27/03/2007 02:04:05
Messages: 42
Offline
[Profile] [PM]

Siêu trộm wrote:
Uhm, nãy giờ thử vọc cái Ethereal + mấy điều bạn vừa nói mình cũng hơi hơi "sáng" được chút xíu (sorry vì không có căn bản về network nên nói lung tung quá).
Đúng là muốn send custom packet thì phải biết header, vậy vấn đề làm sao đọc được header, sau khi đọc được rồi thì làm sao "đóng gói" content muốn send?
Mình không hiểu "quyền" ở đây nghĩa là sao (hix, đã nói em dốt sys programming, đừng la em tội nghiệp smilie) ), vậy muốn process có "quyền" đó thì phải làm sao smilie) ?
Nói trắng ra là cái process mà mình muốn inject vào chính là 1 game online (hoặc 1 chương trình auto để tự động chơi). Đã có 1 cái tool do tụi Thái viết, nhưng chỉ inject vào đúng process là game client, thử inject vào chương trình auto thì nó không hoạt động, bây giờ mình muốn viết lại (mục đích ban đầu thì "nhỏ nhoi" thế thôi, nhưng khi tìm hiểu thì thấy nó cũng hay hay, làm cái này cũng học hỏi được chút ít smilie) , tui là dân code web, đã bỏ .Net và VC khá lâu nên hơi mất căn bản + mù network).
Chuyện inject vào 1 process khác mình nghĩ không thành vấn đề (dù chưa thử nhưng đọc tài liệu thấy có vẻ không khó lắm smilie) ).
Vậy bạn có thể nói rõ hơn về super-privilege và raw socket (chỗ này có phải ý bạn là send/receive mà không cần biết header của protocol mà app đó đang sử dụng) được không? Nếu dùng pcap và libnet thì có thể giải quyết được vấn đề "quyền" hay không?
Để tui tóm lại xíu những vấn đề còn vướng mắc nhé:
1. Làm sao lấy được IP và port của "injected" process?
2. Làm sao lấy được header và dùng header đó để đóng gói data mà mình muốn send?
3. Làm sao để send custom packet vào socket mà "injected" process đang dùng?
Rất mong nhận được trả lời của các pro, bí mà không tìm hiểu được thì bực bội không thể tả smilie) (à quên, pcap và libnet có interface cho .Net không các pác?)
*PS: Bài post đầu lỡ dùng charset Vietnamese 1258 nên máy nào chưa cài Vietnamese language sẽ bị nhảy lung tung, sorry mọi người. 


1. mỗi socket open bởi 1 program sẽ đc kernel associate với 1 socket descriptor. Với connected socket descriptor của 1 process, process đó có thể call getsockname() để biết interface ip, local port đang sử dụng, và call getpeername() để biết info về peer như peer address, peer port. Nếu bạn sử dụng libpcap, việc capture 1 packet match theo ý định của bạn đơn giản hơn, thông qua việc open 1 pcap device, setup 1 capture filter thông qua pcap_compile() và pcap_setfilter().
2. Trước hết, để giải quyết mấy cái này yêu cầu bạn phải hiểu rõ về ethernet, ip, tcp/udp header. Bạn đọc thêm ở về các RFC của chúng: rfc 793 (tcp), rfc 791 (ip), rfc 768 (udp). Tui tóm lại sơ sơ, một packet bạn nhận được ở datalink level sẽ có format sau:

<--datalink_header--><--ip_header--><--tcp/udp_header--><--data-->

Độ dài của các header như sau:
- datalink header: tùy thuộc vào datalink device như SLIP, PPP hoặc ethernet.
- ip header: 20 byte (ipv4)
- tcp header: 20 byte minimum (không có option, basic header) cho tới 60 byte maximum ( vậy có thể có 40 byte sau 20 byte đầu tiên trong tcp header dành cho options và padding).
- udp header: 8 byte.

Các structure:
- struct ip {}: define bằng cách include <netinet/in.h>
- struct tcphdr {}: <netinet/tcp.h>
- struct udphdr {}: <netinet/udp.h>
- struct ether_header {}: <net/ethernet.h> nếu datalink device type của bạn là ethernet.

Vậy những gì bạn phải làm để read 1 packet:
- open 1 pcap device pcap_open_live()
- compile và setup 1 pcap filter để capture đúng traffic từ server: pcap_compile() và pcap_setfilter()
- xác định thông tin về datalink device: pcap_datalink(). Ở đây bạn cần phải làm vì datalink header length thay đổi tùy theo device type, bạn cần biết chính xác type để biết cần strip-off bao nhiêu byte từ packet bạn nhận để 'bóc' được datalink header. Ví dụ datalink device của bạn là ethernet 10/100M, vậy ethernet header length là 20 bytes.
- read 1 packet: pcap_next(). function này return 1 pointer tới cái packet của bạn được capture bởi pcap, let say cái pointer đó là (char *) ptr.
- để 'bóc' ethernet header, bạn declare 1 pointer tới 1 struct ether_header và cast 'ptr' thành pointer to struct ether_header và dereference nó để lấy các giá trị bên trong ether_header như sau:
Code:
struct ether_header *ethptr;
ethptr = (struct ether_header *) ptr;
printf("Ethernet type: %x", ntohs(ethptr->ether_type));

- nhìn vào format của datalink frame, ta thấy ip header đi ngay sau ethernet header, ethernet header lại có độ dài 20 bytes, vậy bạn tăng pointer ptr thêm 20 để nó point tới 20 byte ngay sau đó thì ptr sẽ point tới vị trí bắt đầu của ip header.
- tiếp tục 'bóc' ip header ra giống như trên: declare 1 pointer point tới struct ip, cast 'ptr' sang struct ip *, dereference cái struct ip pointer này để lấy ip header value.
Code:
char *tempptr;
tempptr = ptr + 20;
struct ip *ipptr;
ipptr = (struct ip *) tempptr;
printf("IP version: %d", ipptr->ip_v);

- 'bóc' tcp header/udp header cũng tương tự, bạn move pointer tới 20 byte sau vị trí bắt đầu của ip header sẽ có được vị trí bắt đầu của tcp/udp header. Vậy thôi.

process là như vậy, bạn làm thử sẽ biết. capture được info tcp state không phải là chuyện dễ, replay packet đòi hỏi bạn phải biết seq number và nhiều thứ khác. Mà theo như bạn nói, việc bạn craft lại packet từ client tới server đòi hỏi bạn phải có cơ chế để delay packet thật sự từ client chính hiệu tới server, hoặc drop toàn bộ nó để thay bằng packet của bạn, nếu không server sẽ nhận được 2 packet, 1 packet của client, và 1 packet do bạn craft. Chuyện này không phải không làm được, nhưng đòi hỏi bạn nắm được signal handling và poll network IO để biết khi nào client send cái packet đó tới server.

Mà hình như bạn vẫn chưa phân biệt được giữa chuyện capture 1 packet VS craft lại và send packet đó, 1 program như ethernet vô phương giúp bạn construct 1 packet, nó chỉ đơn thuần sử dụng libpcap, packet capture library. Nếu bạn hứng thú thì tìm hiểu thêm về raw sock, libnet, và về socket option IP_HDRINCL.

Trả lời câu hỏi của bạn về quyền: libpcap, libnet không giúp bạn giải quyết vấn đề về privilege, chúng hoạt động khi bạn đã có superuser-privilege. 1 chuyện nữa là nếu bạn develop trên win, thì có 1 bản port của libpcap là winpcap, còn libnet thì không biết có ai port qua win không, tui cũng không code mấy cái này bên win nên không biết.

edited: typos
[Up] [Print Copy]
  [Question]   [Hỏi]Send inject packet??? 05/05/2007 03:59:46 (+0700) | #7 | 57158
[Avatar]
SuperChicken
Elite Member

[Minus]    0    [Plus]
Joined: 11/07/2006 18:31:27
Messages: 635
Location: bottom of hell
Offline
[Profile] [PM]
Cám ơn rcrackvn đã trả lời, nhờ phần trả lời của bạn mà mình "sáng" thêm 1 mớ, tất nhiên là mình phân biệt được giữa capture packet và "craft and send" chứ (mình dùng ethereal là để capture lại rồi phân tích thử cái original packet thôi), nhưng thực ra là mình muốn send thêm packet của riêng mình, chứ ko phải sửa lại original packet, và mình chỉ cần send ở mức tcp thôi, ko cần tới level datalink đâu :lolsmilie
Cái khó bây giờ làm sao get được seq number, ack number,... để có thể send packet chèn vào giữa.
Về chuyện privilege của process thì mình có tìm được 1 cái tool cho phép grant permission cho process (trên Win).
Mà tự dưng đọc cái bài ở trên của bạn chợt nảy ra ý tưởng, tại sao mình ko drop toàn bộ packet gốc và thay bằng packet của mình nhỉ, vậy có vẻ đơn giản hơn phải ko? Sẵn đây cho mình hỏi, winpcap cung cấp API để capture phải ko? Còn libnet thì để manipulate trên packet hả bạn?
[Up] [Print Copy]
  [Question]   Re: [Hỏi]Send inject packet??? 05/05/2007 06:24:24 (+0700) | #8 | 57192
rcrackvn
Elite Member

[Minus]    0    [Plus]
Joined: 27/03/2007 02:04:05
Messages: 42
Offline
[Profile] [PM]

Siêu trộm wrote:

Sẵn đây cho mình hỏi, winpcap cung cấp API để capture phải ko? Còn libnet thì để manipulate trên packet hả bạn?
 

ờ, cũng gần gần như vậy. Hiểu nôm na thì 1 cái để read (winpcap 4.0 tui mới coi thì có function để write luôn), 1 cái để write. Mờ tui thấy sao mục tiêu của bạn mơ hồ quá, và có 1 số mâu thuẫn trong cách nhìn của bạn: đầu tiên là bạn muốn obtain được giá trị của các field trong tcp header, điều này chỉ có thể làm được với raw socket, bởi vì với normal socket, application của bạn không có cơ hội được "nhìn" thấy mấy cái header này, vì kernel tcpip stack tự động decapsulate chúng trước, chỉ pass lên cho bạn payload của packet. Bạn chỉ obtain được chúng ở datalink level, sau đó tự decapsulate, và store chúng vào các structure tương ứng, sau đó bạn có thể modify, và sử dụng để rebuild packet, hoặc build 1 packet mới với các giá trị header bạn muốn. Cũng tương tự như khi ban write, bạn muốn chỉ định header field riêng, nên bắt buộc phải sử dụng raw socket, với socket option IP_HDRINCL. Cần phân biệt giữa các khái niệm, ở đây không có khái niệm gì là send ở mức datalink, và send ở mức tcp, chức năng của tcp/ip không phải là để 'send' 1 cái gì đó. Khác nhau như thế này:
- 1 (normal socket): process của bạn nói với kernel: "đây là data tui muốn send, đây là info về người nhận". kernel chấp nhận, và tự làm các phần như establish và maintain tcp connection, build packet dựa trên các info về source và dest, cùng data của process. Ở đây process của bạn chỉ phải chuẩn bị data để gửi đi.
- 2 (raw socket): là process của bạn nói với kernel: "tui có data, tui sẽ tự đóng gói, tự chỉ thị sẽ send đi đâu, tự dán tem". kernel accept, và chỉ làm 1 việc là lấy nguyên cục đó send đi. Ở đây process của bạn phải chuẩn bị mọi thứ gồm cả data và header, kernel chỉ tiếp nhận nó ở datalink level, append với datalink header và send đi.

Siêu trộm wrote:

Cái khó bây giờ làm sao get được seq number, ack number,... để có thể send packet chèn vào giữa.
 

Bạn coi lại bài ở trên, mình cũng nói về việc lấy header ra và store vào các structs tương ứng rồi mà.

edited: mới check thấy cái này, chắc có ích với bạn, và cũng giống với những gì bạn muốn làm:
http://www.engagesecurity.com/products/engagepacketbuilder/shot2large.png
[Up] [Print Copy]
  [Question]   Re: [Hỏi]Send inject packet??? 08/05/2007 15:26:52 (+0700) | #9 | 57812
[Avatar]
instcode
Member

[Minus]    0    [Plus]
Joined: 09/09/2004 21:42:44
Messages: 13
Offline
[Profile] [PM]
Dùng WinPCap thì bạn phải send raw packet, tức là phải chuẩn bị đúng message protocol trước khi đưa xuống tầng datalink. WinPCap hỗ trợ pcap_sendpacket để làm chuyện này.

Nhưng có những cách đơn giản hơn khác, làm trên tầng application đó là Hook Winsock hoặc dùng Winsock SPI.
1. Hook Winsock: Google madCodeHook của Madshi
2. Winsock SPI: http://www.microsoft.com/msj/0599/LayeredService/LayeredService.aspx
[Up] [Print Copy]
  [Question]   [Hỏi]Send inject packet??? 09/05/2007 12:18:28 (+0700) | #10 | 57986
LeVuHoang
HVA Friend

Joined: 08/03/2003 16:54:07
Messages: 1155
Offline
[Profile] [PM]
Hầu hết các game online hiện nay đều có apply protection hết rồi. Ví dụ như nProtect, GameGuard...
[Up] [Print Copy]
  [Question]   [Hỏi]Send inject packet??? 10/12/2007 02:07:50 (+0700) | #11 | 102951
ldarkmage
Locked

[Minus]    0    [Plus]
Joined: 18/05/2005 02:34:54
Messages: 3
Offline
[Profile] [PM]

LeVuHoang wrote:
Hầu hết các game online hiện nay đều có apply protection hết rồi. Ví dụ như nProtect, GameGuard... 

hihi, vẫn còn cái Silkroadonline_vn chưa có đại ca ạ, em dùng bot của nó nhưng chẳng hiểu nó viết bot bằng gì mà kinh dị thật, các game như lineage + Wow + dungeon thì em chưa dùng nên ko biết bot thế nào, nhưng phải nói thằng viết bot cho iSRO và vnSRO giỏi thật
tiện thể type hỏi luôn có ai biết hướng để viết bot kiểu vnSRO thì hướng cho em cái nha (NNLT, cách tư duy,...)
http://vn.botsmall.com <~~~ web của bot nếu đại ca nào hảo tâm muốn zúp
[Up] [Print Copy]
  [Question]   Re: [Hỏi]Send inject packet??? 10/12/2007 03:14:50 (+0700) | #12 | 102982
[Avatar]
secmask
Elite Member

[Minus]    0    [Plus]
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
[Profile] [PM] [WWW]
các bác có tính chuyện hook network API chưa nhỉ ?
[Up] [Print Copy]
  [Question]   Re: [Hỏi]Send inject packet??? 21/01/2008 23:53:52 (+0700) | #13 | 111413
THE LAST LEAF
Member

[Minus]    0    [Plus]
Joined: 30/06/2006 16:22:20
Messages: 9
Offline
[Profile] [PM]
Các bạn hoàn toàn có thể thử dụng Leaf API Hook để chặn network API tương tự như sử dụng madshi MadCodeHook tại đây smilie smilie

/hvaonline/posts/list/18714.html
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|