shell1508
09-09-14, 11:54 PM
Xin nhắc nhở trước. Bài này rất nhiều chữ và cũng hơi khó đọc cũng như khó hiểu! Nếu bạn không đủ kiên nhẫn như mình đủ kiên nhẫn dịch bài này lại. Xin vui lòng không đọc rồi comment hỏi những cái quá đơn giản mà mình đã đề cập đến dưới đây! Và lưu ý nhỏ là mình không giỏi AV cho lắm. một số câu mình sẽ bỏ qua nếu GG Trans thấy ý khó dịch hoặc không quan trọng. Những ý khó dịch mà quan trọng mình sẽ trích nguyên văn Tiếng Anh!
Và update Server có 2 cách mà mình biết đó là Dịch Ngược (Reverse Code Engineer) hoặc Sniff gói tin. Vì dịch ngược RẤT KHÓ. Đòi hỏi kiến thức về Code cũng như sử dụng Tools cực kì tốt mới làm được. Nên mình sẽ chỉ nói về Sniff gói tin. Mọi câu hỏi về dịch ngược đều bị bỏ qua!
Nếu có Copy,vui lòng ghi nguồn! Nếu không mình chửi vào mặt, thì đừng có mà chạy!
Xin cảm ơn :)
Link gốc: <b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
Giới thiệu chung:
V/việc update một game rất tốn thời gian và cũng như là cần lượng kiến thức không nhỏ. Một số sáng kiến nhỏ cũng đc áp dụng vào việc này. Vây nên, đây là một số điều cơ bản mà ai cũng phải biết nếu có hứng thú trong việc update game! Và đây là những kiến thức rất cơ bản, nếu không có, dường như việc update trở nên vô dụng cũng như tiến xa thêm. Bài viết dưới đây mình sẽ cung cấp và chỉ dẫn các bạn sniff (thu thập) gói tin và update game. Cũng như một số mẹo vặt để đẩy nhanh tiến trình nhưng nó vẫn phụ thuộc vào mức độ hiểu và sáng tạo cũng như khả năng logic của bạn! Khi bạn đã làm đc, bạn có thể áp dụng để update những source MS như OdinMS, DelphiMS v.v.. Vì các gói tin (gói tin) là như nhau. Chỉ có code là khác nhau. Nên nếu bạn học đc cách sniff gói tin thì bạn có thể update hầu hết mọi source kể cả MSEA. Và trong bài viết mình sẽ dùng MS v88 và v147.2
Tất nhiên, tất cả đều đã đc chỉnh sửa cho phiên bản mới nhất!
Tại sao lại học gói tins?
Nếu bạn muốn làm 1 server mà không ai cạnh tranh lại bạn thì update nó liên tục là một điều rất quan trọng. Điều mà EMS (extailiaMS) và một sô sv khác đang làm rất tốt. Nhưng nó không dễ và rất tốn thời gian. Nếu như bạn có đam mê và đủ nhiệt huyết. Thì mình tin, bạn sẽ làm được [đã ngắn gọn]
Định nghĩa và Thông tin CƠ BẢN
-Byte: 1 byte (2^8-1 hoặc -2^7 đến 2^7)
-Short: 2 bytes (2^16-1 hoặc -2^15 đến 2^15)
-Int: 4 bytes (2^32-1 hoặc -2^31 đến 2^31)
-Long: 8 bytes (2^64-1 hoặc -2^63 đến 2^63)
- Tất cả các gói tin hầu hết sẽ ở dạng cơ số 16 (hexa) Nên mình khuyên mọi ng nên sắm cho mình 1 cái máy tính có thể đổi từ hệ 16 sang hệ 10.
Nếu xài win7, bạn vào start -> tìm calc enter và một chiếc máy tính sẽ hiện ra. Sau đó, ở thẻ View -> Chọn Programmer là bạn đã có 1 chiếc máy tính đổi hệ 16->10 và ngược lại 1 cách hoàn chỉnh. Hoặc là bạn cũng có thể dùng mốt số trang web đổi với từ khóa như "Hex to Dec"
Để phân biệt hệ 16 và hệ 10, hệ 16 thg có dạng: 0x[dãy số]
Và mình cũng khuyên mọi ng nên thuộc một số số đơn giản như 0x0A = 10, 0x01 = 1.v.v
- Các gói tin của MS được định dạng là "Little-Endian". Nôm na là nếu như có 1 gói tin là 0x00123456, thì khi qua định dạng "Litte-Endian" nó sẽ thành "65 32 21 00" Và ngược lại, nếu chúng ta thấy 1 nhóm số 4 bytes như sau: 11 22 33 44 thì nó sẽ là 0x44332211 ở dạng hexa
- Các gói tin được gửi đi qua lại giữa server và cilent để xử lí dữ liệu, truyền đạt dữ liệu và thông tin. Giao diện đồ họa (GUI) là hình chiếu của việc truyền/nhận dữ liệu theo một cách nào đó! (!?)
- Những hành động được xử lí bởi các gói tin trong MapleStory được định nghĩa bởi 1 đoạn mã kiểu Short (2 bytes) vào đầu mỗi gói tin. Một số hành động chia sẽ chung đoạn mã kiểu Short. Chúng ta gọi đoạn mã kiểu Short này là Opcode. Tất cả các gói tin được gửi và nhận đều có Opcode. Nên khi Sniff gói tin, hãy đặt tên cac Opcode, chúng sẽ rất có ích
- Bộ xử lí (Handler) để nhận các gói tin (được gửi từ CILENT đến SERVER). Hàm MaplePacketCreator là để gửi các gói tin. (trong source Lithium là CMsContext, CField, v.v). Và lưu ý nhỏ, khi mình nói "Nhận gói tin", tức ý nghĩa sẽ là server sẽ nhận gói tin chứ không phải là cilent!!! Và tương tự cho câu Gửi gói tin, tức là ý sẽ là server sẽ gửi đi các gói tin, chứ không phải là cilent. Chúng ta đang nói về update server, nên cilent cứ tạm bỏ qua một bên!
Tìm hiểu kỹ hơn qua wikipedia:
Hệ đếm: <b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
Little-Endian các bạn không cần tìm hiểu!
[Tip] Một số thông tin vặt:
- Cấp độ (Level) và một số thông tin nhỏ như Hạng PvP sẽ là kiểu Byte! (Max là 255) Nếu bạn thấy các thông tin dữ liệu nào <255 hoặc chỉ từ -127 đến 127 đích thị là Byte!
- Job ID, Số vật phẩm, chỉ số, các thông số như Charm, Ambition vv là Short (max là 2^16-1 hoặc từ -2^15 đến 2^15)
- Cash (tiền nạp vô đó), HP và MP là Int (lúc trc là Short nhưng bản mới nhất là int :) )
- Meso, EXP và MapID đã được nâng lên Long (lúc trc là Int nên v83 bạn chỉ có tối đa 2 tỉ trong túi :P )
- Chỉ số Buff là Int
UPDATE OPCODES
Giới thiệu
- Update opcode là bước đầu tiền để update 1 server. Nó có thể tốn rất nhiều thời gian. Hoặc rất ít thời gian, nếu bạn tìm ra một quy luật nào đó cho một nhóm Opcode. Vd: Job ID chẳng hạn
- Một điều quan trọng là chúng ta phải biết Nexon thường làm gì với các Opcode của chúng ta. Và Nexon thg hay để các Opcode theo một thứ tự nhất định nào đó giữa các phiên bản khác nhau. Tuy nhiên, có một số Opcode lâu lâu Nexon sẽ đổi vị trí đi, nhưng không sao cả vì hầu hết các Opcode sẽ được giữ vị trí cũ ấy mà :D. Nên chúng ta nên kiểm tra lại các vị trí của Opcode khi Update ver mới nếu nó k thay đổi => Tuyệt vời. Còn không thì mò mẫm tiếp vậy!
- Một điều nữa là phải nắm rõ các thay đổi của bản cập nhật!! Ví dụ như Monster Book, Khi update Big Bang. Nó bị xóa đi, thế là các thứ tự Opcode sau Monster Book sẽ bị dịch lên 1 đơn vị :) Và chúng ta không cần phải sniff Monster Book gói tin nữa! Lưu ý nhé!
Làm việc với công cụ sniff gói tin
- Sau khi đọc phần này, thì hãy tiến hành sniff thử ngay đi nhé! Các bạn có thể xài Snow Sniffer vì có in ra các kí tự ASCII luôn. Nhưng bài này sẽ là dùng MapleShark! Link download sẽ được ghi sau! VÀ vui lòng cài .NETFRAME bản mới nhất hoặc từ 3.5, 4. trở lên. Vì MapleShark cần em này! À, lưu ý luôn là tải và cài WinCAP nữa! :) Không có là không sniff được!
- Sau khi đã đầy đủ thì mở MapleShark lên, nhấn vào Setting. Nếu đang xài Wifi/Mạng không dây, chọn Wireless. Còn không chọn Local Area Connection.
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
- MapleShark cũng yêu cầu mở các cổng (port) để cho việc sniff. Hãy chỉnh từ 8400 đến 8700 (hoặc 8500-8700) chứ không phải như hình! Và đừng cmt hỏi tại sao không được nếu bạn lười đọc dòng này thay vì chỉ nhìn hình và làm! (Note: Port 8585 là channels, Port 8484 là để Login, là port 8686 là dành cho Cash Shop) Nếu bạn không điền đúng phạm vi, có thể các gói tin không được sniff đầy đủ hoặc dư thừa!
MapleShark: <b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
Wincap: <b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
Làm cách nào để Sniff gói tin (SP) hiệu quả?
- Không phải SP là chỉ suốt ngày cắp đầu đi train. Và tất nhiên có 1 số gói tin vô dụng, và chúng ta phải cảm ơn Nexon vì những gói tin vô dụng này! Vấn đề là với những gói tin này sẽ làm các gói tin thu thập được di chuyển liên tục. Làm chúng ta khó thu thập các gói tin quan trọng. Như Monster gói tin, và Attack gói tin! Nó sẽ hiện liên tục ra, trong khi đó bạn chỉ cần 1 cái cho mỗi cập nhật. Khi bạn SP, chỉ lấy cái bạn cần sao cho thật nhanh chóng và gọn lẹ. Để SP một cách hiệu quả nhất, nên thực hiện một hành động vào 1 thời điểm và chọn nơi thật vắng vẻ. Như khi bạn đánh quái, chúng ta sẽ sniff đc Attack gói tin. THì thay vì đánh ồ ạt cho lên Level thì chỉ cần một cái! Và gom gói tin, xong rồi chạy :v (Làm hành động, nhìn vào bảng MapleShark, thu thập :) )
-Mẹo nhỏ là, trước khi Sniff một gói tin nào dó, hãy chat thông tin bạn muốn sniff vào và enter! Ví dụ nhé!
Vd: Bạn muốn Sniff Meso Drop gói tin (là quăng meso đó), thì trc khi thả meso, bạn chat MESO DROP và enter. Rồi tiến hành quăng meso. Nếu kỹ hơn hãy chat thêm số Meso mà muốn quăng. Ví dụ như quăng 10 meso thì chat 10 MESO DROP và quăng 10 meso sau khi chat! Và sau khi làm xong, hãy chat thêm là DONE! Để đánh dấu! :)
-Vì sao? Vì khi bạn chat, sẽ có 1 gói tin được gửi đi, nó giống như là 1 tín hiệu đánh dấu hành động trc khi làm. Nên nếu lỡ có một gói tin khác xen vào, thì bạn vẫn biết đc là gói tin cần lấy nó chỉ gần đâu đó chat gói tin mà bạn vừa chat xong! Và việc chat DONE tức bào hiện đã xong! Tránh nhầm lẫn với các gói tin Sniff sau! Và việc Chat gói tin phân biệt rất dễ, do MapleShark có khung text, chỉ cần nhìn vào và tìm các câu mà bạn vừa chat là có thể xác định được vùng mà bạn cần phân tích ngay! :)
Nó giống như bạn dùng cặp begin ... end trong lập trình Pascal để phân các chuong trình nhỏ cho dễ quản lí :)
Việc này rất có ích nhé! Đặc biệt là các Newbie! Vì các gói tin luôn dồn dập được gửi và nhận nên việc trên sẽ giúp bạn nhanh hơn! :)
Ví dụ của Ragezone (Không dịch)
An easier example for sniffing:
Wanted: Creating a party
Before you create the party in game, say in all chat: CREATE PARTY
Then quickly create the party before doing anything else
Right after you create the party, say in all chat again: FINISHED CREATING PARTY
After that, go to MapleShark, find where in the log you said CREATE PARTY, and between the places where you said CREATE PARTY and FINISHED CREATING PARTY will be the create party gói tin (explained in next section).
Phân tích gói tin và Update Opcode đầu tiên
- Bây giờ bạn đã sniff đc 1 mớ gói tin rồi chứ nhỉ? (Như lời dặn đã có trc) :v Thôi Log Off Maplestory ngay đi, bạn không muốn nhận thêm 1 mớ gói tin nữa đâu! Bây giờ quay lại Giao diện của MapleShark và xem mớ hỗn độn bạn vừa gom góm được! Những gói tin được nhận sẽ được ghi là Outbound và gửi đi là sẽ là Inbound :D Nghe có vẻ hơi ngộ và khó hiểu. Nhưng để dễ hiểu thì hãy thay server = cilient là ok! Tức những gói tin Cilent nhận sẽ là Inbound còn gói tin Cilent gửi đi sẽ là Outbound! Giờ thì đã dễ hiểu hơn chứ nhể! :D
- Các Opcode được đc ra cùng với chiều dài của Gói tin. Điều này sẽ có ích sau này. Bây giờ, hãy tìm các gói tin mà bạn đã chat vào! Và tìm vùng mà bạn đã đánh dầu như cách mình đã chỉ ở trc! :)
Các hộp bên phải dưới cùng của MapleShark cung cấp cho bạn một bản in theo bảng mã ASCII. (Xem hình)
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
- Đề tìm hiểu các phần bạn vừa sniff được. Hãy bắt đầu bằng gói tin đầu tiên, và kéo từ từ, xem từ gói tin một khi đã tìm tháy nội dung bạn đã chat và cứ như vậy cho đến khi bạn tìm được phân vùng để phân tích đầu tiên! Nếu trong vùng cần phân tích không có gói tin nào, hoặc quá nhiều gói tin thì có thể do bạn làm quá nhanh hoặc thao tác quá chậm, và có thể sai ở đâu đó rồi. Đừng nản, mà hãy tiếp tục tìm vùng để phân tích tiếp theo :)
- Bây giờ bạn đã có được vùng cần phân tích rồi chứ nhể :D Nhìn vào Direction, nếu nó ghi Outbound thì là Nhận Gói Tin* và Inbound sẽ là Gửi Gói Tin* Giờ thì lấy Opcode mà MapleShark đã hiện ra. Gói tin mà có nội dung chúng ta chat là Chat Packet! Ở v88, Opcode của nó là 0x37 và ở v112.4 nó là 0x59. Còn ở v147.2 nó là 0x6A. Bây giờ thì mở file mà chứa các packet lên nào! :D Tìm phần "GENERAL_CHAT" và thay Opcode hiện tại vào! Lưu ý: Ta thấy 0x6A-0x31 = 0x39 = 57 (có thể dùng GG search để tính) => Update từ v88 lên 147.2 có thể mỗi opcode tăng thêm +57 đơn vị. Nhớ con số này! Rất có ích cho sau này Vậy là bạn đã hoàn thành xong việc update Opcode đầu tiên rồi! :> Khoan hãy ăn mừng, vì đường còn dài lắm! ~~
- Tiếp theo, quay lại MapleShark và tìm gói tin "Inbound" mà có từ bạn đã chat! Đây cũng là GENERAL_CHAT nhưng dành cho việc gửi gói tin! Tìm file chứa những gói tin gửi đi và thay opcode CHATTEXT = Opcode mới nhất! ở v88 là 0xA2, v112.4 là 0xF8, và v147.2 là 0x169
P/s: Phần này khá khó hiểu nên k hiểu các bạn cứ hỏi và trong bài viết k có chĩ các phân tích Opcode! Vì gần như MapleShark đã làm giùm r! Trên hình chúng ta đã thấy được điều đó! :D
* : như đã đề cập trc, xin xem lại nếu bạn không hiểu
Đặt tên cho Opcode (Quan trọng)
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
- Mẹo nhỏ! Nhớ lúc trc mình có nói là các thứ tự của gói tin thường không thay đổi -> Thứ tự của Opcode cũng không thay đổi nốt! Ở v88, ARAN_COMBO đứng trc CS_OPERATION (là làm 1 số việc linh tinh trong CS ấy). Ví dụ bạn sniff được Opcode của ARAN_COMBO rồi thì bạn có thể dùng nó để so sánh Opcode của CS_OPERATION! Vd như ARAN_COMBO Opcode là 0xAA và bạn Sniff được CS_OPERATION là 0x01 < 0xAA -> Bạn biết mình đã sai và tiến hành sniff lại! Và ngc lại, nếu có đc CS_OPERATION thì hãy dùng nó để kt cho ARAN_COMBO!
Tiếp tục phân tích gói tin và update Opcode
- Phần này dài và hơi khó dịch, tác giả cũng khá dài dòng nên mình khó hiểu ý. Nên không hiểu các bạn hỏi nhé :)
- Qua các mục trên thì bạn đã xác định đc Opcode của GENERAL_CHAT. Đây là bước rất quan trọng. Để làm cho mọi thứ trở nên dễ hơn, tại mỗi gói tin GENERAL_CHAT, hãy sửa và đổi tên thành GENERAL_CHAT (RECV). MapleShark có một cái rất hay đó là tìm kiếm các gói tin dựa trên opcode. Và chẳng ai muốn đọc một mớ mã hex cả, rất phức tạp và chỉ làm tốn thời gian! Vì vậy đặt tên các gói tin = tiếng Anh và kèm thông tin gửi / nhận sẽ dễ dàng hơn! sau khi làm điều này xong. Kéo xuống và xem một vài gói tin tiếp theo. Có nhớ là chúng ta đã update chat opcode mà chưa update các thứ mà chúng ta cần update?! Và lúc này là lúc cần sử dụng bộ não thiên tài của bạn! :> Bây giờ hãy tìm các Opcode cũ của DROP_MESO ở trong server cũ của bạn! Bắt đầu ở bộ xử lí RECV (nhận gói tin). Câu hỏi đặt ra bây giờ là tại sao mìh lại biết nó là gói tin được nhận? Có 2 lí do. Một là do kinh nghiệm bản thân, nên mình biết đó là gói tin nhận và gói tin gửi đi là DROP_ITEM_FROM_MAPOBJECT. Thứ 2, là mình có một thời exploit các cilent của MS để Hack Meso! Và sniff các gói tin về DROP_MESO chỉnh sửa các giá trị khi drop thành giá trị âm => Thay vì trừ tiền nó sẽ tăng lên! Và các gói tin này sẽ đc chỉnh sửa hoàn chỉnh trc khi nó cập bến đến server ! Mà thôi dài dòng nữa, bạn đã tìm được Opcode cũ về DROP_MESO như mình đã yêu cầu chưa? VÀ cố nhớ các Opcode xung quanh nó nữa! Ở v88, Opcode của DROP_MESO sẽ là 0x5E. Bây giờ hãy tìm các g ói tin xung quanh các gói tin outbound. Nếu bạn cần trợ giúp, hãy nhìn vào Mesodrophandler và xác định xem chiều dài của gói tin, như vậy chúng ta se thu hẹp được các gói tin cần phân tích hơn. Nhưng giả sử bạn không biết gì về chiều dài của gói tin. Hãy suy nghĩ, Có rất nhiều dữ liệu đc truyền đi trong việc Drop Meso không nhỉ? :? Có lẽ là không? Có thể chì là Số Meso cb/sẽ/đã drop, có thể là địa điểm. Nên chắc chắn, gói tin chúng ta sẽ không dài một cách điên rồ vì quá ít thông tin để truyền đi! Vậy nên hãy nhìn vào các gói tin ngắn gọn, có thể là kiểu Short và phân tính nó!
- Nếu chúng ta có các Opcode cũ, hãy tìm các giá trị xung quanh các Opcode cũ. Ví dụ như Opcode cũ của DROP_MESO là 0x5E, thì bạn nên tìm các opcode đc sniff về trong phạm vi từ 0x40~0x60, càng rộng càng chính xác nhưng sẽ mất thời gian hơn. Và khi đã có đc các Opcode mới mà bạn nghĩ là đúng, okay. Bay giờ chúng ta sẽ kiểm tra chúng! Hãy nhớ lại con số meso mà bạn đã vứt đi! Nhớ chứ? ;) Sau đó, dùng chuột và highlight 8 bytes liên tiếp trong gói tin, những bytes mà bạn hìghlight cũng sẽ đc highlight kế bên tay phải nhưng đã được dịch sang bảng mã ASCII. Nếu khi highlight bytes lien tục, nhưng cột bên tay phải không hiện ra đúng số mesp mà bạn đã drop thì hãy thử dịch sang 1 byte và bôi đen 4 bytes kế tiếp!
- Vd: [00 01 02 03 04 05 06 07 08 09]
- Lúc đầu bạn bôi đen: [00 01 02 03 04 05 06 07 08 09] nhưng không đúng
- Thì bạn chuyển sang 1 byte và bôi đen 4 bytes kế tiếp nó sẽ như thế này: [00 01 02 03 04 05 06 07 08 09]
- Và cứ làm vậy khi nào tìm được đúng số meso đã drop! Nếu đã thử hết gói tin mà không tìm được số meso đã drop thì bạn đã sai! Tìm gói tin khác và phân tích lại!
Nhưng khoan, làm sao có thể biết được đâu là một giá trị đại số??? Tất nhiên là sẽ có 2 cách! Một là qua kinh nghiệm, làm nhiều lần bạn sẽ trở nên quen thuộc và biết ngay thôi! :D Còn hai là nhìn sơ qua bộ xử lí gói tin (packet handler, đây là 1 file trong server). THì sau vài lần sniff gói tin, mình tìm thấy ở v99 là 0x69 =)) (0xA8 ở v112.4) Ở v88 là 0x5E và v99 là 0x69 -> 0x69 - 0x5E = +11 -> tăng 11 đơn vị, ghi chú lại con số này kế bên opcode mới update. còn bây giờ thì kt phần gói tin gửi, vì bạn đã có MESO_DROP (RECV) nên hãy tìm bộ xử lí (handler) tương ứng với nó là được (!??)
Cập nhật: v112.4 MESO_DROP (RECV) là 0xA8, 0x1D3 là opcode của DROP_ITEM_FROM_MAPOBJECT (SEND)
- Hiển nhiên là ở trong MapleDropHandler (1 file trong server), nhưng Opcode đc đặt tên theo một cách rất tệ! Phải có 1 cách nà đỏ để tìm các bộ xử lí này! :P Cách dễ nhất đó là nhờ chức tìm kiếm của IDE. Giả sử ở đây là mình dùng NETBEAN, nhưng ai dùng Eclipse cũng sẽ có những tính năng tương tự thôi. :D Nhấn chuột phải vào MESO_DROP, và chọn Find Usages. Tương tự cho Eclipse. Chọn một giá trị mặc định và nó sẽ tìm nhưng biến sử dụng tương tự. Nhấp đúp chuột vào dòng code mà bạn muốn dùng, nó sẽ đưa bạn đến PacketProcessor.java (ở source OdinMS) và kế bên dòng code này sẽ là tên của tập tin chứa nó! Nhấn Ctrl và click vào tên tập tin, IDE sẽ đưa bạn đến thẳng tập tin chứa file!
- Trong bộ xử lí (handler), đôi khi sẽ có c.getSession().write(MaplePacketCreator.stuff); ở một dòng code nào đó. Thì cái đó sẽ nói rằng Server sẽ gửi những gói tin gì đến người chơi. Một số bộ xử lí, những dòng code như trên được sử dụng nhiều lần và ở một số dòng code, thì điều trên không có nghĩa là gửi gói tin. Đây mới là nơi mà khi đọc code các bạn cần để ý đến. Có nhớ cách bạn làm để dẫn đến phần chính xác của đoạn code? Tìm các gói tin mà server gửi đi (nếu có) và đi đến phương thức thực hiện (nhấn Ctrl và click chuột vào method (phương thức)). Phương thức này sẽ có dạng như public static MaplePacket blabla();
{MaplePacketLittleEndianWriter mplew = stuff; mplew.writeShort(<OPCODE GHI Ở ĐÂY[>);/* một đoạn mã bỏ đi :v */}
- Tìm các Opcode ở trong <OPCODE G...>, trong trường hợp drop meso sẽ là DROP_ITEM_FROM_MAPOBJECT. [Go back to where the send opcodes are located and get the old opcode for DROP_ITEM_FROM_MAPOBJECT.]
- Giờ thì trở lại, tìm Opcode mới để update. Tìm các gói tin gửi đi sau MESO_DROP. Các gói tin thg chỉ gần các giá trị cũ mà thôi. Sau khi tìm được, hãy tính độ chênh lệch giữa gói tin cũ và mới rồi ghi lại kế bên. Nếu bạn lười biếng và không làm điều này. THì hãy dừng lại và tập làm ngay đi. update không dành cho những kẻ lười biếng!
-Một vài ý tưởng cho việc KT gói tin
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
Phương pháp đoán Opcode (Trên cơ sở Lý Thuyết)
- Bây giờ các bạn hẳn đã có một lượng kiến thức đủ để update Opcode theo các cách tẻ nhạt :v Tất nhiên, để bớt nhàm chán, mình sẽ chỉ bài một vài chiêu :>
Với các chiêu này bạn có thể đoán Opcode mà không cần phải sniff làm gì cho mệt ng! :D Một trick đó là tăng giảm các giá trị sau khi tìm được 1 Opcode là so sánh nó với Opcode cũ. Như Meso Drop là tăng lên 11 đơn vị.
- Mình đã chuẩn bị các vị dụ về Opcode trong phiên bản 147.2 (Mới nhất và đây đều là các Opcode chính xác)
- Giả sử bạn đang dùng source v117.2 và muốn nâng cấp lên 147.2
Cho những Opcode (RECV) sau đây:
MOVE_FAMILIAR = 0x14D
TOUCH_FAMILIAR = 0x14E
ATTACK_FAMILIAR = 0x14F
REVEAL_FAMILIAR = 0x151
QUICK_SLOT= 0x152, 0x1E1
Bạn đăng nhập vào MS, sniff đc opcode MOVE_FAMILIRA là 0x1DC bằng việc di chuyển xung quanh map và nhận Opcode! Và bạn hãy đăng nhập lại và lấy đc gói tin QUICK_SLOT là 0x1E1. Tuy nhiên, vì một lí do gì đó, bạn không có quái để hiếp dâm! Và thế là bạn không có được ATTACK_FAMILIAR và REVEAL_FAMILIAR. Mà bạn cũng chả biết cái REVEAL_FAMILIAR là cái lề gì :v Nhưng yên tâm, trick này sẽ giúp bạn làm điều đó :3
MOVE_FAMILIAR là 0x14D và mới Update thì nó là 0x1DC tức là tăng lên 143 đơn vị (wtf). QUICK_SLOT cũng tương tự tăng 143 đơn vị! (Thấy rồi chứ :>)
vâng, từ đây, chúng ta có thể giả định rằng các opcode kia cũng có thể tăng 143 =m= Nhưng chưa chắc là mọi opcode nhé. Như đã nói trc là Nexon có thể thay đổi vị trí Opcode hoặc thêm/xóa đi thì lúc đó lại khác! Nhưng cứ thử tăng lên 143 rồi kt :D Không đc thì chúng ta đánh sniff lại :P
Một vào mẹo khác
- Bằng việc đoán Opcode, các OPcode cũng có thể đc điền rất là nhanh! Nhưng vẫn có 1 số cách giúp dễ hơn!
1/ Đừng sniff cùng 1 khu vực
Đúng là bạn có thể lấy được nhiều Opcode trong cùng 1 khu vực, nhưng thg là bạn sẽ đoán chúng thay vì sniff 1 khu vực! Hãy chia ra, ví dụ như sniff MESO_DROP, rồi sniff CS_OPERATION rồi sniff MOVE_FIMILIAR. Chứ đừng sniff một loạt Opcode liên tiếp nhau! :D Và vận dụng những kiến thức mà bạn đã dùng đẻ đoán Opcode để hoàn chỉnh các Opcode liên tiếp nhau
2/ Đôi khi đoán chúng ta cũng khó khăn trong việc đoán Opcode ! Vd:
ACTION_1 = 0x55 //+4, was 0x51
ACTION_2 = ? // was 0x52
ACTION_3 = 0x65 //+5 was 0x60
Giả sử ACTION 1 là ép giấy
ACTION 2 là ép giấy ép sao
ACTION 3 là di chuyển item
=> Opcode của Action 2 có thể là +4 vì liên quan đến ép giấy!Và nhìn lại Opcode cũ thì nó gần ACTION 1 hơn nên chúng ta ưu tiên +4 hơn là +5 :D
3/ Biết về những gì đại diện cho gói tin và khi nào các gói tin được sử dụng cũng rất đáng để ghi nhớ. Có một số gói tin được đặt tên rất tệ trong OdinMS! Như: DROP_ITEM_FROM_MAPOBJECT thì gói tin này cũng đc dùng khi bạn vào 1 map nào đó! Có lẽ đặt là SPAWN_ITEM hợp lí hơn. Và WARP_TO_MAP đc dùng lúc bạn đăng nhập nhưng vào thời điểm khác !?? PARTY_CHAt (RECV) ở mốt số Source đáng lẽ nên thay = MULTICHAT thì đúng hơn! Vì các chức năng chat còn lại cũng dùng Opcode naùy! Tất nhiên, tên Opcode đc dùng trong cilent vẫn là tốt nhất. Nhưng, đấy đã nói đến Dịch Ngược! Và như đã nói trc! Không đụng đến dịch ngược :D
Tóm tắt cho Opcode
1/ Sniff các Opcode dễ lấy, và rõ ràng :)
2/ Update các Opcode dễ trc! Ưu tiên các Opcode dc nhận rồi đến các Opcode đc gửi đi, mặc dù điều này không quan trọng
3/ Đoán các Opcode và Upcate các Opcode đó ngay nếu bạn thật chắc chắn là mình đúng!
4/ Quay lại và sniff lại các Opcode còn thiếu và lặp lại B1, B2 cho đến khi bạn hoàn tất tất cả các Opcode! :)
Hết phần 1
Phần 2 sẽ được Update và dịch sau ở cmt phía dưới
Và update Server có 2 cách mà mình biết đó là Dịch Ngược (Reverse Code Engineer) hoặc Sniff gói tin. Vì dịch ngược RẤT KHÓ. Đòi hỏi kiến thức về Code cũng như sử dụng Tools cực kì tốt mới làm được. Nên mình sẽ chỉ nói về Sniff gói tin. Mọi câu hỏi về dịch ngược đều bị bỏ qua!
Nếu có Copy,vui lòng ghi nguồn! Nếu không mình chửi vào mặt, thì đừng có mà chạy!
Xin cảm ơn :)
Link gốc: <b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
Giới thiệu chung:
V/việc update một game rất tốn thời gian và cũng như là cần lượng kiến thức không nhỏ. Một số sáng kiến nhỏ cũng đc áp dụng vào việc này. Vây nên, đây là một số điều cơ bản mà ai cũng phải biết nếu có hứng thú trong việc update game! Và đây là những kiến thức rất cơ bản, nếu không có, dường như việc update trở nên vô dụng cũng như tiến xa thêm. Bài viết dưới đây mình sẽ cung cấp và chỉ dẫn các bạn sniff (thu thập) gói tin và update game. Cũng như một số mẹo vặt để đẩy nhanh tiến trình nhưng nó vẫn phụ thuộc vào mức độ hiểu và sáng tạo cũng như khả năng logic của bạn! Khi bạn đã làm đc, bạn có thể áp dụng để update những source MS như OdinMS, DelphiMS v.v.. Vì các gói tin (gói tin) là như nhau. Chỉ có code là khác nhau. Nên nếu bạn học đc cách sniff gói tin thì bạn có thể update hầu hết mọi source kể cả MSEA. Và trong bài viết mình sẽ dùng MS v88 và v147.2
Tất nhiên, tất cả đều đã đc chỉnh sửa cho phiên bản mới nhất!
Tại sao lại học gói tins?
Nếu bạn muốn làm 1 server mà không ai cạnh tranh lại bạn thì update nó liên tục là một điều rất quan trọng. Điều mà EMS (extailiaMS) và một sô sv khác đang làm rất tốt. Nhưng nó không dễ và rất tốn thời gian. Nếu như bạn có đam mê và đủ nhiệt huyết. Thì mình tin, bạn sẽ làm được [đã ngắn gọn]
Định nghĩa và Thông tin CƠ BẢN
-Byte: 1 byte (2^8-1 hoặc -2^7 đến 2^7)
-Short: 2 bytes (2^16-1 hoặc -2^15 đến 2^15)
-Int: 4 bytes (2^32-1 hoặc -2^31 đến 2^31)
-Long: 8 bytes (2^64-1 hoặc -2^63 đến 2^63)
- Tất cả các gói tin hầu hết sẽ ở dạng cơ số 16 (hexa) Nên mình khuyên mọi ng nên sắm cho mình 1 cái máy tính có thể đổi từ hệ 16 sang hệ 10.
Nếu xài win7, bạn vào start -> tìm calc enter và một chiếc máy tính sẽ hiện ra. Sau đó, ở thẻ View -> Chọn Programmer là bạn đã có 1 chiếc máy tính đổi hệ 16->10 và ngược lại 1 cách hoàn chỉnh. Hoặc là bạn cũng có thể dùng mốt số trang web đổi với từ khóa như "Hex to Dec"
Để phân biệt hệ 16 và hệ 10, hệ 16 thg có dạng: 0x[dãy số]
Và mình cũng khuyên mọi ng nên thuộc một số số đơn giản như 0x0A = 10, 0x01 = 1.v.v
- Các gói tin của MS được định dạng là "Little-Endian". Nôm na là nếu như có 1 gói tin là 0x00123456, thì khi qua định dạng "Litte-Endian" nó sẽ thành "65 32 21 00" Và ngược lại, nếu chúng ta thấy 1 nhóm số 4 bytes như sau: 11 22 33 44 thì nó sẽ là 0x44332211 ở dạng hexa
- Các gói tin được gửi đi qua lại giữa server và cilent để xử lí dữ liệu, truyền đạt dữ liệu và thông tin. Giao diện đồ họa (GUI) là hình chiếu của việc truyền/nhận dữ liệu theo một cách nào đó! (!?)
- Những hành động được xử lí bởi các gói tin trong MapleStory được định nghĩa bởi 1 đoạn mã kiểu Short (2 bytes) vào đầu mỗi gói tin. Một số hành động chia sẽ chung đoạn mã kiểu Short. Chúng ta gọi đoạn mã kiểu Short này là Opcode. Tất cả các gói tin được gửi và nhận đều có Opcode. Nên khi Sniff gói tin, hãy đặt tên cac Opcode, chúng sẽ rất có ích
- Bộ xử lí (Handler) để nhận các gói tin (được gửi từ CILENT đến SERVER). Hàm MaplePacketCreator là để gửi các gói tin. (trong source Lithium là CMsContext, CField, v.v). Và lưu ý nhỏ, khi mình nói "Nhận gói tin", tức ý nghĩa sẽ là server sẽ nhận gói tin chứ không phải là cilent!!! Và tương tự cho câu Gửi gói tin, tức là ý sẽ là server sẽ gửi đi các gói tin, chứ không phải là cilent. Chúng ta đang nói về update server, nên cilent cứ tạm bỏ qua một bên!
Tìm hiểu kỹ hơn qua wikipedia:
Hệ đếm: <b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
Little-Endian các bạn không cần tìm hiểu!
[Tip] Một số thông tin vặt:
- Cấp độ (Level) và một số thông tin nhỏ như Hạng PvP sẽ là kiểu Byte! (Max là 255) Nếu bạn thấy các thông tin dữ liệu nào <255 hoặc chỉ từ -127 đến 127 đích thị là Byte!
- Job ID, Số vật phẩm, chỉ số, các thông số như Charm, Ambition vv là Short (max là 2^16-1 hoặc từ -2^15 đến 2^15)
- Cash (tiền nạp vô đó), HP và MP là Int (lúc trc là Short nhưng bản mới nhất là int :) )
- Meso, EXP và MapID đã được nâng lên Long (lúc trc là Int nên v83 bạn chỉ có tối đa 2 tỉ trong túi :P )
- Chỉ số Buff là Int
UPDATE OPCODES
Giới thiệu
- Update opcode là bước đầu tiền để update 1 server. Nó có thể tốn rất nhiều thời gian. Hoặc rất ít thời gian, nếu bạn tìm ra một quy luật nào đó cho một nhóm Opcode. Vd: Job ID chẳng hạn
- Một điều quan trọng là chúng ta phải biết Nexon thường làm gì với các Opcode của chúng ta. Và Nexon thg hay để các Opcode theo một thứ tự nhất định nào đó giữa các phiên bản khác nhau. Tuy nhiên, có một số Opcode lâu lâu Nexon sẽ đổi vị trí đi, nhưng không sao cả vì hầu hết các Opcode sẽ được giữ vị trí cũ ấy mà :D. Nên chúng ta nên kiểm tra lại các vị trí của Opcode khi Update ver mới nếu nó k thay đổi => Tuyệt vời. Còn không thì mò mẫm tiếp vậy!
- Một điều nữa là phải nắm rõ các thay đổi của bản cập nhật!! Ví dụ như Monster Book, Khi update Big Bang. Nó bị xóa đi, thế là các thứ tự Opcode sau Monster Book sẽ bị dịch lên 1 đơn vị :) Và chúng ta không cần phải sniff Monster Book gói tin nữa! Lưu ý nhé!
Làm việc với công cụ sniff gói tin
- Sau khi đọc phần này, thì hãy tiến hành sniff thử ngay đi nhé! Các bạn có thể xài Snow Sniffer vì có in ra các kí tự ASCII luôn. Nhưng bài này sẽ là dùng MapleShark! Link download sẽ được ghi sau! VÀ vui lòng cài .NETFRAME bản mới nhất hoặc từ 3.5, 4. trở lên. Vì MapleShark cần em này! À, lưu ý luôn là tải và cài WinCAP nữa! :) Không có là không sniff được!
- Sau khi đã đầy đủ thì mở MapleShark lên, nhấn vào Setting. Nếu đang xài Wifi/Mạng không dây, chọn Wireless. Còn không chọn Local Area Connection.
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
- MapleShark cũng yêu cầu mở các cổng (port) để cho việc sniff. Hãy chỉnh từ 8400 đến 8700 (hoặc 8500-8700) chứ không phải như hình! Và đừng cmt hỏi tại sao không được nếu bạn lười đọc dòng này thay vì chỉ nhìn hình và làm! (Note: Port 8585 là channels, Port 8484 là để Login, là port 8686 là dành cho Cash Shop) Nếu bạn không điền đúng phạm vi, có thể các gói tin không được sniff đầy đủ hoặc dư thừa!
MapleShark: <b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
Wincap: <b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
Làm cách nào để Sniff gói tin (SP) hiệu quả?
- Không phải SP là chỉ suốt ngày cắp đầu đi train. Và tất nhiên có 1 số gói tin vô dụng, và chúng ta phải cảm ơn Nexon vì những gói tin vô dụng này! Vấn đề là với những gói tin này sẽ làm các gói tin thu thập được di chuyển liên tục. Làm chúng ta khó thu thập các gói tin quan trọng. Như Monster gói tin, và Attack gói tin! Nó sẽ hiện liên tục ra, trong khi đó bạn chỉ cần 1 cái cho mỗi cập nhật. Khi bạn SP, chỉ lấy cái bạn cần sao cho thật nhanh chóng và gọn lẹ. Để SP một cách hiệu quả nhất, nên thực hiện một hành động vào 1 thời điểm và chọn nơi thật vắng vẻ. Như khi bạn đánh quái, chúng ta sẽ sniff đc Attack gói tin. THì thay vì đánh ồ ạt cho lên Level thì chỉ cần một cái! Và gom gói tin, xong rồi chạy :v (Làm hành động, nhìn vào bảng MapleShark, thu thập :) )
-Mẹo nhỏ là, trước khi Sniff một gói tin nào dó, hãy chat thông tin bạn muốn sniff vào và enter! Ví dụ nhé!
Vd: Bạn muốn Sniff Meso Drop gói tin (là quăng meso đó), thì trc khi thả meso, bạn chat MESO DROP và enter. Rồi tiến hành quăng meso. Nếu kỹ hơn hãy chat thêm số Meso mà muốn quăng. Ví dụ như quăng 10 meso thì chat 10 MESO DROP và quăng 10 meso sau khi chat! Và sau khi làm xong, hãy chat thêm là DONE! Để đánh dấu! :)
-Vì sao? Vì khi bạn chat, sẽ có 1 gói tin được gửi đi, nó giống như là 1 tín hiệu đánh dấu hành động trc khi làm. Nên nếu lỡ có một gói tin khác xen vào, thì bạn vẫn biết đc là gói tin cần lấy nó chỉ gần đâu đó chat gói tin mà bạn vừa chat xong! Và việc chat DONE tức bào hiện đã xong! Tránh nhầm lẫn với các gói tin Sniff sau! Và việc Chat gói tin phân biệt rất dễ, do MapleShark có khung text, chỉ cần nhìn vào và tìm các câu mà bạn vừa chat là có thể xác định được vùng mà bạn cần phân tích ngay! :)
Nó giống như bạn dùng cặp begin ... end trong lập trình Pascal để phân các chuong trình nhỏ cho dễ quản lí :)
Việc này rất có ích nhé! Đặc biệt là các Newbie! Vì các gói tin luôn dồn dập được gửi và nhận nên việc trên sẽ giúp bạn nhanh hơn! :)
Ví dụ của Ragezone (Không dịch)
An easier example for sniffing:
Wanted: Creating a party
Before you create the party in game, say in all chat: CREATE PARTY
Then quickly create the party before doing anything else
Right after you create the party, say in all chat again: FINISHED CREATING PARTY
After that, go to MapleShark, find where in the log you said CREATE PARTY, and between the places where you said CREATE PARTY and FINISHED CREATING PARTY will be the create party gói tin (explained in next section).
Phân tích gói tin và Update Opcode đầu tiên
- Bây giờ bạn đã sniff đc 1 mớ gói tin rồi chứ nhỉ? (Như lời dặn đã có trc) :v Thôi Log Off Maplestory ngay đi, bạn không muốn nhận thêm 1 mớ gói tin nữa đâu! Bây giờ quay lại Giao diện của MapleShark và xem mớ hỗn độn bạn vừa gom góm được! Những gói tin được nhận sẽ được ghi là Outbound và gửi đi là sẽ là Inbound :D Nghe có vẻ hơi ngộ và khó hiểu. Nhưng để dễ hiểu thì hãy thay server = cilient là ok! Tức những gói tin Cilent nhận sẽ là Inbound còn gói tin Cilent gửi đi sẽ là Outbound! Giờ thì đã dễ hiểu hơn chứ nhể! :D
- Các Opcode được đc ra cùng với chiều dài của Gói tin. Điều này sẽ có ích sau này. Bây giờ, hãy tìm các gói tin mà bạn đã chat vào! Và tìm vùng mà bạn đã đánh dầu như cách mình đã chỉ ở trc! :)
Các hộp bên phải dưới cùng của MapleShark cung cấp cho bạn một bản in theo bảng mã ASCII. (Xem hình)
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
- Đề tìm hiểu các phần bạn vừa sniff được. Hãy bắt đầu bằng gói tin đầu tiên, và kéo từ từ, xem từ gói tin một khi đã tìm tháy nội dung bạn đã chat và cứ như vậy cho đến khi bạn tìm được phân vùng để phân tích đầu tiên! Nếu trong vùng cần phân tích không có gói tin nào, hoặc quá nhiều gói tin thì có thể do bạn làm quá nhanh hoặc thao tác quá chậm, và có thể sai ở đâu đó rồi. Đừng nản, mà hãy tiếp tục tìm vùng để phân tích tiếp theo :)
- Bây giờ bạn đã có được vùng cần phân tích rồi chứ nhể :D Nhìn vào Direction, nếu nó ghi Outbound thì là Nhận Gói Tin* và Inbound sẽ là Gửi Gói Tin* Giờ thì lấy Opcode mà MapleShark đã hiện ra. Gói tin mà có nội dung chúng ta chat là Chat Packet! Ở v88, Opcode của nó là 0x37 và ở v112.4 nó là 0x59. Còn ở v147.2 nó là 0x6A. Bây giờ thì mở file mà chứa các packet lên nào! :D Tìm phần "GENERAL_CHAT" và thay Opcode hiện tại vào! Lưu ý: Ta thấy 0x6A-0x31 = 0x39 = 57 (có thể dùng GG search để tính) => Update từ v88 lên 147.2 có thể mỗi opcode tăng thêm +57 đơn vị. Nhớ con số này! Rất có ích cho sau này Vậy là bạn đã hoàn thành xong việc update Opcode đầu tiên rồi! :> Khoan hãy ăn mừng, vì đường còn dài lắm! ~~
- Tiếp theo, quay lại MapleShark và tìm gói tin "Inbound" mà có từ bạn đã chat! Đây cũng là GENERAL_CHAT nhưng dành cho việc gửi gói tin! Tìm file chứa những gói tin gửi đi và thay opcode CHATTEXT = Opcode mới nhất! ở v88 là 0xA2, v112.4 là 0xF8, và v147.2 là 0x169
P/s: Phần này khá khó hiểu nên k hiểu các bạn cứ hỏi và trong bài viết k có chĩ các phân tích Opcode! Vì gần như MapleShark đã làm giùm r! Trên hình chúng ta đã thấy được điều đó! :D
* : như đã đề cập trc, xin xem lại nếu bạn không hiểu
Đặt tên cho Opcode (Quan trọng)
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
- Mẹo nhỏ! Nhớ lúc trc mình có nói là các thứ tự của gói tin thường không thay đổi -> Thứ tự của Opcode cũng không thay đổi nốt! Ở v88, ARAN_COMBO đứng trc CS_OPERATION (là làm 1 số việc linh tinh trong CS ấy). Ví dụ bạn sniff được Opcode của ARAN_COMBO rồi thì bạn có thể dùng nó để so sánh Opcode của CS_OPERATION! Vd như ARAN_COMBO Opcode là 0xAA và bạn Sniff được CS_OPERATION là 0x01 < 0xAA -> Bạn biết mình đã sai và tiến hành sniff lại! Và ngc lại, nếu có đc CS_OPERATION thì hãy dùng nó để kt cho ARAN_COMBO!
Tiếp tục phân tích gói tin và update Opcode
- Phần này dài và hơi khó dịch, tác giả cũng khá dài dòng nên mình khó hiểu ý. Nên không hiểu các bạn hỏi nhé :)
- Qua các mục trên thì bạn đã xác định đc Opcode của GENERAL_CHAT. Đây là bước rất quan trọng. Để làm cho mọi thứ trở nên dễ hơn, tại mỗi gói tin GENERAL_CHAT, hãy sửa và đổi tên thành GENERAL_CHAT (RECV). MapleShark có một cái rất hay đó là tìm kiếm các gói tin dựa trên opcode. Và chẳng ai muốn đọc một mớ mã hex cả, rất phức tạp và chỉ làm tốn thời gian! Vì vậy đặt tên các gói tin = tiếng Anh và kèm thông tin gửi / nhận sẽ dễ dàng hơn! sau khi làm điều này xong. Kéo xuống và xem một vài gói tin tiếp theo. Có nhớ là chúng ta đã update chat opcode mà chưa update các thứ mà chúng ta cần update?! Và lúc này là lúc cần sử dụng bộ não thiên tài của bạn! :> Bây giờ hãy tìm các Opcode cũ của DROP_MESO ở trong server cũ của bạn! Bắt đầu ở bộ xử lí RECV (nhận gói tin). Câu hỏi đặt ra bây giờ là tại sao mìh lại biết nó là gói tin được nhận? Có 2 lí do. Một là do kinh nghiệm bản thân, nên mình biết đó là gói tin nhận và gói tin gửi đi là DROP_ITEM_FROM_MAPOBJECT. Thứ 2, là mình có một thời exploit các cilent của MS để Hack Meso! Và sniff các gói tin về DROP_MESO chỉnh sửa các giá trị khi drop thành giá trị âm => Thay vì trừ tiền nó sẽ tăng lên! Và các gói tin này sẽ đc chỉnh sửa hoàn chỉnh trc khi nó cập bến đến server ! Mà thôi dài dòng nữa, bạn đã tìm được Opcode cũ về DROP_MESO như mình đã yêu cầu chưa? VÀ cố nhớ các Opcode xung quanh nó nữa! Ở v88, Opcode của DROP_MESO sẽ là 0x5E. Bây giờ hãy tìm các g ói tin xung quanh các gói tin outbound. Nếu bạn cần trợ giúp, hãy nhìn vào Mesodrophandler và xác định xem chiều dài của gói tin, như vậy chúng ta se thu hẹp được các gói tin cần phân tích hơn. Nhưng giả sử bạn không biết gì về chiều dài của gói tin. Hãy suy nghĩ, Có rất nhiều dữ liệu đc truyền đi trong việc Drop Meso không nhỉ? :? Có lẽ là không? Có thể chì là Số Meso cb/sẽ/đã drop, có thể là địa điểm. Nên chắc chắn, gói tin chúng ta sẽ không dài một cách điên rồ vì quá ít thông tin để truyền đi! Vậy nên hãy nhìn vào các gói tin ngắn gọn, có thể là kiểu Short và phân tính nó!
- Nếu chúng ta có các Opcode cũ, hãy tìm các giá trị xung quanh các Opcode cũ. Ví dụ như Opcode cũ của DROP_MESO là 0x5E, thì bạn nên tìm các opcode đc sniff về trong phạm vi từ 0x40~0x60, càng rộng càng chính xác nhưng sẽ mất thời gian hơn. Và khi đã có đc các Opcode mới mà bạn nghĩ là đúng, okay. Bay giờ chúng ta sẽ kiểm tra chúng! Hãy nhớ lại con số meso mà bạn đã vứt đi! Nhớ chứ? ;) Sau đó, dùng chuột và highlight 8 bytes liên tiếp trong gói tin, những bytes mà bạn hìghlight cũng sẽ đc highlight kế bên tay phải nhưng đã được dịch sang bảng mã ASCII. Nếu khi highlight bytes lien tục, nhưng cột bên tay phải không hiện ra đúng số mesp mà bạn đã drop thì hãy thử dịch sang 1 byte và bôi đen 4 bytes kế tiếp!
- Vd: [00 01 02 03 04 05 06 07 08 09]
- Lúc đầu bạn bôi đen: [00 01 02 03 04 05 06 07 08 09] nhưng không đúng
- Thì bạn chuyển sang 1 byte và bôi đen 4 bytes kế tiếp nó sẽ như thế này: [00 01 02 03 04 05 06 07 08 09]
- Và cứ làm vậy khi nào tìm được đúng số meso đã drop! Nếu đã thử hết gói tin mà không tìm được số meso đã drop thì bạn đã sai! Tìm gói tin khác và phân tích lại!
Nhưng khoan, làm sao có thể biết được đâu là một giá trị đại số??? Tất nhiên là sẽ có 2 cách! Một là qua kinh nghiệm, làm nhiều lần bạn sẽ trở nên quen thuộc và biết ngay thôi! :D Còn hai là nhìn sơ qua bộ xử lí gói tin (packet handler, đây là 1 file trong server). THì sau vài lần sniff gói tin, mình tìm thấy ở v99 là 0x69 =)) (0xA8 ở v112.4) Ở v88 là 0x5E và v99 là 0x69 -> 0x69 - 0x5E = +11 -> tăng 11 đơn vị, ghi chú lại con số này kế bên opcode mới update. còn bây giờ thì kt phần gói tin gửi, vì bạn đã có MESO_DROP (RECV) nên hãy tìm bộ xử lí (handler) tương ứng với nó là được (!??)
Cập nhật: v112.4 MESO_DROP (RECV) là 0xA8, 0x1D3 là opcode của DROP_ITEM_FROM_MAPOBJECT (SEND)
- Hiển nhiên là ở trong MapleDropHandler (1 file trong server), nhưng Opcode đc đặt tên theo một cách rất tệ! Phải có 1 cách nà đỏ để tìm các bộ xử lí này! :P Cách dễ nhất đó là nhờ chức tìm kiếm của IDE. Giả sử ở đây là mình dùng NETBEAN, nhưng ai dùng Eclipse cũng sẽ có những tính năng tương tự thôi. :D Nhấn chuột phải vào MESO_DROP, và chọn Find Usages. Tương tự cho Eclipse. Chọn một giá trị mặc định và nó sẽ tìm nhưng biến sử dụng tương tự. Nhấp đúp chuột vào dòng code mà bạn muốn dùng, nó sẽ đưa bạn đến PacketProcessor.java (ở source OdinMS) và kế bên dòng code này sẽ là tên của tập tin chứa nó! Nhấn Ctrl và click vào tên tập tin, IDE sẽ đưa bạn đến thẳng tập tin chứa file!
- Trong bộ xử lí (handler), đôi khi sẽ có c.getSession().write(MaplePacketCreator.stuff); ở một dòng code nào đó. Thì cái đó sẽ nói rằng Server sẽ gửi những gói tin gì đến người chơi. Một số bộ xử lí, những dòng code như trên được sử dụng nhiều lần và ở một số dòng code, thì điều trên không có nghĩa là gửi gói tin. Đây mới là nơi mà khi đọc code các bạn cần để ý đến. Có nhớ cách bạn làm để dẫn đến phần chính xác của đoạn code? Tìm các gói tin mà server gửi đi (nếu có) và đi đến phương thức thực hiện (nhấn Ctrl và click chuột vào method (phương thức)). Phương thức này sẽ có dạng như public static MaplePacket blabla();
{MaplePacketLittleEndianWriter mplew = stuff; mplew.writeShort(<OPCODE GHI Ở ĐÂY[>);/* một đoạn mã bỏ đi :v */}
- Tìm các Opcode ở trong <OPCODE G...>, trong trường hợp drop meso sẽ là DROP_ITEM_FROM_MAPOBJECT. [Go back to where the send opcodes are located and get the old opcode for DROP_ITEM_FROM_MAPOBJECT.]
- Giờ thì trở lại, tìm Opcode mới để update. Tìm các gói tin gửi đi sau MESO_DROP. Các gói tin thg chỉ gần các giá trị cũ mà thôi. Sau khi tìm được, hãy tính độ chênh lệch giữa gói tin cũ và mới rồi ghi lại kế bên. Nếu bạn lười biếng và không làm điều này. THì hãy dừng lại và tập làm ngay đi. update không dành cho những kẻ lười biếng!
-Một vài ý tưởng cho việc KT gói tin
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
Phương pháp đoán Opcode (Trên cơ sở Lý Thuyết)
- Bây giờ các bạn hẳn đã có một lượng kiến thức đủ để update Opcode theo các cách tẻ nhạt :v Tất nhiên, để bớt nhàm chán, mình sẽ chỉ bài một vài chiêu :>
Với các chiêu này bạn có thể đoán Opcode mà không cần phải sniff làm gì cho mệt ng! :D Một trick đó là tăng giảm các giá trị sau khi tìm được 1 Opcode là so sánh nó với Opcode cũ. Như Meso Drop là tăng lên 11 đơn vị.
- Mình đã chuẩn bị các vị dụ về Opcode trong phiên bản 147.2 (Mới nhất và đây đều là các Opcode chính xác)
- Giả sử bạn đang dùng source v117.2 và muốn nâng cấp lên 147.2
Cho những Opcode (RECV) sau đây:
MOVE_FAMILIAR = 0x14D
TOUCH_FAMILIAR = 0x14E
ATTACK_FAMILIAR = 0x14F
REVEAL_FAMILIAR = 0x151
QUICK_SLOT= 0x152, 0x1E1
Bạn đăng nhập vào MS, sniff đc opcode MOVE_FAMILIRA là 0x1DC bằng việc di chuyển xung quanh map và nhận Opcode! Và bạn hãy đăng nhập lại và lấy đc gói tin QUICK_SLOT là 0x1E1. Tuy nhiên, vì một lí do gì đó, bạn không có quái để hiếp dâm! Và thế là bạn không có được ATTACK_FAMILIAR và REVEAL_FAMILIAR. Mà bạn cũng chả biết cái REVEAL_FAMILIAR là cái lề gì :v Nhưng yên tâm, trick này sẽ giúp bạn làm điều đó :3
MOVE_FAMILIAR là 0x14D và mới Update thì nó là 0x1DC tức là tăng lên 143 đơn vị (wtf). QUICK_SLOT cũng tương tự tăng 143 đơn vị! (Thấy rồi chứ :>)
vâng, từ đây, chúng ta có thể giả định rằng các opcode kia cũng có thể tăng 143 =m= Nhưng chưa chắc là mọi opcode nhé. Như đã nói trc là Nexon có thể thay đổi vị trí Opcode hoặc thêm/xóa đi thì lúc đó lại khác! Nhưng cứ thử tăng lên 143 rồi kt :D Không đc thì chúng ta đánh sniff lại :P
Một vào mẹo khác
- Bằng việc đoán Opcode, các OPcode cũng có thể đc điền rất là nhanh! Nhưng vẫn có 1 số cách giúp dễ hơn!
1/ Đừng sniff cùng 1 khu vực
Đúng là bạn có thể lấy được nhiều Opcode trong cùng 1 khu vực, nhưng thg là bạn sẽ đoán chúng thay vì sniff 1 khu vực! Hãy chia ra, ví dụ như sniff MESO_DROP, rồi sniff CS_OPERATION rồi sniff MOVE_FIMILIAR. Chứ đừng sniff một loạt Opcode liên tiếp nhau! :D Và vận dụng những kiến thức mà bạn đã dùng đẻ đoán Opcode để hoàn chỉnh các Opcode liên tiếp nhau
2/ Đôi khi đoán chúng ta cũng khó khăn trong việc đoán Opcode ! Vd:
ACTION_1 = 0x55 //+4, was 0x51
ACTION_2 = ? // was 0x52
ACTION_3 = 0x65 //+5 was 0x60
Giả sử ACTION 1 là ép giấy
ACTION 2 là ép giấy ép sao
ACTION 3 là di chuyển item
=> Opcode của Action 2 có thể là +4 vì liên quan đến ép giấy!Và nhìn lại Opcode cũ thì nó gần ACTION 1 hơn nên chúng ta ưu tiên +4 hơn là +5 :D
3/ Biết về những gì đại diện cho gói tin và khi nào các gói tin được sử dụng cũng rất đáng để ghi nhớ. Có một số gói tin được đặt tên rất tệ trong OdinMS! Như: DROP_ITEM_FROM_MAPOBJECT thì gói tin này cũng đc dùng khi bạn vào 1 map nào đó! Có lẽ đặt là SPAWN_ITEM hợp lí hơn. Và WARP_TO_MAP đc dùng lúc bạn đăng nhập nhưng vào thời điểm khác !?? PARTY_CHAt (RECV) ở mốt số Source đáng lẽ nên thay = MULTICHAT thì đúng hơn! Vì các chức năng chat còn lại cũng dùng Opcode naùy! Tất nhiên, tên Opcode đc dùng trong cilent vẫn là tốt nhất. Nhưng, đấy đã nói đến Dịch Ngược! Và như đã nói trc! Không đụng đến dịch ngược :D
Tóm tắt cho Opcode
1/ Sniff các Opcode dễ lấy, và rõ ràng :)
2/ Update các Opcode dễ trc! Ưu tiên các Opcode dc nhận rồi đến các Opcode đc gửi đi, mặc dù điều này không quan trọng
3/ Đoán các Opcode và Upcate các Opcode đó ngay nếu bạn thật chắc chắn là mình đúng!
4/ Quay lại và sniff lại các Opcode còn thiếu và lặp lại B1, B2 cho đến khi bạn hoàn tất tất cả các Opcode! :)
Hết phần 1
Phần 2 sẽ được Update và dịch sau ở cmt phía dưới