อักขระรูปภาพคือการวาดอักขระบนรูปภาพ ในขณะที่อักขระระบบคือการเรียกแบบอักษรที่มาพร้อมกับโทรศัพท์ ซึ่งโดยพื้นฐานแล้วสามารถแยกแยะได้จากรูปลักษณ์ภายนอก หลังจากที่ข้อความของเกมประเภทนี้ได้รับการแปลเป็นภาษาจีนโดยตรง เกมทั้งหมดจะแสดงคำว่า "口口口口口口" (ว่างเปล่า) สำหรับเกมที่ใช้ตัวละครรูปภาพของตัวเอง วิธีการแปลภาษาจีนจะรวมเอาเมทริกซ์ภาษาจีนและการปรับเปลี่ยนตัวละครของระบบ การแปลดอทเมทริกซ์มีข้อจำกัด เช่น ข้อความมากเกินไป ดัชนีดอทเมทริกซ์ในไฟล์คลาส ฯลฯ และใช้ได้กับบางเกมเท่านั้น มีการแก้ไขเพิ่มเติมเป็นคำของระบบ การปรับเปลี่ยนคุณต้องมีความเข้าใจในภาษา Java พอสมควร ดังนั้นก่อนที่จะอ่านบทช่วยสอนนี้ หากคุณไม่รู้จัก Java ขอแนะนำให้ดาวน์โหลดและเรียนรู้ JAVA Beginners เพื่อทำความเข้าใจ JAVA (จำเป็นต้องเป็น คลายการบีบอัด) เครื่องมือเตรียมด้าน S40: MC, MobyExplorer,
Mocha decompilation
ตัวแก้ไขโค้ดไบต์
จัสมิน(/ur l)
(url=http://down2.s60net.com:8118/res/201112/10/17938831/paojiao_94825.jar?) ผู้ตรวจสอบก่อนหน้า ( /url)
(url=http://down2.s60net.com:8118/res/20118/15/89301505/paojiao_89300.jar?) Disass embler2Jasmin
ในบรรดาเกม Java ที่ใช้แบบอักษรรูปภาพ เกมของผู้ผลิตเกม DigitalChocolate เป็นเกมที่ง่ายที่สุด โดยทั่วไปเกม DigitalChocolate ได้รับการแก้ไข เกมช็อคโกแลตเป็นการแนะนำการเรียนรู้ วิธีการแก้ไขเกมของผู้ผลิตรายนี้เป็นสูตรตายตัวและไม่ซับซ้อนมาก ลองดู " My Pet Shop My Pet Store" ของ DigitalChocolate เป็นตัวอย่าง หลังจากขยายขนาดเกมแล้ว ให้ใช้การคอมไพล์ Mocha เพื่อแยกไฟล์คลาสในนั้น และเรียกดูไฟล์เหล่านั้นโดยย่อเพื่อค้นหาวิธีต่อไปนี้: public? (รูปภาพรูปภาพ, DataInputStreamdatainputstream, Font Font, int?, int?) {} เราพบว่ามันอยู่ใน i. โดยทั่วไปแล้วในชั้นเรียน ไฟล์ของวิธีนี้อยู่ในไฟล์คลาสขนาด 3 ถึง 4K ดังนั้น ควรให้ความสำคัญกับการเปิดไฟล์ขนาด 3 ถึง 4K เพื่อเรียกดู แล้วคุณจะพบไฟล์เหล่านั้นได้อย่างรวดเร็ว สาธารณะ i (รูปภาพรูปภาพ, DataInputStreamdataInputStream, ฟอนต์ฟอนต์, inti1, int j1) {int k; อินท์ i2; อินท์เจ2; ถ่าน CH; if (image ! = null) (ละเว้น...) สิ่งที่เราต้องทำคือเพิ่ม image = null ด้านบน if (image! = null) อย่าคิดเกี่ยวกับมันในฉัน การเพิ่มลงใน java จะไม่ทำงาน เนื่องจากความสับสนหรือเหตุผลด้านเครื่องมือ โดยพื้นฐานแล้วไฟล์จาวาที่ถอดรหัสแล้วจึงไม่สามารถคอมไพล์กลับเข้าไปในไฟล์คลาสได้ บรรลุวัตถุประสงค์ได้โดยการแก้ไขรหัสไบต์ ขั้นแรกให้สร้างโฟลเดอร์ใหม่ "1" และ "2" แล้วใส่ i ใส่ชั้นเรียนเข้าไป เปิดซอฟต์แวร์ Disassembler2Jasmin และจะมีกล่องที่อยู่สองกล่อง กรอกอันแรก E:/1/i. กรอกข้อมูลในฟิลด์ที่สองของคลาส E:/2/คลิก "Unshell" ในซอฟต์คีย์ซ้าย และเปลี่ยน i คลาสถูกถอดรหัสเป็น bytecode ซึ่งจะสร้าง i เจไฟล์. เปิด i ด้วยโปรแกรมแก้ไขข้อความ j ซึ่งเรียกว่า bytecode พบได้ที่ตอนต้น: invokespecial java/lang/Object/
astore_1 ก่อน aload_1 และสุดท้าย: เรียกใช้ java/lang/Object/
astore_1 จากนั้นบันทึกและตรวจสอบซึ่งสะดวกกว่ามาก เชค เชค เชค เชค เชค เชค เช ล เช ล เช ล เช ล เช ล เช ล เช ล เช ล เช ล เช ล เช ล เช ล —————————————— กระบวนการด�าเนินการพื้นฐานเป็นเช่นนี้ ท�าไมจึงต้องแก้ไขเช่นนี้? เรามาพูดถึงหลักการด้านล่างนี้กันดีกว่า ในฉัน เราเห็นวิธีนี้ใน java: public void a (กราฟิกกราฟิก, String string, int i1, int j1, int k1) {if (a! = null) {... graphics. setClip(i5, j5, k5 - i5, i6 - j5); กราฟิก DrawImage(a, i1 - (a[i4] & 255), j1 - a[i4] - b2, 20);}i1 += b1 + c;} กราฟิก setClip(i2, k2, i3, j3); return;} หมายเหตุ: เกมจำนวนมากใช้วิธี public void a (กราฟิกกราฟิก, String string, int i1, int j1, int k1...) เพื่อวาดสตริง ในส่วน if เราเห็นวิธี setClip สำหรับการตัดภาพ หลักการของวิธี setClip คือการแสดงเนื้อหาเพียงบางส่วนบนหน้าจอ เพื่อให้เนื้อหาของรูปภาพที่อยู่ในส่วนนั้นปรากฏทุกประการ DrawImage เป็นวิธีที่ใช้ในการวาดภาพที่ระบุ เป็นเรื่องง่ายที่จะจินตนาการว่าวิธีการใน if ใช้เพื่อแสดงคำที่เป็นรูปภาพ กราฟิก. setFont(a); int j2 = กราฟิก getColor();if (a){......graphics. เซ็ตสี(ข); กราฟิก DrawString(สตริง, i1, j1 - 1, k1); กราฟิก DrawString(สตริง, i1 - 1, j1, k1); กราฟิก DrawString(สตริง, i1 + 1, j1, k1); กราฟิก DrawString(string, i1, j1 + 1, k1);} กราฟิก setColor (ก); กราฟิก DrawString(สตริง, i1, j1, k1); กราฟิก setColor(j2);} หมายเหตุ: ส่วนที่อยู่ใต้ if เป็นส่วนสำคัญ เราได้เห็นเมธอด DrawString สำหรับการวาดสตริงแล้ว ดังนั้นเราจึงรู้ว่าสิ่งที่เราต้องทำคือการทำให้เมธอดนี้ไม่ดำเนินการส่วนที่อยู่ภายใน if แต่ไปที่ส่วนคำของระบบด้านล่างโดยตรง จากนั้นดูที่จุดเริ่มต้น if (a! = null) เราจะเห็นว่ามันถูกตัดสินโดยการตัดสินตัวแปร a และตัวแปรนี้ถูกกำหนดไว้ที่ไหน ก่อนหน้านี้ เราได้พูดถึงวิธี public c (Image image, DataInputStreamdatainputstream, Font Font, int i, int j) เราอาจตัดทอนและดูก็ได้ public i (Image image, DataInputStreamdataInputStream, Font แบบอักษร int i1, int j1) {int k; int j2; if (image ! = null) {a = image;ข = เจ1; ก = j1! = -1; } หมายเหตุ: คุณจะเห็นว่าวิธีนี้เกี่ยวข้องกับตัวแปร a และความรับผิดชอบของตัวแปรนี้คือการพิจารณาว่าปริมาณรูปภาพเป็นโมฆะหรือไม่ จากนั้นฉันก็เห็น a = font ในอันอื่น; ประโยคนี้หมายถึงการกำหนดจำนวนแบบอักษรให้กับ (ตัวแปรแบบอักษร) ซึ่งสามารถเข้าใจได้ว่าเป็นการกำหนดแบบอักษรของระบบให้กับ a ดังนั้นเราจึงหวังว่าจะพยายามทำให้วิธีนี้ดำเนินการอย่างอื่นเสมอ เพื่อให้เราสามารถเพิ่ม image = null ก่อน if (image ! = null); ด้วยวิธีนี้ ค่าของรูปภาพจะเป็นโมฆะในตอนเริ่มต้น และส่วนอื่นในนั้นจะถูกดำเนินการ ใน bytecode: aload_1ifnull Label216 สอดคล้องกับ if (image! = null) (เนื่องจากเครื่องมือนี้ การปรับเปลี่ยนตำแหน่งบนโทรศัพท์มือถือจึงยากกว่าบนคอมพิวเตอร์) aload_1 คือการโหลดออบเจ็กต์แรก (1) ที่อ้างอิงโดยตัวแปรโลคัลแล้วดันไปที่สแต็ก ตัวแปรท้องถิ่นตัวแรกสอดคล้องกับรูปภาพในตำแหน่งแรกของชื่อวิธีการ เพิ่ม image=null ที่นี่เพื่อสร้างจำนวนว่างสำหรับรูปภาพ aconst_nullastore_1 หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับหลักการนี้ คุณสามารถดูที่ Java Bytecode Revealed ควรสังเกตว่า "1" ใน astore_1 ขึ้นอยู่กับ if ก่อนหน้า (image ! = null) เราเห็นว่าบรรทัดที่สามคือ aload_1 นี่คือ 1 ดังนั้น astore_1 ก็ต้องเป็น 1 เช่นกัน ในทางกลับกัน หากเป็น aload_2 ก็ควรเป็น astore_2 ไปเรื่อยๆ aconst_null
astore_1 ส่วนของโค้ดนี้ค่อนข้างเป็นกลไก ดังนั้นคุณจึงจำได้ เกมที่ผลิตโดย Digital Chocolate ค่อนข้างคงที่ และทุกคนที่ต้องการแปลเกมของตนควรแก้ไขด้วยวิธีนี้ การปรับเปลี่ยนเกมของ DC นั้นเป็นพื้นฐานของการปรับเปลี่ยนเกมหลายๆ อย่าง ดังนั้นจึงขอแนะนำให้ทุกคนเชี่ยวชาญอย่างถี่ถ้วน เกมจากผู้ผลิตรายอื่นไม่ใช่เรื่องง่าย และแม้แต่เกมจากผู้ผลิตรายเดียวกันก็อาจมีวิธีการแก้ไขที่แตกต่างกัน สิ่งที่จำเป็นคือการเรียนรู้และฝึกฝนอย่างต่อเนื่อง การสั่งสมประสบการณ์ และทำให้ความเข้าใจ Java ลึกซึ้งยิ่งขึ้น
ー̷̷̷̷̷̷̷̷̮̮̮̮́ ข้อความของเกม Digital Chocolate เวอร์ชันภาษาจีน หลังจากเปลี่ยนอักขระรูปภาพเป็นอักขระระบบเรียบร้อยแล้ว คุณสามารถทำให้ข้อความเป็นภาษาจีนได้โดยตรง ไฟล์ภาษาโดยทั่วไปคือ l0_0, l0_1, l0_2 และอื่นๆ ใน "My Pet Store" โดยทั่วไปให้เลือกภาษาจีน l0_0 (ภาษาอังกฤษ) ใช้ปลั๊กอินในโฟลเดอร์ SUMEA ในเครื่องมือคอมพิวเตอร์ Halo เพื่อเปิดและแก้ไขโดยตรง บนโทรศัพท์มือถือคุณต้องใช้เลขฐานสิบหก เปิด l0_0 เป็นเลขฐานสิบหก 00 00 3c 75 หมายถึงจำนวนไบต์ทั้งหมด 15477, 00 00 01 6c หมายถึงจำนวนไบต์เริ่มต้นทั้งหมด 364, 00 00 05 b8, 00 00 05 c1... หมายถึงฟิลด์เริ่มต้นไบต์ ไบต์เริ่มต้นของฟิลด์คืออะไร? ปุ่มซอฟท์คีย์ซ้าย - แก้ไข - ไปที่ที่อยู่ป้อนที่อยู่ 0x5b8 หรือทศนิยม 1464 หลังจากยืนยันคุณจะพบว่ามันไปที่หมายเลขไบต์ 00 06 ของภาษาอังกฤษ จากนั้นป้อน 0x5c1 ตัวที่สองเพื่อไปที่ 00 02 ของ Ok ด้านล่าง แต่ละไบต์เริ่มต้นจะสอดคล้องกับฟิลด์ต่อไปนี้ตามลำดับ พูดตรงๆ 5b8 คือจำนวนไบต์ทั้งหมดก่อน 00 06 จำนวนไบต์จะเปลี่ยนไปเมื่อเราแปลเป็นภาษาท้องถิ่น และจำเป็นต้องแก้ไขสิ่งเหล่านี้ ซึ่งค่อนข้างซับซ้อนและลำบาก