PDA

View Full Version : [Bài dịch] Muốn update server Maple Story? Vào đây!



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

shell1508
10-09-14, 01:25 AM
Phần 2: Đọc và Update Cấu Trúc Gói Tin


Giới thiệu
- Giờ thì việc Update Opcode đối với bạn là quá dễ dàng rồi chứ nhỉ! :3 Còn bây giờ nâng cao hơn, hãy update các cấu trúc gói tin bị sai! Thì trc hết, chúng ta sẽ học cách đọc gói tin và hiểu nó cái đã! :3

Yêu cầu trình độ
- Java căn bản (phải đã hoành tất về mảng, vòng lặp và cấu trúc dữ liệu đơn giản như struct, danh sách liên kết,...)
- Đã đọc hướng dẫn trên và có thể sniff gói tin và update opcode.
- Có khả năng theo kịp và làm theo hướng dẫn
Ebook Java: <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>
Forum trao đổi: <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>
Vui lòng đọc, không hiểu các bạn có thể hỏi :) Nếu các bạn không đọc và hỏi những ý ở sau cái này thì mình sẽ lơ nhé!
Post này mình k xóa nên đừng vội! :D Ok?


Vòng khởi động

- Nhắc lại trc khi bắt đầu! byte = 1 byte, short = 2 bytes, int = 4 bytes, long = 8 bytes! Một vài biến thông thg đã được liệt kê (JobID, MapID, vv)
- Một byte là 1 cặp số thập phân! vd: 00 01 02 03 = 4 bytes; 01 = 1 byte
- Biểu diễn của số hex có dạng 0x[Dãy số]
- Các chữ số trong số hex gồm 0-9 và A-F với A=11...F=15


Kiểm tra gói tin server nhận (Outbound)

- Tiếp tục dịch những con chữ khô khan nào :v Khó hiểu cứ hỏi nhé!
- Bây giờ lấy 1 em gói tin ra mần thịt, kiểm tra xem em ấy có đúng hay không? Nếu bạn không thể vào game thì đây là cách DUY NHẤT update gói tin mà việc kiểm tra được nó đúng hay không khá khó! :(( Bây giờ hãy lấy gói tin mà bạn lượm được khi vào Cash Shop (CS). THeo như mình đã sniff thì ở v99 là [13 00 00 00 00 00 00]. Để làm việc gọn với Opcode, bạn phải định hướng đc gói tin làm cái quái quỷ gì ở trong MaplePacketCreator (enable(kích hoạt)User0 hoặc là một cái gì đó, tùy thuộc vào source mà bạn chọn để dev). Còn bây giờ bắt tay vào việc kiểm tra nó chính xác hay không.
- Về cách đọc/viết các gói tin đều có phương thức khác nhau trog các source. Để thêm 1 byte vào gói tin, chúng ta sẽ dùng write (gửi), và để đọc (nhận), chúng ta dùng read. write(number) sẽ ghi ra 1 byte. writeShort(number) sẽ ghi 2 bytes(short) và writeInt(number) sẽ ghi 4 bytes(Int). Tương tự cho chức năng khác như read chẳng hạn :) Tuy nhiên, có một vài phương pháp đặc biệt.Và cái quan trọng nhất là phải hiểu được readMapleAsciiString và writeMapleAsciiString cái mà mình sẽ nói sau với mức nâng cao hơn!
- OK, phân tích gói tin thôi nào! Trước hết, chúng ta hãy gộp Opcode mà Mapleshark đã cho chúng ta và Gói tin lại thành một! '3' Opcode của chúng ta sẽ có dạng 0x00FA = FA 00* (Outbound) và gói tin của chúng ta là [2A 00 00 00 52 00 00 00 47 00 00 00 49 00 00 00 1D 00 00 00 53 00 00 00 4F 00 00 00 51 00 00 00], sau khi "Lưỡng Long Hợp Thể" gói tin đầy đủ sẽ thành [FA 00][ 2A 00 00 00 52 00 00 00 47 00 00 00 49 00 00 00 1D 00 00 00 53 00 00 00 4F 00 00 00 51 00 00 00] Thấy Opcode được đặt vào ví trí nào rồi chứ ;)
- Thì gói tin trên là dành cho Quickslot ở v99, nhưng nó chưa được rõ ràng cho lắm. Lấy 2 byte đầu tiên của gói tin và tìm các Opcode nào tương tự như vậy! -> Chúng ta sẽ tìm Opcode tương tự 0x00FA. Nhìn qua cái Opcode đã thu gom góm được và tìm Opcode tương ứng giá trị. Trong trường hợp này là 0xFA '3' Và sau đó tìm bộ xử lí (handler) tương ứng và mở lên
- Đọc và kiểm tra gói tin yêu cầu bạn phải làm việc từ đầu và tiếp tục (đi về phía trước??? ) Bạn có thể bắt đầu từ đoạn giữa gói tin cũng được, nhưng nó sẽ đòi hỏi nhiều kinh nghiệm xử lí hơn (mẹo sẽ được chỉ sau). Dù sao, các thông tin về gói tin nhận (outbound) đều ở trong source cả. Và cho dù có gì đi nữa, thì luôn luôn có short read ở đoạn đầu. Chính điều này sẽ giúp xác định handler mà chúng ta nên đến. Vì vậy, chúng ta có thể đọc cái gói tin mà chúg ta đã biết được cấu trúc gói tin của nó (Ít nhất là ở các version cũ hơn). Chúng ta sẽ bắt đầu với slea.readShort(); để tìm handler mà gọi hàm này. 2 bytes đầu tiên là FA 00, và ở hex sẽ là 0x00FA. Và hãy ráng nhớ một số bước quan trọng sau đây
- Một, khi bạn đọc cái gói tin, các byte sẽ không được xem xét trong quá trình đọc. Vì vậy, rất quan trọgn trong việc theo dõi cac gói tin và quan tâm đến kiểu của chúng (byte, short, int hay các kiểu khác). Thế nên, hãy áp dụng cách này! Vì chúng ta đã đọc FA 00, hãy đặt dấu ngoặc vuông vào để đánh dấu đoạn chúng ta đã đọc -> gói tin sẽ trở thàh [FA 00][2A 00 00 00 52 00 00 00 47 00 00 00 49 00 00 00 1D 00 00 00 53 00 00 00 4F 00 00 00 51 00 00 00]. Như vậy chúng ta sẽ dễ quan sát và xử lí hơn! Điều thứ 2 là phải đảm bảo khi đọc gói tin, các giá trị chúng ta đọc phải có nghĩa. [You cannot go wrong with the packet header (or opcode, or just first two bytes)], Nên không cần quan tâm nó ở đây, nhưng ở các vấn đề sau thì nó khá là quan trọngl.
- Bây giờ, hãy nhìn vào handler và bạn sẽ thấy 1 dòng tương tự như for(int i = 0; i<=8;i++){int key = slea.readInt(); bla bla bla}. Điều này cơ bản nói rằng hàm readInt() đc sử dụg 8 lần. Bây giờ, chúng ta quay lại gói tin và xem xét từng Int một. Như ta đã biết 1 Int = 4 bytes. Vậy nên Int đầu sẽ là [2A 00 00 00] nhưng chúng ta phải đổi ngược lại thành 0x0000002A, vậy là khi được đọc, dữ liệu vào sẽ là 0x0000002A. THêm ngoặc vuông vào đoạn đó như đã chỉ ở trên kia! Bây giờ gói tin sẽ ntn: [FA 00] [2A 00 00 00] [52 00 00 00 47 00 00 00 49 00 00 00 1D 00 00 00 53 00 00 00 4F 00 00 00 51 00 00 00]
Bước tiếp theo sẽ nói rõ về phần vừa đọc hơn. Có hợp lí khi một key có giá trị là 42? Có thể hợp lí, vậy nên cứ lặp lại công việc vừa nói trên cho đến khi nào đủ 8 lần và hết gói tin! THì sau khi readInt() 8 lần và phân chia gói tin như đã nói, bạn sẽ được như sau: [FA 00] [2A 00 00 00] [52 00 00 00] [47 00 00 00] [49 00 00 00] [1D 00 00 00] [53 00 00 00] [4F 00 00 00] [51 00 00 00]. Có vẻ như các giá trị của gói tin này đều hợp lí, nên chúng ta không cần phải update nữa. Xong! :>

*: (xem lại định dạng Little Endian ở phần 1)


Các gói tin bị sai khi nhận

- Thật không phải lúc này chúng ta cũng có thể có được các gói tin đúng khi update các ver khác nhau! Một ví du cụ thể cho việc này sẽ giúp bạn hiểu rõ hơn! (Opcode trong ví dụ đã đc thêm vào gói tin)
- Cho gói tin sau: [73 00 5F 98 95 02 02 00 00 00 00 02 00 00 00 00 00 00 31 00 00 00 00 01 00 00 00 00 00 00 AB 00 00 00], đây là gói tin khi dùng tính năng auto asign (tự tăng điểm) cho job Evan từ lv1 -> lv50 (tức là 49 level trc chưa tăng một AP nào) Bước đầu là xác định lại Opcode, và chúng ta đc 0x0073. Nếu bạn đã làm theo hướng dẫn trc, bạn có thể tìm thấy Opcode này cho AUTO_ASSIGN. Tìm bộ xử lí nào là Auto assign và mở nó lên. Chúng ta đã phân tích 2 bytes đầu nên có thể bỏ qua, Chúng ta đi đến lệnh đọc gói tin đầu tiên và xem nó có hợp lí không. slea.readInt(); hoặc là slea.skip(4); có nghĩa là đọc 4 bytes. Tức là 4 byte sẽ đc đọc sau Opcode -> 5F 98 95 02 -> 0x0295985F. THì 4 bytes đầu thg là timestamp ?? Nên các giá trị của timestamp thg rất lớn -> Đúng. -> Gói tin đã phân tích [73 00] [5F 98 95 02] 02 00 00 00 00 02 00 00 00 00 00 00 31 00 00 00 00 01 00 00 00 00 00 00 AB 00 00 00 Dòng tiếp theo của code là slea.readInt(); là nói về chỉ số đã được tăng AP. (chỉ số là STR, LUK, INT, DEX, MaxHP, MaxMP,...) Bạn có thể biết được thông qua các biến, chú thích của người dev để lại. Lấy 4 bytes tiếp theo ra và đổi ra hệ 10 ra đc 2 => Đúng, Magical tăng 2 chỉ số là Int và Luk (các ver cũ, nên đừng thắc mắc nhé :D) -> Tiếp tục
- Bây giờ gói tin của chúng ta sẽ là [73 00] [5F 98 95 02] [02 00 00 00] 00 02 00 00 00 00 00 00 31 00 00 00 00 01 00 00 00 00 00 00 AB 00 00 00. Vòng lặp 2 lần, và chúng ta đã làm 2 lần. Nên đọc dòng tiếp theo thì nó sẽ nói cho chúng ta rằng kiểu tiếp theo sẽ update là Int! Đọc 4 bytes tiếp theo là 0x200 = 512 [ = updating luck according to the if statement if (type == 512).] Điều này hợp lí nên chúng ta tiếp tục! Int tiếp theo theo handler nói là số lượng AP nhận được! 4 bytes tiếp theo là 00 00 00 00 = 0x00 = 0 ???? Kì vậy nhỉ :? Có vẻ như số lượng cái gì đó nhận được là 0? Nhưng là cái gì? Thôi kệ :v dù sao thì chắc cũng hợp lí nên move on! [Had it been more than 1000, then it would have been weird. This is where knowledge of the game comes in though. Auto-assign gives you regular stat build and since this was a stripped level 50 Evan, this should have given some luck. ]
- Tiếp theo, chúng ta sẽ thấy vòg lặp lặp lại 2 lần. Đây là cái sẽ nói chỉ số được cập nhật. Tiếp 4 bytes tiếp theo là 31 00 00 00 = 49?? Kì nhỉ?? 49 là gì? Như chúng ta biết là ở các vẻ cũ, các chí số INT và LUK được phân phối đều nhau. Mà LUK = số level +3! Mặc đinh LUK của chúng ta là 4 => 53 - 4 = 49 -> 49 chính là số LUK được tăng thêm. Điều này chứng tỏ là sẽ phải có 1 chỉ số mới giữa các gói tin biểu thị chỉ số đã đc tăng! -> Những gì chúng làm được bây giờ là thêm 1 dòng lệnh slea.readInt(); vào sau int type = slea.readInt(); để chỉ ra đây là một cái mới. Kiểm tra toàn bộ phần còn lại của gói tin cho đến khi kết thúc! Thì lệnh mà các bạn vừa thêm đã sửa đc phần nào các lỗi của gói tin. Và chúc mừng bạn, bạn đã vừa update xong một gói tin hoàn chỉnh!


Một vài bổ sung và "Lỗi" kết nối

- Lưu ý rằng mình biết rằng sẽ cần một chút may mắn bởi vì đó là nhân vật của mình của mình tạo ra! Và mính sẽ nhận ra ngay nếu có điều gì đó không ổn. Nếu không phải nhân vật của mình, thì mình nghĩ là sẽ không dễ dàng gì làm được và viết đến tận đây! Và đây cũng là lí do mà nếu bạn nhờ người khác sniff gói tin hộ thì có vẻ không tốt mấy. Vì nếu tự sniff gói tin, bạn sẽ biết được nhân vật mình ra sao, ntn, và đỡ đoán mò hơn. Cũng như đoán chính xác các gói tin hơn



Kiểm tra gói tin gửi đi

- Như khái niệm trc, cái này cũng tương tự, nhưng thay vì bỏ qua phầ n Opcode, bỏ qua 2 bytes đầu tiên và chỉ tìm Handler xử lí thì chúng ta phải làm điều trên. Nếu chúng ta muốn kiểm tra một gói tin như sau: 13 00 00 00 00 00 00 (gói tin này biểu diễn cho một số hành động nào đó). Chúng ta sẽ bắt đầu với 13 00 , nhưng trc khi làm điều này, chúng ta cần hiểu cách gói tin được tạo ra ntn ở trong MaplePacketCreator và chúng ta sẽ làm như vậy. Và thay vì read chúng ta sẽ dùng write.



public static MaplePacket enableCS0() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(0x13); // or SendPacketOpcode.ENABLE_CS_0 or SendPacketOpcode.ENABLE_CS_0.getValue();
mplew.write0(5); // or mplew.writeInt();mplew.write(0);
return mplew.getPacket();
}

- Dòng đầu tiên là định nghĩa hàm (method). Đây là một phương thức ở dạng public, tức có nghĩa có thể được truy cập mọi nơi(*). Đó là một static nên đây là một "lớp hàm" (class method) và nó không được gọi bằng đối tượng. Cái nó trả về là MaplePacket. Dòng thứ 2 là tạo một đối tượng MaplePacketLittleEndianWriter. Điều này sẽ giúp chúng ta sử dụng lệnh "write" dễ dàng và đơn giản hơn là viêt 1 chuỗi dài sọc như vậy. Dòng tiếp theo, chúng ta write 2 bytes (short) đó là 0x13. Đièu này có nghĩa là chúng ta vùa thêm đoạn 13 00 vào một gói tin trống. Tiếp theo, chúng ta thực hiện lệnh mplew.write0(5); Thì write0 là hàm bỏ qua các gói tin được gửi đi. Chí viết viết vào các byte trống toàn số 0. Vậy nên gói tin ghi thêm vào sẽ được như thế này: 13 00 [00 00 00 00 00] (5 byte trống). Sau dòng này, sẽ là thực hiện lệnh trả về gói tin mà ta đã có đc sau khi đọc xong dòng 4.

- Một cách để kiểm tra là so sánh các gói tin ở version cũ hơn so với version mới. Còn một cách nữa là làm giống như ta đã làm với các gói tin nhận. Kiểm tra tính hợp lí của từng gói tin, từng bytes một! o.O Phuơg pháp t2 sẽ cho chúng ta độ chính xác cao hơn tuy nhiên bù lại, chúg ta phải dùng não nhiều hơn cũng như tốn thời gian hơn nếu có các gói tn không hợp lí hoặc không đúng xảy ra. Và nếu làm một cách chính xác, thì một số chứng năng mới có thể phù hợp với các gói tin cũ? [If it is done correctly, the new packet for enabling a few functions will match the old one.] Một điểm khác giữa v88 và v98+ là các opcode đổi từ 0x12 thành 0x13, nhưng chúng ta cũng có thể đoán ra được bằng cách update Opcode, điều này lí giải tại sao chúng ta phải update Opcode trc khi làm mấy cái khó khăn này.

(*)Lập trình hướng đối tượng, OOP: <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> (Basic)


Note nhỏ

- Có một vài thuật ngữ chúng ta cần hiểu để làm việc đơn giản hơn. Một ví dụ là MaplePacketLittleEndianWriter. Một ví dụ khác là những hàm trả lại, chúng ta cũng phải cần hiểu điều đó. Lợi ích là sự hiểu biết công cụ này thực sự không có mục đích trong việc cập nhật các phiên bản khác.


Một vài hàm gói tin khác trong source Odin

- Có một vài hàm chưa được đè cập từ đầu đến tận bây giờ. Một trong nhữg hàm quan trọng đó là readMapleAsciiString. Đây giống như là 1 hàm với 2 chức năng. readMapleAsciiString đầu tiên sẽ đọc 2 bytes đầu để xác định chiều dài của chuỗi. Sau khi đọc và xác định được, nó sẽ đọc các byte tiếp theo đổi các hex sang định dạnh ASCII khi nào đủ chiều dài thì thôi. Ví dụ chúng ta có 08 00 30 30 30 30 30 30 30 30, dùng hàm readMapleAsciiString để đọc gói tin kia. Đầu tiên nó sẽ đọc 08 00 (=8), và sau đó, nó đọc 8bytes tiếp theo và đổi từng byte thành mã ASCII. Và những số 30 sẽ thành những con số 0. Và ngược lại với readMapleAsciiString, thì writeMapleAsciiString sẽ ghi ra những byte vào gói tin trống và kèm theo 2 byte đầu tiên chỉ độ dài. vd: writeMapleAsciiString('3141') -> gói tin là 04 00 33 31 34 31. Với 04 00 là độ dài của chuỗi ghi.

- Có một hàm được sử dụng để bỏ qua đọc cái byte (and it has been gone over above). Và nó chỉ bỏ qua các byte trên gói tin được nhận, và không làm gì với số byte tương ứng. VÀ một hàm khác là ReadInt sẽ trả về các bytes đã đc bỏ qua. tương tự, cũng có 1 hàm là write0 sẽ giúp ghi các bytes trống trong gói tin. Và các bytes đó sẽ không có dữ liệu gì cả.

- Có một hàm dùng để ghi các chuỗi khác là writeAsciiString. Hàm này sẽ không bao gồm chiều dài của chuỗi cần ghi. vd: writeAsciiString("1234") -> Gói tin sẽ là 31 32 33 34. Chứ không có 04 00 ở đầu để chỉ thị độ dài như writeMapleAsciiString();


Một vài cách giúp update hiệu quả

- Tất nhiên, chúng ta sẽ khong phan tích những gói tin khó hoặc với một dữ liệu khổng lồ trước mà không có một tí kiến thức nào cả.
- Trong gói tin, nếu gói tin này liên quan đến Item, thì hãy nhớ đến Item ID, vị trí của item trong slot, mô tả thông rtin item, chỉ số item (máu thì bơm đc bao nhiêu, %HP khi bơm , v.v) Điều này có thể giúp xác định các phần mới, thông tin mới. Như các item mới được thêm vào ver mới thì hãy đoán giá trị của nó. Vd: trong v99 với gói tin 0A 00 00 00 đc thêm vào một chỗ nào đó trong Chỉ số nhân vật. Nghĩ xem, giá trị nào có thể là 10?
- Biết vài một thông tin chung. Một số gói tin không thay đổi theo thời gian thường là skill, mapid, item, v,v Gói tin mặc định cho việc dùng đá teleport để chi chuyển map cũng đc sử dụng ở một số chỗ khác. Biết những giá trị chung sẽ giúp ích chúng ta cho việc update lâu dài
- Học/đọc về Cấu trúc gói tin. Sau khi làm điều này trong một thời gian, bạn sẽ biết được buffs có 4 longs ban đầu,tức là skill buff sẽ có 4 longs (8 bytes*4 byte ở đầu gói tin) (hoặc là 2 trc aftershock (k rõ từ này), và 2.5 ở v88) Và mỗi giá trị của chỉ số buff của các skill buff là thg ở dạng gói tin theo kiểu short, int ,int. Sau khí có một số thông tin khác, kiểu Char (char info hoặc là thông tin nhân vật) thường đi với skill cooldowns, nhiệm vụ, hoàn thành nhiệm vụ, mini-game, nhẫn, đá teleport, và nhiều điều khác nữa. Nó làm cho quá trình kiểm tra nhanh hơn.
- Biết một vài checkpoints của gói tin, và làm việc theo tuần tự. Điều này sẽ giúp bạn ít sai hơn. Như khi teleport, thì đầu tiên sẽ có thể là mapid đến, sau khi có thì sẽ hiện nhân vật ra. Và chúng ta phải xem xét các id, itemid mà nhân vật đang mặc trên người. Cứ xem xét các yếu tố theo tuần tự như vậy! :)
- Update version đòi khỏi một lượng kiến thức. Bạn phải biết nên làm gì, nhớ điều đó, và tiếp tục học hỏi và hãy nhớ rằng bạn không phải là người update giỏi nhất!
- Không có kiểu dữ liệu nào dài 3bytes cả, nói chung hơn là số lẻ, cac kiểu dữ liệu thường có số byte là 2^n.
- Đừng vội bỏ cuộc sớm, update gói tin rất khó nên phải làm từ từ và mất một khoảng thời gian để làm quen với nó (trừ khi bạn đã học qua Network Programming có thể dễ hơn) Và mặc kệ ai phản đối bạn, nói bạn bị điên khi update một game chả hot ở VN nữa.


Tóm tắt
1/ Kiểm tra gói tin
2/ Nếu gói tin sai, tìm lí do. Nếu có điều gì mới thêm vào, ráng tìm ra những giá trị mới đó biểu diễn cho chỉ số hoặc hành động nào. Nếu có 1 giá trị ngẫu nhiên nào đó, hoặc là không có giá trị (=0) thì nó sẽ có thể là một tính năng nào đó ở các version sau.
3/ Thực hiện một số thay đổi nếu cần thiết, đôi khi chúng ta có thể loại bỏ một byte.
4/ Thực hiện lại đièu này cho các gói tin bị lỗi ở các phiên bản.


- Nếu bạn đọc từng dòng từng chữ đến đây, thì mình xin chúc mừng bạn đã rất kiên nhẫn đọc những dòng Tiếng Anh khập khiễng của mình. Nhưng điều đó chứng tỏ bạn rất yêu Maple, muốn xây dựng một Maple theo kịp thời đại và có lẽ là muốn Maple trở lại Việt Nam đúng nghĩa là một server gần như chính thức (Herogame đã làm rất tốt nhưng vẫn còn lỗi và update chậm)
- Bạn đã rất kiên nhẫn rồi thì có nghĩa không có gì bạn không thể làm được nữa. Vậy nên hãy cố lên nhé! :)
- Và chúc các Maple Developer với sự kiên nhẫn Update được server cũng như thành công :)
- Và xin chân thành cảm ơn các bạn đã ủng hộ Topic :D


Sẽ sớm ra mắt Video sớm nhất có thể

shell1508
14-09-14, 10:28 AM
Các Topic hay không dịch:
Cách sniff gói tin thông qua VPN: <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>
Cách code NPC: <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>
Cách làm một redirector (tạm coi là một localhost): <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>
Soft giúp chơi các version cũ trên win8: <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ột số server để sniff gói tin không cần fake IP: <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 những ver mới, ExtaliaMS đã mã hóa gói tin nên k khuyên sniff)

quidom
20-09-14, 03:44 PM
hóng video hướng dẫn :D thanks bạn nhiều