ไปที่เนื้อหา


รูปภาพ

อยากทราบวิธีใช้ Hex Editer


  • กรุณาลงชื่อเข้าใช้เพื่อตอบกระทู้
มี 20 โพสต์ตอบกลับกระทู้นี้

#1 AunezS

AunezS

    ซุนจ้ง

  • Members
  • 28 โพสต์

โพสต์เมื่อ 16 September 2007 - 09:54:32 PM

คืออย่างที่หัวข้อกระทู้บอกแหละครับผม อยากทราบว่าจะต้องไปแก้ตรงไหนให้สามารถเปิดเกมได้ 2 จอครับ
กรณีนี้ผมต้องการเปิดเกม O2jam ให้ได้ 2 จออะคับ

http://upload.mthai....i=46ed43f36b6dc

คือผมสงสัยว่าอาจจะต้องแก้จากไฟล์นี้(รึเปล่า)

#2 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 18 September 2007 - 12:20:05 AM

(AunezS @ Sep 16 2007, 09:54 PM) ดูโพสต์

คืออย่างที่หัวข้อกระทู้บอกแหละครับผม อยากทราบว่าจะต้องไปแก้ตรงไหนให้สามารถเปิดเกมได้ 2 จอครับ
กรณีนี้ผมต้องการเปิดเกม O2jam ให้ได้ 2 จออะคับ

http://upload.mthai....i=46ed43f36b6dc

คือผมสงสัยว่าอาจจะต้องแก้จากไฟล์นี้(รึเปล่า)


พอดีลองไปเล่นคาบาล(จะเรียกว่าลองหรือเปล่าไม่รู้ 99 แระ)
เห็นชื่อ xcross แวบๆ อยู่กิลด์ฺ issue ไม่รู้จะคนเดียวกันป่าว ทำให้นึกถึงบอร์ดนี้ขี้นมา
แต่แหม แวะมาดู เงียบสนิทเลย น่าจะมีคนมาเขย่าๆ มั่งนะ

พอดีอีกเหมือนกัน ผมเพิ่งทำสองหน้าจอไปสองเกม

ที่ถามมาก็เข้าใจถูกส่วนนึงครับ
ถูกที่ว่า ใช้ hex editor แก้

แต่ปัญหาใหญ่อยู่ที่ว่า เราจะแก้ตำแหน่งไหน นี่สิครับ

ปัญหาแรก ไฟล์เป้าหมาย
ไฟล์ไหนหล่ะที่เราต้องแก้
ปรกติก็เป็นไฟล์หลักที่ใช้เล่น ไม่ใช่ไฟล์แรกที่รันนะครับ
เดี๊ยวนี้ส่วนใหญ่ไฟล์แรกที่รันจะเป็นเพียง patcher หรือ loader
วิธีง่ายๆ ที่จะรู้ว่าไฟล์ไหนเป็นไฟล์หลัก ตอนเล่นเกม ก็ดู process ใน Windows Task Manager
(เอาคร่าวๆ เพื่อวัดความรู้ของคนที่คิดจะทำ เพราะถ้าทำขั้นตอนนี้ไม่เป็น ขั้นตอนต่อไปทำไม่เป็นแน่ๆ)

ปัญหาต่อไป ไฟล์เป้าหมายสามารถรันด้วยตัวมันเองไหม
บางเกมมันจะมีส่วนที่ตรวจสอบว่าเราได้รันเกมผ่าน patcher หรือ loader หรือเปล่า ถ้าไม่ มันจะรันให้เอง - -*
และมันจะสร้างปัญหาให้เรา เพราะบางเกม มันจะตรวจสอบว่าไฟล์เป้าหมายของเราถูกแก้หรือเปล่า
ถ้าถูกแก้ ไฟล์เป้าหมายก็จะถูกแพทซ์ใหม่ นั่นก็หมายถึง ทำ 2 จอไม่ได้

ถ้าเป็นดังนั้น ก็ต้องทำ bypass หรือที่เขาเรียกกันทั่วไป คือ ข้ามแพทซ์ โดยใช้ debugger

ปัญหาต่อไป ไฟล์เป้าหมายถูกป้องกันการ ดีบักหรือถูก pack หรือเปล่า
เท่าที่เจอมา อัตราส่วนน่าจะอยู่ที่ 70/30 คือ 30 ไม่ได้ป้องกัน แ่ต่ข่าวร้ายก็คือ อัตราส่วนนี้ลดน้อยลงทุกวัน
แต่เกมใหม่อย่าง eco ไม่ป้องกันแฮะ ก็เลยไม่สร้างปัญหาเท่าไหร่

แต่ถ้าถูกป้องกัน เราก็แก้ซะ ส่วนใหญ่ ก็ใช้ debugger หน่ะแหละ เพียงแค่ศึกษา กันตรงไหน ก็แก้ตรงนั้น
อย่างเกม domo ถูก pack โดย asprotect เราก็ต้องศึกษาวิธีว่าต้อง unpack อย่างไร
แต่พอดีว่าเกมนี้ ไม่ได้ป้องกันสองจอ ก็เอาเป็นว่า เอาไว้แกะ ทำบอทละกัน

ปัญหาต่อไป ไฟล์เป้าหมาย ใช้อะไร ตรวจสอบว่า มีเกมเดียวกันรันอยู่แล้ว
ใช้ tool ต่างๆ ที่ใช้ดูว่า ไฟล์เป้าหมาย เรียกใช้ api อะไรบ้าง
แล้วเราค่อยดูว่า มี api ไหน ที่สามารถใช้ตรวจสอบจุดนี้ได้บ้าง
เช่น FindWindow() เป็นต้น
จากนั้นจึงใช้ debugger เซต break point ที่ api ดังกล่าว
แล้วลอง redirect ดู
ประมาณว่าของเดิม

cmp xx,xx
jnz xx

เราก็แก้ใหม่ เป็น

cmp xx,xx
jmp xx

แต่บางเกมนะ ไม่ต้องไปแก้อะไรเลย แค่เปลี่ยนชื่อ
เช่นของเดิม xxx.exe เราก็เปลี่ยนเป็น xxx01.exe แล้วกอปอีกไฟล์ เป็นชื่อ xxx02.exe
แล้วรัน เจ้า 1 กะ 2 ก็เป็นสองหน้าจอแล้ว

ปัญหาต่อไป เกมเป้าหมาย มีการใช้บริการ พวกโปรป้องกัน อย่าง x-trap อะไรพวกนั้นหรือเปล่า
เพราะบางเกม ตัวที่กันการเปิดสองจอ ก็คือโปรพวกนี้
ฉะนั้้นก็คงจำเป็นต้อง bypass โปรพวกนี้ซะ (พูดง่ายแต่ทำยากนา ไม่งั้นเค้าไม่กล้าทำขายหรอก)

แต่ละเกมก็มีรายละเอียดปลีกย่อยต่างๆ กันไป หรือเหมือนกันเลยก็มี ก็อยู่ที่เรา ที่ต้องศึกษาให้เข้าใจ
อย่าง คาบาล ก็น่าสนใจ เพราะใช้ถึง 3 ไฟล์
cabal.exe, update.exe, cabalmain.exe
และต้องใช้ครบทุกวิธีที่ว่ามาเลยแหละ

ไฟล์เป้าหมาย ก็คือ cabalmain.exe
cabal.exe เป็นเพียง loader
update.exe ก็ตามชื่อ pack ด้วย aspack (unpack ไม่ยาก ไม่รู้อะไรดลใจคนทำให้เลือกตัวนี้)
ทุกครั้ง เราจะรันผ่าน cabal.exe
ตัวกันสองจอ อยู่ที x-trap
เพราะผมลองทำสองชุด คือ
cabal01.exe, update01.exe, cabalmain01.exe
cabal02.exe, update02.exe, cabalmain02.exe
(ไม่ใช่แค่กอปมาแล้วเปลี่ยนชื่อนะ ต้อง bypass หลายขั้นตอนอยู่ ไม่งั้น cabalxx.exe มันก็เรียก update.exe ทุกทีสิ)
ก็ปรากฏว่า ทั้ง 01 02 รันได้ แต่พอถึงจุดที่โหลด x-trap ก็จะโดนปิด
พอไปดูโฟลเดอร์ xtrap ในคาบาล ก็ถึงบางอ้อ เพราะพี่ท่านมาพร้อมกับ psapi.dll

ร่ายมาซะยืดยาว แล้วมันเกี่ยวกะที่ถามไหมนี่
งั้นก็ขอสั้นๆ ว่า แค่ hex editor คงแก้ปัญหาของคุณไม่ได้ครับ

แล้ว hex editor มาเกี่ยวตอนไหน
ก็จากขั้นตอนที่ทำมา ทำให้เราได้ตำแหน่งไงครับ
คือตำแหน่งของคำสั่งที่ตรวจสอบ ซึ่งมันก็คือ เลขฐาน 16 ดีๆ นี่เอง
เช่น cmp xxx,xxx jnz xxxx มันก็คือ xx xx xx xx xx xx
พอเราเปลี่ยนเป็น cmp xxx,xxx jmp xxxx มันก็คือ xx xx xx xx xy xx
ปรกติเกมเดิม มันก็จะเป็นรูปแบบเดิม แม้ว่าจะแพทซ์ใหม่ ก็ตาม
ดังนั้นเมื่อเกมถูกแพทซ์ แทนที่จะต้องไปเริ่มหาใหม่ เราก็แค่ใช้ hex editor หา xx xx xx xx xx xx แล้วเปลี่ยน x เป็น y ก็จบ

เอาละ พอแระ เกี่ยวไม่เกี่ยว แค่แวะมาเขย่าบอร์ด คงไม่ว่ากัน laugh.gif laugh.gif laugh.gif

ปล.
คนที่ผ่านมา ไม่ต้องขอ สองจอ เกมที่ผมพาดพิงนะ ไม่แจกนะ
และไม่ต้องกังวลว่าจะเสียสมดุลในเกม เพราะผมเล่นไม่นาน แวะไปโกงแค่พอขำๆ
อย่างคาบาล ผมก็ไม่ค่อยเล่นละ
(แต่วันนี้ลองเข้าไป เกิดไอเดียอยากโกงคอมโบซะงั้น คงหนุกหนานเนอะถ้าทำได้ แต่คงโดนเพ่งเล็งหน้าดู)

ตอนนี้รอเกมใหม่ ค่ายเดียวกะเกมของเวปนี้ อาจได้มาช่วยกันโกงอีก เผื่อใครสนใจ
แต่พรุ่งนี้จะไปลองเล่น wmo ดู 2d ของชอบ

อ้อเพิ่งได้หนังสือมาเล่มนึง
"PROGRESS ON CRYPTOGRAPHY 25 Years of Cryptography in China"
แค่ชื่อก็เครียด ต่อไป เกมจีน อาจไม่หมูให้เราแกะละมั้งเนี่ย biggrin.gif

ชอบตอนนึง เขายกคำของอาจารย์มา
เห็นแล้วอยากเรียนกับอาจารย์ท่านนี้จัง อาจได้ดังระดับโลกอย่างกะเค้ามั่ง
แค่ได้อ่านท่อนนี้นะ มีสมาธิและมีใจอยากเรียนรู้อีกตั้งเยอะแหน่ะ ท่านว่า
only when you can stand on the top of the existing results,
just as you stand on the hightest peak to look at all the mountains,
can you figure out where to go next.

ท่านหมายถึงให้เราศึกษางานของคนอื่นให้แจ่มแจ้งก่อน
ซึ่งเหมือนเราพยามปีนป่ายไปสู่ยอดสูงสุดของภูเขาที่สูงที่สุด
เมื่อถึงจุดนั้นแล้ว พอเรามองลงมา เราก็สามารถเลือกได้ว่า จะไปที่ไหนโดยเส้นทางใดดี
(ตอนนี้ผมก็เลยศึกษาอัลกอริทึมต่างๆ อย่างเอาเป็นเอาตาย - -*)

พิมพ์ไปดูหนังไป หนังจบละ
งั้นก็ลาละกันวันนี้

#3 AunezS

AunezS

    ซุนจ้ง

  • Members
  • 28 โพสต์

โพสต์เมื่อ 18 September 2007 - 03:34:27 PM

O2jam เริ่มรันโดยใช้ O2JamLauncher.exe จากนั้นใส่ ID Pass ลงไปก็จะขึ้นหน้าต่างpatch ( O2JamPatchClient.exe ) พอกด Start ก็จะเข้าสู่ไฟล์OTwo.exe(ไฟล์ที่น่าจะใช้แก้)
ไฟล์ OTwo.exe ไม่สามารถรันเองโดยตรงได้ต้องผ่าน O2JamLauncher.exe มาก่อน(มั้ง)

---------------------------
[INFO]
---------------------------
Please try to run O2jam.exe.
---------------------------
OK
---------------------------

ท่าทางจะเกินความสามารถที่มีอยู่ตอนนี้ซ๊ะแล้วไว้รู้มากกว่านี้ค่อยทำแล้วกัน-.-
**หมายเหตุ : ใกล้ปิดเทอมละคับท่านเด่วจะแวะมาหาความรู้บ่อยๆ(ออกแนวอยากรู้ทุกเรื่อง5555)**

#4 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 18 September 2007 - 11:31:13 PM

วันนี้ไปลอง wmo มา
น่าผิดหวังมากมาย เทียบกะ ro ห่างกันหลายขุม(อาจมีคนแย้ง คนละแนว อย่าเทียบดิ เอาน่า ผมเทียบในแนวของผม)

วิธีลองเกมออนไลน์ ชอบไม่ชอบ เอาง่ายๆ
ลองไปเก็บเวลดู ถ้าเก็บไม่มัน ก็ยากที่จะเล่นนาน
ทำไม?
ก็เพราะเกมออนไลน์เราจะใช้เวลาส่วนใหญ่หมดไปกับการเก็บเลเวล
(แล้วอย่าไปเปรียบกับเกมที่ไม่มี หรือไม่เน้นเลเวลนะ)
ไงก็จะลองไปลองเล่นอีกที อาจเปลี่ยนใจก็ได้

อ้อลืมไป
ที่แวะมาก็เรื่องนี้แหละ พอดีนึกได้ ก็เลยลองทำดู (2 จอไง)
ไม่ท้าทายเท่าไหร่ เกมนี้ไม่ได้ pack มา ก็เลยดีบักง่ายหน่อย

เขาใช้วิธีรันผ่านแพทซ์
แล้วตั้งชื่อตัวหลักเป็น xxx.bin (ป้องกันระดับนึงละ ไฟล์ .bin รันไม่ได้นิ)
ผมก็เลยลองเปลี่ยนเป็น xxx.exe ก็รันได้เป็นปรกติ ไม่มีปัญหา แถมไม่มีการตรวจสอบว่ารันผ่านแพทซ์หรือเปล่า
แต่เปิดสองจอไม่ได้ ก็เลยต้องหา ก็ได้โค้ดมาประมาณนี้

PUSH DWORD PTR SS:[ESP+4]                    ;lpName
PUSH 1                                                 ;bInitialOwner
PUSH 0                                                ;lpMutexAttributes
CALL DWORD PTR DS:[KERNEL32.CreateMutexA]     ;เรียกใช้ฟังก์ชัน
TEST EAX,EAX                                  ;ทดสอบค่าที่คืนกลับ ถ้าเป็น 0(null) ก็แสดงว่าเกิดการผิดพลาด
MOV DWORD PTR DS:[xxx8FC],EAX                                  ;เก็บค่าที่คืนกลับมา ไว้ก่อน
JE SHORT 004xxx971                                                                ;จบโปรแกรม
CALL DWORD PTR DS:[KERNEL32.GetLastError]        ;ตรวจสอบการทำงานล่าสุด
CMP EAX,0B7                                     ;ถ้าคืนกลับมาค่านี้ ก็แสดงว่ามีการรันโปรแกรมนี้อยู่แล้ว
JNZ SHORT 00xxx974                     ;ถ้ายังไม่ได้เปิด ก็รันต่อไป


วิธีแก้ก็ง่ายๆ เปลี่ยนบรรทัดสุดท้ายเป็น

JMP SHORT 00xxx974;เปิดไม่เปิดก็ช่างน่า รันต่อไป ช้านจะเอาหลายๆ จอ^^


อะไรประมาณนี้แหละ
พูดไปไม่เห็นตัวอย่าง เดี๋ยวคนเค้าจะหาว่าโม้
ถ้าเกมมันหนุกกว่านี้หน่อย คงทำโปรแต่งตัวละครออกมา
แต่จากที่ลอง คงไม่เสียเวลาไปทำมันละ

#5 AunezS

AunezS

    ซุนจ้ง

  • Members
  • 28 โพสต์

โพสต์เมื่อ 22 September 2007 - 05:54:33 PM

ตอนแรกผมก็เห็น WMO ดูๆแล้วตัวละครคล้าย TS มากเลย(มีความหวัง)ว่าจะได้เล่นเกมนี้แทนเกมTSซึ่งผมไม่มีตังเติมบัตร- -
แต่พอดูไปดูมาอ้าวมันคล้ายๆแรคนิหว่าแต่มันดูงงๆเลยไม่ได้เล่น(ยกเลิกการดาวน์โหลดระหว่างที่โหลดไปแล้ว60เปอร์เซน-.-)

หมายเหตุ : ท้อและความรู้ยังไม่ถึง(ไม่เคยDebug) ตอนรี้เวลาจะเล่น2ตัวเลยเปิด2เครื่องแทน

#6 cafe

cafe

    Exclusive Member

  • Exclusive Programmer
  • 10015 โพสต์

โพสต์เมื่อ 12 November 2007 - 06:53:58 PM

ท่าน AssertionFailed รบกวนถามหน่อยงับ จาก ตัวอย่าง แก้ เปิด 2 จอ WMO อ่าคับ ลองทำดู แล้วเปิดได้ จริง แต่ว่า ตอน ล๊อกอินเข้าเกม
มัน บอกว่า client version incorrent แสดงว่า มันมีการ check file version พร้อมกับส่งไป ตรวจที่ server รึป่าว คับ
หรือ ว่ามันน่าจะมีวิธีการอย่างไร ช่วยแนะนำหน่อยคับ

มือใหม่ debugger เหอๆ ^^"

WMO สนุกนะครับ ไม่น่าเบืออย่างที่คิด ตอนแรกความรู้สึกเดียวกับ หลายๆท่านคือ ลบตัว install ทิ้งเลย
แต่เพื่อนแนะนำให้ไปลองใหม่ ก็เลยลองดู พบว่ามันมีระบบหลายๆอย่างดีพอสมควร เล่นง่ายๆ เพลินเลย เก็บเวลสุดง่ายมี hero ให้ไม่ต้องใช้บอท ในความรู้สึกผมเหมือนมันเก็บเอาจุดเด่นของหลายๆเกมดีๆ มารวมกันไว้ เล่นๆไปได้อารมณ์ TS + Rag + ..... ^^


แต่อย่างไรก็ตามก็ อยู่ที่ความชอบส่วนบุคคลเนอะ
ยังไงรบกวนแนะนำหน่อยนะครับ ขอบคุณคร้าบ


#7 JackY

JackY

    หนี Microsoft ไม่พ้นซักทีเรา

  • Exclusive Programmer
  • 10072 โพสต์
  • Location:ซอกเล็กๆในหัวใจเธอ

โพสต์เมื่อ 13 November 2007 - 07:48:22 AM

รอ wonderland online อยู่ครับ บริษัทเดียวกะ TS สร้าง ได้อารมณ์แบบเก่า แถมตัวเกมมีบอทในตัวที่ดีกว่าบอทชิ้นใน TS แถมยังมี fan service ด้วยภาพต่างๆในเกมที่บางคนเห็นแล้วอาจจะนึกว่า "นี่มัน H เกมเป่าวะ" ด้วยน้า อิอิ

#8 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 13 November 2007 - 02:04:41 PM

ท่าน AssertionFailed รบกวนถามหน่อยงับ จาก ตัวอย่าง แก้ เปิด 2 จอ WMO อ่าคับ ลองทำดู แล้วเปิดได้ จริง แต่ว่า ตอน ล๊อกอินเข้าเกม
มัน บอกว่า client version incorrent แสดงว่า มันมีการ check file version พร้อมกับส่งไป ตรวจที่ server รึป่าว คับ
หรือ ว่ามันน่าจะมีวิธีการอย่างไร ช่วยแนะนำหน่อยคับ

มือใหม่ debugger เหอๆ ^^"

WMO สนุกนะครับ ไม่น่าเบืออย่างที่คิด ตอนแรกความรู้สึกเดียวกับ หลายๆท่านคือ ลบตัว install ทิ้งเลย
แต่เพื่อนแนะนำให้ไปลองใหม่ ก็เลยลองดู พบว่ามันมีระบบหลายๆอย่างดีพอสมควร เล่นง่ายๆ เพลินเลย เก็บเวลสุดง่ายมี hero ให้ไม่ต้องใช้บอท ในความรู้สึกผมเหมือนมันเก็บเอาจุดเด่นของหลายๆเกมดีๆ มารวมกันไว้ เล่นๆไปได้อารมณ์ TS + Rag + ..... ^^


แต่อย่างไรก็ตามก็ อยู่ที่ความชอบส่วนบุคคลเนอะ
ยังไงรบกวนแนะนำหน่อยนะครับ ขอบคุณคร้าบ


ผมก็เพิ่งรู้นะครับว่า แก้แ้ล้วลอกอินไม่ผ่าน
ตอนแก้ ก็แค่ลองเปิดสองจอดู ไม่ได้ทดสอบลอกอิน จากนั้นก็ลบทิ้ง

วิธีแก้คร่าวๆ จากง่ายไปยาก

อัพเดทเกมเป็นตัวล่าสุด แล้วค่อยแก้เป็นสองจอ ถ้าผ่านก็โอเค
ปัญหาสำหรับวิธีนี้ก็คือ ทุกครั้งที่เกมอัพเดท exe ใหม่ ก็ต้องมานั่งแก้ exe อีก
บางครั้งก็เลยมีการทำ patcher เพื่อความสะดวก
และบางครั้ง exe ใหม่ ก็ไม่ได้เปลี่ยนอะไรมาก ตัวเก่าตัวใหม่ ก็ใช้ร่วมกันได้
เช่นตัวเก่า แสดง exp เป็นตัวเลข ตัวเก่า แสดงเป็นแถบสี ไม่มีตัวเลข แต่เราชอบตัวเลขมากกว่า เลยอยากใช้ตัวเก่า
(อันนี้อ้างเหตุผลให้ดูดี จริงๆ แล้ว บางทีตัวเก่ามันมีบักที่โกงเกมได้ ก็เลยน่าใช้มากกว่า biggrin.gif )

วิธีต่อไป ถ้ามันมีการตรวจสอบเวอร์ชัน ก็แสดงว่า ตัองมีการเก็บตัวเลขแสดงเวอร์ชัน
ทางเลือกของเราก็คือ
---แก้เลขเวอร์ชันให้ตรงกัน
---แก้ส่วนที่ตรวจสอบว่าเวอร์ชันตรงกัน

บางเกมเก็บเลขเวอร์ชันไว้ในไฟล์ต่างหาก
บางครั้งก็แค่ text ไฟล์ธรรมดาๆ มีตัวเลขสองสามตัวเช่น 2.5
ฉะนั้นถ้าเราแก้ตัวเลขให้ตรง ก็ถือว่าผ่าน
แต่ถ้าไม่รู้ว่าตัวเลขใหม่ เป็นเลขอะไร ง่ายๆ ก็แค่อัพเดทเกมให้เป็นตัวล่าสุด แล้วกอป exe ตัวเก่ามาทับตัวใหม่

บางเกมอาจเก็บไว้ใน exe
บ้างก็เก็บเป็นเลขเวอร์ชันตรงๆ บ้างก็เก็บเป็นค่า checksum
ง่ายๆ ก็เอาตัวเก่า เทียบกับตัวใหม่ หาตำแหน่งที่เก็บ แล้วแก้

ยากไปอีก ตัวเกมทำการ hash ตัวมันเองทุกครั้ง หาค่า checksum
ถ้าไฟล์ตรงกัน ค่า checksum ต้องตรงกัน แล้วจึงขอค่า หรือ ส่งค่า checksum ไปตรวจสอบกับเซิฟเวอร์
ก่อนจะทำอะไรมากไปกว่านี้ ต้องแน่ใจว่าเขาใช้วิธีนี้
วิธีตรวจสอบก็คือ ใช้ hex editor เปิดไฟล์ หาส่วนที่เป็นข้อความใน exe แล้วลองแก้ดู
เช่นอาจจะเจอคำว่า WMO ก็แก้เป็น WXO อะไรประมาณนี้
การแก้ข้อความ ไม่มีผลกับตัวเกม แต่จะทำให้ค่า checksum เปลี่ยนไป
ถ้าแก้แล้ว ลอกอินไม่ผ่าน(ต้องแน่ใจนะว่าแก้ข้อความ ไม่ใช่แก้อย่างอื่น) ใช่เลยเขาใช้วิธีการ hash
สำหรับวิธี แก้ยากหน่อยเพราะมีหลายขั้นตอน และต้องเข้าใจโค้ดมากหน่อย
ก่อนอื่นต้องดูว่า การตรวจสอบนั้น เป็นวิธีไหน
---ขอค่า
---ส่งค่า

ขอค่า หมายถึง ส่งแพคเกจคำสั่งไปที่เซอร์เวอร์ ขอค่า checksum ปัจจุบัน
เพื่อเอามาเทียบ วิธีแก้ของเราก็คือ หาโค้ดส่วนที่ทำการเปรียบเทียบ แล้วแก้

ส่งค่า หมายถึง ส่งค่า checksum ไปเทียบกับเซิฟเวอร์
วิธีนี้นี่ยากหน่อย หลักการก็คือ หาค่า checksum ปัจจุบัน แล้วเปลี่ยนค่า
ที่ exe หาได้(ซึ่งมันไม่ตรง) ก่อนที่จะมีการส่งค่าไป ประมาณว่า

ตอนแรก
้checksum = Hash();
IsUpdate(checksum);

เราก็เปลี่ยนเป็น
checksum= Hash();
checksum= recent_checksum;
IsUpdate(checksum);

หลักการมันก็ง่ายๆ อย่างที่ผมว่ามานั่นแหละครับ
แต่ที่มันยากก็คือ เราอ่านโค้ดไม่ออก ไม่รู้อะไรเป็นอะไร เลยจับตันชนปลายไม่ถูก

ที่จริงอยากเอาตัวอย่างจากเกมโดยตรงมาตอบนะครับ คิดว่าน่าจะตรงประเด็นมากกว่า
แต่เสียดายผมลบทิ้งไปแล้ว เนื่องจากบริหารเนื้อที่ HDD ไม่ทัน

ส่วนเรื่องการเล่นเกม ผมเห็นด้วยครับ ที่ว่า มันเป็นความชอบส่วนบุคคล
อย่าง TS บ้างก็ไม่ยอมแตะ บ้างก็ไม่ยอมเลิก
ตอนนี้ผมก็ไม่ได้เล่นเกมอะไร สงสัยไฟสำหรับการเล่นเกมคงใกล้ดับ(คิดดูดิ เล่นแรคเถื่อนยังไม่มีปัญญาให้ 99)
แต่ก็เป็นอีกคนนึง ที่จะไปลอง Wonderland


#9 cafe

cafe

    Exclusive Member

  • Exclusive Programmer
  • 10015 โพสต์

โพสต์เมื่อ 13 November 2007 - 05:28:38 PM

(AssertionFailed @ Nov 13 2007, 02:04 PM) ดูโพสต์

ท่าน AssertionFailed รบกวนถามหน่อยงับ จาก ตัวอย่าง แก้ เปิด 2 จอ WMO อ่าคับ ลองทำดู แล้วเปิดได้ จริง แต่ว่า ตอน ล๊อกอินเข้าเกม
มัน บอกว่า client version incorrent แสดงว่า มันมีการ check file version พร้อมกับส่งไป ตรวจที่ server รึป่าว คับ
หรือ ว่ามันน่าจะมีวิธีการอย่างไร ช่วยแนะนำหน่อยคับ

มือใหม่ debugger เหอๆ ^^"

WMO สนุกนะครับ ไม่น่าเบืออย่างที่คิด ตอนแรกความรู้สึกเดียวกับ หลายๆท่านคือ ลบตัว install ทิ้งเลย
แต่เพื่อนแนะนำให้ไปลองใหม่ ก็เลยลองดู พบว่ามันมีระบบหลายๆอย่างดีพอสมควร เล่นง่ายๆ เพลินเลย เก็บเวลสุดง่ายมี hero ให้ไม่ต้องใช้บอท ในความรู้สึกผมเหมือนมันเก็บเอาจุดเด่นของหลายๆเกมดีๆ มารวมกันไว้ เล่นๆไปได้อารมณ์ TS + Rag + ..... ^^


แต่อย่างไรก็ตามก็ อยู่ที่ความชอบส่วนบุคคลเนอะ
ยังไงรบกวนแนะนำหน่อยนะครับ ขอบคุณคร้าบ


ผมก็เพิ่งรู้นะครับว่า แก้แ้ล้วลอกอินไม่ผ่าน
ตอนแก้ ก็แค่ลองเปิดสองจอดู ไม่ได้ทดสอบลอกอิน จากนั้นก็ลบทิ้ง

วิธีแก้คร่าวๆ จากง่ายไปยาก

อัพเดทเกมเป็นตัวล่าสุด แล้วค่อยแก้เป็นสองจอ ถ้าผ่านก็โอเค
ปัญหาสำหรับวิธีนี้ก็คือ ทุกครั้งที่เกมอัพเดท exe ใหม่ ก็ต้องมานั่งแก้ exe อีก
บางครั้งก็เลยมีการทำ patcher เพื่อความสะดวก
และบางครั้ง exe ใหม่ ก็ไม่ได้เปลี่ยนอะไรมาก ตัวเก่าตัวใหม่ ก็ใช้ร่วมกันได้
เช่นตัวเก่า แสดง exp เป็นตัวเลข ตัวเก่า แสดงเป็นแถบสี ไม่มีตัวเลข แต่เราชอบตัวเลขมากกว่า เลยอยากใช้ตัวเก่า
(อันนี้อ้างเหตุผลให้ดูดี จริงๆ แล้ว บางทีตัวเก่ามันมีบักที่โกงเกมได้ ก็เลยน่าใช้มากกว่า biggrin.gif )

วิธีต่อไป ถ้ามันมีการตรวจสอบเวอร์ชัน ก็แสดงว่า ตัองมีการเก็บตัวเลขแสดงเวอร์ชัน
ทางเลือกของเราก็คือ
---แก้เลขเวอร์ชันให้ตรงกัน
---แก้ส่วนที่ตรวจสอบว่าเวอร์ชันตรงกัน

บางเกมเก็บเลขเวอร์ชันไว้ในไฟล์ต่างหาก
บางครั้งก็แค่ text ไฟล์ธรรมดาๆ มีตัวเลขสองสามตัวเช่น 2.5
ฉะนั้นถ้าเราแก้ตัวเลขให้ตรง ก็ถือว่าผ่าน
แต่ถ้าไม่รู้ว่าตัวเลขใหม่ เป็นเลขอะไร ง่ายๆ ก็แค่อัพเดทเกมให้เป็นตัวล่าสุด แล้วกอป exe ตัวเก่ามาทับตัวใหม่

บางเกมอาจเก็บไว้ใน exe
บ้างก็เก็บเป็นเลขเวอร์ชันตรงๆ บ้างก็เก็บเป็นค่า checksum
ง่ายๆ ก็เอาตัวเก่า เทียบกับตัวใหม่ หาตำแหน่งที่เก็บ แล้วแก้

ยากไปอีก ตัวเกมทำการ hash ตัวมันเองทุกครั้ง หาค่า checksum
ถ้าไฟล์ตรงกัน ค่า checksum ต้องตรงกัน แล้วจึงขอค่า หรือ ส่งค่า checksum ไปตรวจสอบกับเซิฟเวอร์
ก่อนจะทำอะไรมากไปกว่านี้ ต้องแน่ใจว่าเขาใช้วิธีนี้
วิธีตรวจสอบก็คือ ใช้ hex editor เปิดไฟล์ หาส่วนที่เป็นข้อความใน exe แล้วลองแก้ดู
เช่นอาจจะเจอคำว่า WMO ก็แก้เป็น WXO อะไรประมาณนี้
การแก้ข้อความ ไม่มีผลกับตัวเกม แต่จะทำให้ค่า checksum เปลี่ยนไป
ถ้าแก้แล้ว ลอกอินไม่ผ่าน(ต้องแน่ใจนะว่าแก้ข้อความ ไม่ใช่แก้อย่างอื่น) ใช่เลยเขาใช้วิธีการ hash
สำหรับวิธี แก้ยากหน่อยเพราะมีหลายขั้นตอน และต้องเข้าใจโค้ดมากหน่อย
ก่อนอื่นต้องดูว่า การตรวจสอบนั้น เป็นวิธีไหน
---ขอค่า
---ส่งค่า

ขอค่า หมายถึง ส่งแพคเกจคำสั่งไปที่เซอร์เวอร์ ขอค่า checksum ปัจจุบัน
เพื่อเอามาเทียบ วิธีแก้ของเราก็คือ หาโค้ดส่วนที่ทำการเปรียบเทียบ แล้วแก้

ส่งค่า หมายถึง ส่งค่า checksum ไปเทียบกับเซิฟเวอร์
วิธีนี้นี่ยากหน่อย หลักการก็คือ หาค่า checksum ปัจจุบัน แล้วเปลี่ยนค่า
ที่ exe หาได้(ซึ่งมันไม่ตรง) ก่อนที่จะมีการส่งค่าไป ประมาณว่า

ตอนแรก
้checksum = Hash();
IsUpdate(checksum);

เราก็เปลี่ยนเป็น
checksum= Hash();
checksum= recent_checksum;
IsUpdate(checksum);

หลักการมันก็ง่ายๆ อย่างที่ผมว่ามานั่นแหละครับ
แต่ที่มันยากก็คือ เราอ่านโค้ดไม่ออก ไม่รู้อะไรเป็นอะไร เลยจับตันชนปลายไม่ถูก

ที่จริงอยากเอาตัวอย่างจากเกมโดยตรงมาตอบนะครับ คิดว่าน่าจะตรงประเด็นมากกว่า
แต่เสียดายผมลบทิ้งไปแล้ว เนื่องจากบริหารเนื้อที่ HDD ไม่ทัน

ส่วนเรื่องการเล่นเกม ผมเห็นด้วยครับ ที่ว่า มันเป็นความชอบส่วนบุคคล
อย่าง TS บ้างก็ไม่ยอมแตะ บ้างก็ไม่ยอมเลิก
ตอนนี้ผมก็ไม่ได้เล่นเกมอะไร สงสัยไฟสำหรับการเล่นเกมคงใกล้ดับ(คิดดูดิ เล่นแรคเถื่อนยังไม่มีปัญญาให้ 99)
แต่ก็เป็นอีกคนนึง ที่จะไปลอง Wonderland



^^ ขอบคุณมากงับเด็วกลับบ้านไปลองดูใหม่ อิอิ
เอ .. ถามนิดนึง เผื่อผมเข้าใจผิด
คือ ตอนที่เรา debug เจอ คำลั่งต่างๆ แล้ว เราทำการแก้ไข คำสั่งนั้น ๆให้ทำงานได้อย่างที่ต้องการ เช่นเดียวกับ
ในตัวอย่าง ที นี้ เราเห็นละว่า มันทำการเปลี่ยน address ไหน ใน exe
ผมก็เปิด exe ด้วย hex edit แล้ว แก้ ค่าใหม่ จาก XX เป้น YY ณ. address เป้าหมาย เสร็จก็ save as เป็นอีก file นึง
ก็ ได้ออกมาเป็น 108Online1.bin แล้ว จากนั้นก็ rename file เก่า เป็น 108Online.bin.bk แล้วถึง rename file ที่ เราทำมาใหม่
เป้น 108Online.bin แล้วก็ ทำการ รันปกติ ผลคือ รันได้ อย่างที่แจ้งอาการไป คือ เปิดได้แต่ติด check version

จากขั้นตอนทั้งหมดที่ผมเล่ามา ไม่รู้ว่ามันเป็นวิธี ที่ถูกต้องรึป่าว (เพิ่งเคยทำแบบนี้เป็นครั้งแรก - -')

ที นี้ผม อยากจะ ทำ breakpoint ตรงจุด ที่เป็นการ ส่งข้อมูลไปยัง server หรือ รับข้อมูลจาก server
ผมก็ลอง เซต breakpoint ในจุด ที่ access module winsock มันไม่ยอมหยุดให้ อ่าคับ
ตย. ใน จังหว่ะ ที่เรากด เลือก server ซึ่งเก็บค่าจาก wpe มันจะมี packet รับและส่งเกิดขึ้น
คำถามคือ เราควรจะ สังเกตุ code asm ส่วนไหนหรือมีวิธีการประมาณไหน เพื่อ ทำการ debug ใน จังหวะดังกล่าวว่า มัน ทำอะไรบ้าง หลังจาก รับ packet เข้ามาจนถึง เอา data ของเรา ส่งกลับไป << ประเด็นอยู่ตรงนี้แหละครับ
รบกวนแนะนำอีก รอบนะครับ ^^"


#10 cafe

cafe

    Exclusive Member

  • Exclusive Programmer
  • 10015 โพสต์

โพสต์เมื่อ 13 November 2007 - 08:17:42 PM

ท่าจะ hash file แฮะ ผมหา ascii ที่ ดูไม่กระทบไม่เจอ เลย ลงไปท้ายๆ file จะมี byte ที่เป็น 00 00 00 เต็มเลย เลยเลือกมา byte นึง
แก้ เป็น 0A แล้ว save รันใหม่

มาน อาการ เดียวกันเลยคับ


#11 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 13 November 2007 - 09:53:15 PM

ช่างโชคร้าย biggrin.gif

การเซฟไฟล์
สมัยก่อน ก็อาจทำอย่างนั้น เพราะดีบักเกอร์บางตัวไม่เอื้ออำนวย
เลยต้องจำแอดเดรส แล้วใช้ hex editor เป็นตัวแก้เพื่อเซฟไฟล์

แต่ถ้าเป็น OllyDbg สามารถแก้และเซฟได้เลยนะครับ
แก้ด้วยคำสั่ง Assemble (สามารถเลือก โดยคลิกขวา/ดับเบิ้ลคลิกที่บรรทัดโดยตรง/กด space bar)
ถ้าจะเซฟก็คลิกขวา เลือก copy to executable->selection/all modifications
แล้วจะมีหน้าต่างใหม่ คลิกขวา เลือก save file

ที นี้ผม อยากจะ ทำ breakpoint ตรงจุด ที่เป็นการ ส่งข้อมูลไปยัง server หรือ รับข้อมูลจาก server
ผมก็ลอง เซต breakpoint ในจุด ที่ access module winsock มันไม่ยอมหยุดให้ อ่าคับ
ตย. ใน จังหว่ะ ที่เรากด เลือก server ซึ่งเก็บค่าจาก wpe มันจะมี packet รับและส่งเกิดขึ้น
คำถามคือ เราควรจะ สังเกตุ code asm ส่วนไหนหรือมีวิธีการประมาณไหน เพื่อ ทำการ debug ใน จังหวะดังกล่าวว่า มัน ทำอะไรบ้าง หลังจาก รับ packet เข้ามาจนถึง เอา data ของเรา ส่งกลับไป << ประเด็นอยู่ตรงนี้แหละครับ

คิดเหมือนผมเลยครับ สมัยเริ่มใช้ดีบักเกอร์ เพื่อแกะแพคเกท
แทนที่จะต้องมาเดา เราก็เลือกเซต BP สักที่นึง เพื่อไล่โค้ดหาจุดที่มันทำการเ้ข้ารหัส
จุดแรกที่ผมคิดว่าคุณหรือใครหลายๆคน ก็คิดเหมือนผมก็คือ send()/recv()

สำหรับ OllyDbg สามารถคลิกขวา เลือก search for->all intermodulars calls

อย่าง TS ถ้าใช้วิธีนี้ จะเห็น send() อยู่สองที่ ผมก็เลือกเซต BP ทั้งสองที่ แล้วลองรันเกมดู
ครั้งแรก ตอนเลือกเซิฟเวอร์ มันก็เด้ง ก็กดรันผ่านไป
ต่อไปป้อน user/pass แล้วลอกอิน มันก็เด้งอีก ทีนี้ก็เริ่มอ่านโด้ดได้เลย
ถ้า dump หน่วยความจำที่เป็นอาร์กิวเม้นท์ของ send() ( แอดเดรสที่เก็บใน EBX) คุณก็จะเห็น แพคเกทลอกอิน
ในหน้าต่าง hex dump

ถ้าเลือกเซตที่ send()
เราก็ต้องอ่านโค้ดย้อนหลังไปเรื่อยๆ จนกว่าจะเจอส่วนที่ทำการเข้ารหัสแพคเกท

ถ้าเลือกเซตที่ recv()
ก็อ่านไปข้างหน้าเรื่อยๆ จนกว่าจะเจอ

ผมว่าใช้ send() น่าจะง่าย ตรงที่เรารู้ค่าที่เราป้อน (user/pass)
IDA ก็ช่วยได้มากนะผมว่า ช่วยให้ดูโครงสร้าง/เส้นทางการรันโปรแกรมได้ง่ายดี

ตอนแรกว่าจะยกตัวอย่าง GECrazy
พอดีเพื่อนเอามาให้แกะ คือ ของฟรี เขามีลิมิต เป้าหมายก็คือ ให้ใช้แบบไม่มีลิมิต
ใช้ความเป็นเพื่อนให้เราแกะฟรี แล้วพี่แกกะเอาไปทำกำไร ก็เลยบอกไปว่า ยาก ทำไม่ได้ จบ

ส่วนตัวผมก็ติดหนี้คุณกิ๊กนะนี่
สมัยเล่นทีเอสมาเลย์ ก็อาศัยบอทกะชุดที่ตีมาให้ อ้อ เพื่อนยังเคยเอาตัวของคุณกิ๊ก(หรือคุณโย?)มาช่วยผมทำเควส
ก็ถือว่าเป็นความสุขช่วงนึงในชีวิตอ่ะนะ
แม้จะผิดหวังหน่อยตอนเพื่อนในเกมมาช่วยทำเควสนี่แหละ
แรกๆ ก็สงสัยนิดๆ ทำไมใจดีจัง ทุ่มสุดตัวช่วยทำเควส
พอทำเควสจบก็ถึงบางอ้อ พี่ท่านกะจะยึดบัตรแลกเยามาร
โชคดีหรือร้ายไม่ทราบ ทำสองตัว ได้เยาจิตทั้งคู่


#12 cafe

cafe

    Exclusive Member

  • Exclusive Programmer
  • 10015 โพสต์

โพสต์เมื่อ 14 November 2007 - 12:35:22 AM

เอ๋.... ครายกันหว่า เล่น ts มาเลย์ แถมให้ยืมตัวด้วย ???? ฉงฉัยนะเนี่ย ^^"

ช่างโชคร้าย สุดๆ สำหรับการเล่นกับ เปิด 2 จอ WMO อ่ะ ม่ายรู้จะ คิดยังไงต่อ เหอๆ
คือ ณ ตอนนี้ สิ่งที่ ทดสอบและทำได้ พบว่า มีมีการ hash file เป็น packet นึง (ยาวๆ ) ok ได้คำตอบสำหรับ การทดลอง

1 . เริ่มจาก ทำการ modify exe ด้วยวิธี แบบ บ้านๆ (ก็นู๋ม่ายรู้นี่นาว่าเค้าทำกันยังไง) แหะๆ ตอนนี้ มี client 2 ตัว คือ version จิง กับ version mo ผมเรียกว่า c1 กับ c2 ละกัน
2. ทำการ ดัก packet เพื่อ ดู ความแตกต่างระหว่าง 2 client ที่มี

ผลการทดลอง c1 จะส่ง packet เข้าใจว่าเป้น hash code ไปยัง server เหมือนกันทุกครั้ง
c2 ก็ เช่นกัน แต่ 2 packet จาก c1 และ c2 ต่างกัน สรุปได้โดยง่ายว่า packet นี้คือ hash code จิงๆนั่นแหละ

3 . ในเมื่อ module ในการ hash มันยากเย็น แสนเข็น เท่าที่ ได้ลอง มั่วๆดูและเข้าใจว่า น่าจะดู code asm ไม่ผิดที่ เลยตัดสินใจง่ายๆ
คือ ไม่แกะแล้ว hash ยังไงช่างมัน เอา ผลลัพธ์ เลยดีกว่า เลยทำการ สร้าง filter จาก WPE เพื่อทำการ แปลง packet ที่มี hash
code ดังกล่าว ของ c2 ให้ เหมือนกับ c1 (โดยข้อสันนิญาน ที่ว่า หลอก server ว่า โปรแกรมรันจาก c1 นั่นเอง )
ผลการทดลอง เมื่อทำการ log ดู packet ที่ c2 ผ่านการ filter แล้วและส่งไปยัง server ปรากฏว่า เหมือน กับ ของ c1 เกือบ 100%
ยกเว้น 4 byte หลัก ที่มี การ เปลี่ยนแปลง ทุกครั้งที่ ส่ง packet ไปยัง server (ส่วนนี้ สำหรับ WMO จะมี packet นึงยาว 8 bytes
ส่งมาก่อน ทุกครั้งก่อน client จะทำการ ส่ง packet กลับ และ data ที่ ส่งมาถูกนำไปทำ hashing เพื่อให้ได้ ค่า ค่า ยาว 4 byte ซึ่ง
เป้นค่า ตายตัว เช่น ถ้า server ส่ง X มา client จะ hash(X) เป็นต้น ) เอาหล่ะ ต่อๆ หลังจากที่ ทำการ โม packet เสร็จ c2 ก็ส่งไปให้
server เสมือนว่า ตัวเอง เป้น c1 แต่ ......... ไม่รู้ว่า เกิดอะไรขึ้น server ไม่ยอมรับ packet ของ c2 และไม่ตอบกลับ ... ????

ทั้งๆ ที่ data ที่สำคัญเท่าที่มองดู ด้วยตาปล่าว ถูกต้อง เหมือนกัน เป๊ะๆ จิงๆแล้ว server ไม่น่าจะรู้ ว่า นี่ไม่ใช่ c1 ตอนนี้ บอกตรงๆ ว่า
เกือบหมดมุขละ ไม่เข้าใจ จิงๆ ว่า มันรู้ได้ยังไง

4 . สุดท้าย ยอมแพ้ 5555 ไม่ไหว เปลี่ยนแนวทางมาทำ patcher เอาไว้ load assembly มาแล้ว fix address เอา ซึ่ง น่าจะแก้ปัญหาได้ เพราะลอง execute จาก OllyDbg มันสามารถ รันได้ แต่ทีนี้ ปัญหาเกิด ... แล้วเค้าใช้วิธี run assembly ใน memory ยังไงกันเนี่ย เหอๆ เมื่อก่อนเคยมี code อยู่ แต่ hhd พังไปแล้ว และก็ไม่เคยดู ลายละเอียดซะด้วย เลยนั่งโง่ งมเป็นไก่หา อะไรซักอย่าง @_@"


ก็ ถ้าท่าน AssertionFailed จะกรุณาแนะนำอีก ครั้งจะเป็นพระคุณอย่างสูงเยย (ถึงไม่ได้เอามาแก้ปัญหานี้ก็ ถือว่าเอาเป้นความรู้ติดหัวไว้หน่อยอ่าคับ ) ขอบคุณมากๆๆ



#13 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 16 November 2007 - 04:44:41 PM

นั่งศึกษาวิธี rip dvd เป็น xvid (ก่อนหน้าเคยใช้ divx) อยู่สามวัน ทำเอามึน
แต่ยิ่งอ่านก็ยิ่งมัน สิ่งนึงนำไปสู่สิ่งนึง
แบบว่าขึ้สงสัย เห็นออฟชันแต่ละตัว ก็ต้องขุด มาได้ไง เอาไว้ทำอะไร เซตแล้วได้อะไร ควรเซตอย่างไร
เป้าหมายก็เพื่อ ให้ได้ไฟล์เล็กสุดๆ แต่คุณภาพก็ต้องดีสุดๆ (มันขัดแย้งกันน่าดู) และควรจะเล่นกับเครื่องเล่นได้
เคยใช้ tool แพงๆ (แต่ไม่ได้ซื้อของเค้า tongue.gif ) ภาพที่ได้ก็ยังไม่ถูกใจ มี box/snow มากไป (อาจเพราะไม่ได้เซตให้ดีพอ)
คราวนี้ใช้แต่ freeware ล้วนๆ ปรากฏว่าใช้ tool ต่างๆ 10 กว่าตัว เซตกันระนาว แถมมี script อีก
แต่สุดท้ายก็ได้ภาพเสียง และแน่นอน ขนาด(น่าจะบีบเหลือ 2/7 ของต้นฉบับ) ออกมาเป็นที่น่าพอใจ
ตอนนี้ก็เลยเคลียร์ hdd ได้ตั้งเยอะ

กลับมาที่เรื่องนี้กันต่อ
เห็นท่าน cafe กำลังทำเรื่องนี้ ก็ทำเอาผมอยากรู้อยากเห็นไปด้วย
และมันก็ทำให้ผมตัดสินใจผิดอีกครั้ง ทำไม?
คำตอบก็คือ ปรกติผมจะเก็บตัว client ไว้เสมอ เพราะรู้นิสัยตัวเอง วันดีคืนดีเกิดมีไอเดีย ก็จะกลับมาลองแก้ไขเกมนั้นๆ อีก
และมันก็จริง ผมมักจะลบๆ ลงๆ เกมเดิมๆ อยู่บ่อยครั้ง
แต่เกมนี้(WMO) ก่อนลบ ผมตัดสินใจแล้วนะว่า ไม่มีทางที่จะกลับมาทำอะไรกับเกมนี้อีก
แต่สุดท้าย...
ก็ต้องมาดาวน์โหลดมันอีกรอบ laugh.gif laugh.gif laugh.gif

แต่อย่าหวังอะไรมาก
ก็อย่างที่ท่านว่า ผมศึกษาเรื่องเหล่านี้แค่พอมีความรู้ติดหัว (ใจจริงก็อยากเซียนนะ แต่คงต้องใช้เวลาอีกนานอยู่)

ดูจากข้อ 3 ผมกลัวเขาจะ hash packet โดยมี key (แต่ถ้า packet นี้เหมือนกันทุกครั้ง ก็คงไม่อยู่ในประเด็นตรงนี้)
//แบบที่ 1 : ตัว checksum ของแต่ละแพคเกทแยกต่างหากจากตัว data
data=CheckVersion(checksum);//checksum ในที่นี้คือค่าที่ได้จากการ hash ตัว exe
header=hash(key,data);// header คือค่า checksum ของแต่ละแพคเกท
packet=header+data;
Send(packet);

//แบบที่ 2 : เข้ารหัสรวมกันเป็นค่าเดียว
data = CheckVersion(chechsum);
packet=Encrypt(key,data);
Send(packet);

จากที่คุณบอกว่ามี 4 ไบต์ต่างกันทุกครั้ง มันก็มีโอกาสที่จะเป็นได้ ทั้ง 1 และ 2 หรือ ทั้งสองรวมกัน
ถ้าเป็นดังว่า การใช้ filter โอกาสผ่าน คงยากเพราะมัึนจะติดตรง key นี่แหละ

เนื่องจากมันเป็นแค่การเดา ยิ่งถ้าเดาบนพื้นฐานข้อมูลที่ผิด(หรือเข้าใจข้อมูลผิดเอง) โอกาสถูกคงไม่มี
ฉะนั้นผมไม่ขอสาธยายมากไปกว่านี้(อายเค้า)
เอาไว้โหลดเสร็จแล้วลอง ได้ผลอย่างไรค่อยมาว่ากันอีกที
(แต่ถ้าท่านคิดได้ ก็ยอกกันหน่อยนะ biggrin.gif อยากได้เ็ป็นความรู้ติดหัวเหมือนกัน)



#14 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 17 November 2007 - 07:12:42 PM

ทำได้ละ laugh.gif laugh.gif laugh.gif
พยายามหาวิธีที่ง่ายที่สุด และแก้ตัว client ให้น้อยที่สุด
ตอนแรกลองทำ proxy dll ตัว kernel32.dll (ไม่ผิดกฏมั้ง tongue.gif ไม่ได้แก้ client นิ)
แ่ต่ดูเหมือนมันจะบังคับใช้ของระบบโดยตรง เวลาให้คนอื่นเอาไปใช้คงลำบาก เลยไม่เอาดีกว่า

เลยกลับมาลองคิด ณ จุดเริ่มต้นอีกที
ถ้ามัน hash ทุกครั้ง นั่นก็หมายความว่า ค่าที่ส่งให้ hash function ก็ควรจะเป็นชื่อไฟล์ ประมาณว่า
้checksum=Hash(filename);

ปัญหาของเราก็คือ filename ได้มาอย่างไร
และแล้วผมก็ได้คำตอบ คือ มันเรียกใช้ GetModuleFileName()
เพียงเท่านี้ก็พอที่หาทางออกได้หลายแนวทาง

ยกตัวอย่างเช่น ใช้วิธี code injection
filename ก็คือ ชื่อไฟล์ที่เรารัน ถ้าเป็นปรกติก็คือ 108Online.bin
ได้โค้ดประมาณว่า
filename=GetModuleFileName();
checksum=Hash(filename);

ถ้าเราสำรองไฟล์ไว้ สองไฟล์ คือ
108Online.bin //ไฟล์ต้นฉบับ เอาไว้หลอก Hash()
108OnlinX.bin //ไฟล์ที่เราใช้รัน และแก้ให้รันมากกว่าหนึ่งหน้าต่าง

เราก็แก้โค้ดใหม่ประมาณว่า
finlename=GetModuleFileName(); //filename ตอนนี้เท่ากับ 108OnlinX.bin
filename="108Online.com"; //โค้ดที่เราแทรกเข้าไป
checksum=Hash(filename);

หลังจากทดลองแล้ว ใช้ได้แฮะ
ตอนนี้กำลังจะลองใช้ script ดู ไว้ได้ผลอย่างไร จะมาอัพเดทอีกที(รอให้ดึกๆ ก่อน ยิ่งดึกยิ่งเฮี้ยน biggrin.gif )

***Update***
ว่าจะลองทำตอนดึกๆ แต่รอไม่ไหว laugh.gif laugh.gif laugh.gif
ปรากฏว่า ใช้ script ก็ได้ ลองเปิดดูแล้ว มันแจ้งดัลเบิลลอกอิน(เสียดายมีไอดีเดียว จะสมัครอีกก็ขี้เกียจ) แสดงว่าผ่าน
ใช้แค่ notepad พิมพ์โค้ดไม่กี่บรรทัดเอง คนที่ป้องกัน รู้เข้า คงปวดใจแย่ smile.gif

อ้อ script ที่ว่า คือ Windows Script นะ เขียนได้ทั้ง VBScript และ JScript แล้วแต่ถนัด

แก้ไขโดย AssertionFailed 17 November 2007 - 08:27:44 PM


#15 cafe

cafe

    Exclusive Member

  • Exclusive Programmer
  • 10015 โพสต์

โพสต์เมื่อ 20 November 2007 - 01:57:44 AM

biggrin.gif ก่อนอื่น ไม่มีไรจะกล่าวได้มากกว่าคำว่า ขอบคุณๆ ข้าน้อยขอคารวะ โปรดรับ ข้าเป็นศิษย์ด้วยเต๊อะๆ

อ่านดูก็ยังไม่เข้าใจว่าใช้ script อย่างไร แต่ก็ทำให้ทราบ idea พอสมควรเด๋วลองเอามาประยุกติกับความรู้ที่พอมี
ได้ผลอย่างไร จะมาแจ้งให้ทราบอีกที ท่านอาจานนนน อิอิ (ไม่รู้รับเป็นศิษย์รึป่าวอิอิ)

#16 cafe

cafe

    Exclusive Member

  • Exclusive Programmer
  • 10015 โพสต์

โพสต์เมื่อ 20 November 2007 - 02:52:10 AM

เซงๆๆๆ server ปิดเมื่อไหร่มานจะเปิดฟ่ะ ร้อนวิชา อิอิ

#17 X CroSs

X CroSs

    Truebot Co-Developer

  • Root Administrator
  • 102427 โพสต์
  • Gender:Male

โพสต์เมื่อ 22 November 2007 - 12:34:27 PM

อูย ... อ่านกระทู้ ปรมจารย์คุยกัน ผมนี่เปนเด็กน้อยไปเรย T^T

ข้าน้อยขอคารวะ ขอเปนลูกศิษย์ด้วยคนนะงับ แหะๆ ...

ปล. สนใจตรงนี้มากๆ ไม่เคยรู้เลยว่ามันมีวิธีทำแบบนี้ได้
ถ้าไม่รังเกียจรบกวจชี้แนะเพิ่มเติมให้พวกข้าน้อยได้เห็นแสงกานด้วยเถอะนะงับ laugh.gif
(AssertionFailed @ Nov 17 2007, 07:12 PM) ดูโพสต์

ปรากฏว่า ใช้ script ก็ได้ ลองเปิดดูแล้ว มันแจ้งดัลเบิลลอกอิน(เสียดายมีไอดีเดียว จะสมัครอีกก็ขี้เกียจ) แสดงว่าผ่าน
ใช้แค่ notepad พิมพ์โค้ดไม่กี่บรรทัดเอง คนที่ป้องกัน รู้เข้า คงปวดใจแย่ smile.gif

อ้อ script ที่ว่า คือ Windows Script นะ เขียนได้ทั้ง VBScript และ JScript แล้วแต่ถนัด


ts.gif

manutd18wm.png


#18 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 22 November 2007 - 05:47:22 PM

เชื่อว่าร้อนวิชา โพสซะเกือบตีสาม laugh.gif laugh.gif laugh.gif

script ที่มากับวินโดว์ ถือว่าเป็นเครื่องมือที่ทรงอำนาจมากๆ แค่บรรทัดเดียวก็สามารถทำให้วินโดว์ล่มสบายๆ
แค่ความสามารถในการเข้าถึงระบบไฟล์ กับ registry ก็คงนึกภาพออก
แต่น่าเสียใจว่า ที่พบบ่อยๆ ไม่ใช่เพื่อสร้างสรรค์ แต่เป็นทำลายมากกว่า
หลายคนอาจเคยเจอปัญหาไวรัส ที่เรียกกันทั่วไป ไวรัสโฟลเดอร์
ทำให้เข้าใช้งาน regedit/cmd/msconfig ไม่ได้ และ folder option หายไป
เขาแ่ค่อาศัยไฟล์ autorun.inf + script ก็สร้างได้สบายๆ

มาพูดถึงการประยุกต์ใช้ในเรื่องนี้ดีกว่า
จากที่แสดงแนวคิดคร่าวๆ ว่า
filename=GetModuleFileName();
checksum=Hash(filename);

จะเห็นว่าฟังก์ชัน Hash() อาศัย filename ที่ได้จาก GetModuleFileName()
และ GetModuleFileName() ก็คืนค่าชื่อไฟล์ที่เรารันโปรแกรม
ดังนั้นถ้าเราเปลี่ยนชื่อไฟล์ หลังจากรันไปแล้ว GetModuleFileName() ก็ไม่มีทางรู้
แน่นอน Hash() ก็ไม่รู้ มันก็ hash ตามชื่อไฟล์ โดยไม่รู้ว่าเป็นไฟล์จริงหรือเปล่า (พอจะนึกภาพออกยังครับ)
สิ่งที่เราต้องทำก็คือ เตรียมไฟล์ไว้สองไฟล์
1.ไฟล์ต้นฉบับของจริง ก็คือ 108Online.bin
2.ไฟล์ที่เราแก้ให้เปิดสองจอได้ ตั้งชื่อว่า 108OnlinX.bin

จากนั้นก็เขียน script กัน
//***************
//1.ก่อนอื่นเราก็เปลี่ยนชื่อไฟล์ต้นฉบัย ไปเป็นชื่ออื่นก่อน
//แล้วเปลี่ยนชื่อไฟล์ที่เราแก้ ให้เป็นชื่อไฟล์ต้นฉบับ
//****************

//1.1 object ที่ทำให้เราเข้าถึงระบบไฟล์
var fso = new ActiveXObject("Scripting.FileSystemObject");

//1.2 method ที่ทำให้เราได้รายระเอียดของไฟล์ที่เราต้องการ
var f=fso.GetFile("108Online.bin");

//1.3 เปลี่ยนเป็นชื่ออื่นชั่วคราว
f.name="temp.bin";

//1.4 เปลี่ยนชื่อไฟล์ที่เราแก้ให้เป็น ชื่อไฟล์ต้นฉบับ
f = fso.GetFile("108OnlinX.bin");
f.name="108Online.bin";

//*************************
//2.เสร็จแล้วจึงสั่งรันโปรแกรม
//ผลที่ได้ก็คือ GetModuleFileName() จะคืนชื่อไฟล์เป็นชื่อเดียวกับไฟล์ต้นฉบับ
//*************************
var WshShell = new ActiveXObject("WScript.Shell");
WshShell.Exec("108Online.bin");

//อาจจะใส่ดีเลย์สักหน่อย ให้โอกาสวินโดว์ได้หายใจ
//WScript.Sleep(5000);

//***************************
//3.สุดท้ายก็เปลี่ยนชื่อไฟล์กลับไปตามเดิม
//เวลาที่ Hash() ทำงาน มันก็จะ hash ไฟล์ต้นฉบับ ไม่ใช่ไฟล์ที่เรารัน
//***************************
f = fso.GetFile("108Online.bin");
f.name="108OnlinX.bin";
f = fso.GetFile("temp.bin");
f.name="108Online.bin";

เสร็จแล้วก็เซฟเป็นชื่ออะไรก็ได้แต่ต้องนามสกุล .js และเก็บไว้ที่เดียวกับ *.bin เช่น run.js
เวลาใช้ ก็แค่ ดับเบิ้ลคลิก ถ้า ดับเบิ้ลคลิกสองรอบ ก็เปิดสองจอ

หมายเหตุ
วิธีนี้จะใช้ได้ผลก็ต่อเมื่อ เราเปลี่ยนชื่อไฟล์ทัน ก่อนที่เกมจะ hash
แต่ถ้าเกมมัน hash ตอนลอกอิน รับรองใช้ได้ 100%
อีกอย่างคือ วินโดว์ จะต้องเปิดให้ใช้ script ได้ (ปรกติจะเปิดอยู่แล้ว)

//ลองใช้ notepad พิมพ์บรรทัดช้างล่าง แล้วเซฟเป็น test.js
//ถ้าดับเบิลคลิกแล้วมีไดอะลอกแสดงข้อความ ก็แสดงว่าเราใช้ script ได้
WScript.Echo("Hello World!");

ศึกษาเรื่องของ script เพิ่มเติมได้ที MSDN หัวข้อ Windows Script Host

ทดสอบแล้วเป็นยังไงก็บอกกันมั่ง biggrin.gif

#19 AunezS

AunezS

    ซุนจ้ง

  • Members
  • 28 โพสต์

โพสต์เมื่อ 24 November 2007 - 12:49:16 AM

แวะมาอ่านเผื่อได้อะไรติดตัวกลับไปบ้าง laugh.gif

#20 cafe

cafe

    Exclusive Member

  • Exclusive Programmer
  • 10015 โพสต์

โพสต์เมื่อ 26 November 2007 - 01:39:49 PM

โอวว เหนือความคาดหมายจิงๆ สำหรับ script เทพ อิอิ ปัญหาทุกอย่างแก้ไขได้โดยสมบูรณ์ ทั้งนี้ต้องขอบคุณ คุณ AssertionFailed เป็นอย่างมากเลย คับ

แต่ทว่า อิอิ ต่อไปเป็นปัญหาที่เกิด จากผลของการใช้ script คือผมไม่สามารถ ใช้ WPE ในการจับ packet ได้อีกต่อไปเพราะ WPE กลับมองเห็น เป็น processs ของ 108Online.bin ซึ่ง เมื่อทำการ target process แล้ว ... ทำการ log packet ไม่ได้ แต่ไม่เป้นไร ปัญหานี้ ไม่มีสาระสำคัญมากเท่าการต้องการเปืดหลายหน้า จอ ^^" ยังไงก็ ยังคงใช้ client จิงเพื่อ log packet ได้เหมือนเดิม


ขอบคุณคร้าบบบบบ ท่านอาจาย์อิอิ tongue.gif



ปล.จะว่าไปสงสารคนคิดการ กันด้วย hash file เกมนี้จิงๆ มันถูกแก้ด้วย วิธีการง่ายๆ แบบคาดไม่ถึง ต้องยอมรับเลยคุณ AssertionFailed ผู้มีประสบการณ์ด้านในการแกะแก้มามายมายสามารถมองปัญหาและแก้ไขได้โดยแทบไม่ต้องแก้ตัวเกม ตัวเกมถูกแก้เพียงแค่ 1 Byte จากนั้น ก็ clear ปัญหา hash file ได้อย่างแยบยล ผมนึกยังไงก็นึกไม่ออกว่าจะเอา script มาช่วยได้อย่างไร ก็มัวแต่ไปนั่งทำการเปลี่ยน process จังหวะที่ game ทำการ getfilename ไปสู่ module ที่ ถูกเพิ่มเติมเข้าไป เพื่อ แก้ไขให้ program ได้ ชื่อ file ตัวจิงไปถึงแม้ว่า โดยหลักการแล้วเข้าใจว่าสามารถแก้ไขได้แน่นอน แต่ก็เท่ากับเราต้องไป modify code มามายพอสมควร และไม่รู้ว่าจะมีผลกระทบกับ ตัวเกมหรือไม่ อีกทั้งต้องมานั่งศึกษา assembly ใหม่ที่มันจมลึกหายไปจากฐานความรู้ซะแล้ว สุดท้ายพบคำตอบเพียงแต่ script ง่ายๆ จากตัวอย่าง ถึงกับอึ้งใน idea ... นึกถึงเรื่อง อเมริกาผลิตปากกาที่เขียนได้ใน อวกาศ กับผรั่งเศษที่ใช้เพียงแค่ดินสอ ในการแก้ปัญหา อิอิ

^^





0 สมาชิกกำลังอ่านกระทู้นี้

0 สมาชิก, 0 ผู้เยี่ยมชม, 0 ผู้ใช้งานที่ซ่อนตัว