A Hacker's Diary ตอน Reverse Engineering


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

สัปดาห์นี้ผมก็มีประสบการ์ณแฮกสนุก ๆ แปลก ๆ ใหม่ ๆ มาเล่าสู่กันฟังเช่นเคยครับ เรื่องมันก็มีอยู่ว่าตัุวกระผมเองนั้นก็เป็นแค่โปรแกรมเมอร์ธรรมดา ๆ คนหนึ่งที่ต้องทำงานเป็นมนุษย์เงินเดือนของบริษัทข้ามชาติเหมือนกับคนกรุงทั่วไปแหละครับ

เมื่อสัปดาห์ที่ผ่านมานั้นคุณลูกค้าตัวแสบของโปรเจ็กที่ผมกำลังพัฒนาอยู่นั้น เขาต้องการให้บริษัทผมพัฒนา Java Servlet ที่สามารถแปลงหน้า HTML เพจต่างๆ ให้เป็นไฟล์ PDF กับไฟล์รูปภาพได้แต่ให้เวลา 1 อาทิตย์ครับ หลาย ๆ ท่านอาจจะเห็นว่าง่าย ๆ ใช่ป่าวครับก็แค่ไปเรียกโปรแกรม Screen Capture มาก็ได้ล่ะ เอิ่ม...แ่ต่มันไม่ง่ายอย่างที่คิดนะสิครับ...

เพราะว่าเครื่องเซิร์ฟเวอร์เจ้ากรรมของคุณลูกค้าคนนี้เป็น Linux Server ซึ่งไม่ได้ลง X Window แล้วเขา็ก็บอกว่าจะไม่ลง X Window เด็ดขาด ดังนั้นภาระจึงต้องตกมาอยู่ที่โปรแกรมเมอร์ตาดำ ๆ อย่างผมสิครับ ครั้นจะให้กระผมจะเขียน Java Web Browser เองก็เกรงว่าจะไม่ทันกำหนดส่งงานแน่นอน ฉะนั้นผมก็ต้องหา API ที่เีขียนด้วยภาษา Java ซึ่งสามารถใช้งานได้บน headless server environments สิครับ

ดังนั้นผมจึงใช้ google ค้นหา API ที่ผมต้องการ จนไปพบโปรแกรมที่ผมตรงกับความต้องการของผม โปรแกรมนั้นมี ชื่อว่า SloppyBrowser ซึ่งเป็น Commercial APIs ซึ่งต้องเสียเงินซื้อครับ แต่ทางบริษัทผู้ผลิตเขาได้โฆษณาว่าเป็น Java browser Software Development Kit ที่ยอดเยี่ยมมาก มีลูกค้าเป็นบริษัท IT ชั้นนำเช่น IBM, Oracle, Macromedia ดังนั้นผมจึงดาวน์โลด free 30-day Trial version ของโปรแกรมตัวนี้้มาทดลองใช้ครับ ซึ่งทางบริษัทนี้ประกาศในเว็บของเขาว่า free 30-day Trial version นั้นทำงานได้เหมือนกับ full version ทุกประการเพียงแต่หากใช้งาน 30 วันหลังจากที่ดาวน์โหลดไปโปรแกรมจะไม่ทำงานครับ

หลังจากที่ผมได้ทดลองใช้ก็พบว่าโปรแกรมของเขาดีจริง ๆ ครับ โปรแกรมนี้ช่วยผมให้ทำงานเสร็จทันกำหนดได้แน่ ๆ ผมจึงเสนอเรื่องให้คุณเจ้านายของผมจัดซื้อซอฟต์แวร์ตัวนี้ แต่ปัญหามันไม่จบเท่านี้สิครับ เพราะว่าก่อนที่ผมลองใช้ซอฟต์แวร์ตัวนี้ ผมไม่ได้ดูราคาครับ ราคาของ software ตัวนี้แพงมหาโหดครับ ท่านผู้อ่านอาจจะคิดว่าแค่โปรแกรม Java Browser ที่มาพร้อมกับ SDK ให้พัฒนาต่อได้จะแพงแค่ไหนกันเชียว ผมจะบอกราคาให้ครับ บริษัทผมต้องซึ้อ 1 Developer License ราคา $9,000 เพื่อใช้ในการพัฒนาโปรแกรมต่อยอด ส่วนลูกค้าของผมก็ต้องซื้ออีก 1 Server Deployment License ราคา $ 12,000 เพื่อติดตั้งบน server ของเขาครับ คิดเป็นเงินไทยเท่าไหร่ก็คูณ 35 บาทกันเอาเองนะครับ

ผลปรากฏว่าทั้งทางบริษัทผมและคุณลูกค้าของผมเขาไม่ยินดีซื้อซอฟต์แวรตัวนี้ แต่เขาบอกว่าอยากให้ทำงานได้เหมือนใช้ซอฟต์แวร์ตัวนี้ คุณลูกค้าเขาบอกว่าหาทางที่มันถูกกว่านี้ได้ไหม (ผมก็คิดในใจ อะไรว่ะ จะเอาทั้งดี ทั้งถูก ทั้งเร็ว แต่ไม่ยอมเสียเงิน คนแบบนี้ก็มีในโลก) ดังนั้นผมจึงได้โจทย์ใหม่จากเจ้านายว่า "คุณทำอย่างไรก็ได้ให้มีงานส่งและเสร็จก่อนวันกันหนดส่งงานละกัน" (อืม บางทีคนเป็นเจ้านายพอเขาคิดอะไรไม่ออก ก็มาผลักภาระให้ลูกน้องซะงั้น) ด้วยเหตุผลดังกล่าวผมจึงต้องหาทางที่สามารถทำให้ผมสามารถใช้โปรแกรมดังกล่าวได้นานเกินกว่า 30 วันและแล้วปฎิบัติการ Reverse Engineering ของผมก็เิริ่มขึ้น...

ขั้นแรกผมจึงต้องหาวิธีที่จะตรวจสอบให้ได้ว่า่โปรแกรมนี้ใช้วิธีอะไรในการตรวจสอบว่าโปรแกรมนั้นหมดอายุหรือยัง เนื่องจากโปรแกรมภาษา Java ไม่ได้ถูกคอมไพล์จาก source code ให้เป็น native machine instrcution ครับ แต่ source code ของโปรแกรมภาษา Java จะถูก Java Compiler จะแปลง source code เหล่านั้นให้เป็นสิ่งที่เรียกว่า Bytecode ครับ ซึ่ง Bytecode เหล่านี้เองจะถูก Java Virtual Machine (JVM) แปลงเป็น native machine instrcution อีกทีเมื่อเวลาเรา execute โปรแกรมที่เขียนด้วยภาษา Java ครับ และนี่เองเป็นสาเหตุที่ทำให้ภาษาโปรแกรมภาษา Java สามารถ execute ได้ทุก platform ที่มี JVM ตามคำขวัญของภาษา Java ที่ว่า "Write Once, Run Anywhere"

ถึงแม้ว่า การที่ source code ของโปรแกรมภาษา Java ถูกแปลงเป็น Bytcode จะทำให้สามารถเรียกใช้โปรแกรมได้ทุก platform ที่มี JVM แต่มันก็เหมือนเป็นดาบสองคมเช่นกันครับ นั่นก็คือ Bytecode เหล่านี้สามารถถูกแปลงกลับคืนให้เป็น Source code ภาษา Java เหมือนเดิมได้ไม่ยากครับ กระบวนการแปลงจาก Java Bytecode กลับไปเป็น Java Source code นี้เรียกว่า "Decomplilation" ครับ แล้วผมจะแปลง Bytecode เหล่านี้กลับให้เป็น source code ได้อย่างไร?

คำตอบก็คือ ผมมีเครื่องมือที่เรียกว่า Java Decompiler เช่น Jad และ JODE เป็นต้นครับ แต่ tool ที่ผมจะใช้สาธิตวันนี้คือ Jad ครับเพราะว่าี่เป็น command line ครับ และสามารถ decompile ไฟล์ Java class ได้ทีละหลาย ๆ ไฟล์พร้อมกัน ซึ่งขั้นตอนการ Decompile มีดังนี้ครับ

  1. ดาวน์โหลดโปรแกรม Jad ให้ตรงกับ platform ที่จะใช้งานแล้ว แตกไฟล์ jad.zip ไว้ใน directory ใดก็ได้ในฮาร์ดไดร์ฟ สำหรับผมใส่ไว้ที่ d:\jadnt158 ครับ ซึ่งเมื่อแตกไฟล์แล้วใน directory ดังกล่าวจะมีอยู่สองไฟล์คือ jad.exe กับ Readme.txt สำหรับใครที่ใช้ unix ก็จะมีไฟล์ jad แทนไฟล์ jad.exe นะครับ แล้วก็อย่าลืมเปลี่ยน permission ใ้ห้ jad เป็น executable file ด้วยคำสั่ง chmod a+x jad ด้วยนะครับ
  2. สร้าง directory ที่ชื่อว่า bin ไว้ภายใน directory ของ Jad ครับ สำหรับผมคือ d:\jadnt158\bin ครับ
  3. copy ไฟล์ .jar ทุกไฟล์ของ SloppyBrowser ซึ่งใด้แก่ sbbrowser.jar, sbutil.jar, sbhttp.jar มาใส่ไว้ใน directory ที่ชื่อว่า bin ที่เพิ่งสร้างไป
  4. เปลี่ยนนามสกุลของไฟล์ .jar ทุกไฟล์ให้เป็น .zip ครับ แล้วคราวนี้ก็ใช้โปรแกรม file archiver ที่คุณติดตั้งไว้เช่น 7-zip, WinZip, หรือ WinRar ทำการแตกไฟล์ .zip เหล่านั้นครับ (จริง ๆ แล้ว ไฟล์ .jar ก็คือ zip ไฟล์นั่นแหละครับ แต่เป็น zip ไฟล์ของ Java classes กับพวกไฟล์ metadata ที่เกี่ยวข้อง) ซึ่งเมื่อแตกไฟล์แล้วก็เราก็จะพบว่ามี ไฟล์ .class อยู่มากมาย ไฟล์ .class เหล่านี้แหละครับ คือ Java Bytecode ของแต่ละ Java Class ที่รวมกันเป็นโปรแกรม SloppyBrowser
  5. เรียกคำสั่งต่อไปนี้ครับเพื่อ ทำการ decompile ไฟล์ .class ทุกไฟล์ให้กลับเป็น ไฟล์ .java ซึ่งก็คือ Java Source code
    Windows: jad -o -r -sjava -dsrc bin/**/*.class
    Unix: jad -o -r -sjava -dsrc 'bin/**/*.class'
  6. เมื่อคำสั่งด้านบนทำงานเสร็จแล้ว Java Source code จะอยู่ใน directory ที่ชื่อว่า 'src' ครับ สำหรับผมก็คือ d:\jadnt158\src

ตอนนี้เรามี Source code อยู่แล้วครับ แต่ source code ที่ได้มาจากการ decompile ด้วย Jad นั้นอาจจะเป็น source code ที่เป็น Obfuscated code คือ source code ที่ถูกทำให้มนุษย์ปุถุชนธรรมดาอ่านแล้วเข้าใจได้ยาก และงุนงงซึ่งเป็นสิ่งที่บริษัทที่ผลิต API ที่พัฒนาด้วยภาษาเช่น Java หรือ C# พึงกระทำเพื่อป้องกันการ Reverse Engineering ด้วย Decompiler ครับ แต่บริษัท SloppySoft ผู้ผลิต SloppyBrowser ที่ผมทำการ decompile นี้ไม่ได้ Obfuscate โปรแกรม SloppyBrowser ตอน compile ครับ จึงทำให้ source code ที่ decompile มาด้วย Jad อ่านง่ายมาก ๆ เลย อิิอิ อย่างนี้ก็เข้าทางผมสิครับ

แต่ปัญหาก็คือ ไฟล์ .java ที่ decompile ออกมามีเป็นร้อย ๆ ไฟล์ แล้วควรจะเริ่มจากตรงไหนดี? ง่าย ๆ ครับก็เริ่มจาก Class ที่น่าจะเป็นหัวใจของโปรแกรม จากการที่ผมอ่าน documentation ของ SloppyBrowser ก็พบว่าตัว Engine ของโปรแกรมมีชื่อว่า TornadoBase ซึ่งเวลาเรียกใช้ SloppyBrowser ก็ต้องสร้าง Instance ของ Class นี้ก่อนทุกครั้ง ผมก็เลยเริ่มศึกษา source code ของ TornadoBase ครับ ซึ่งก็ไม่ทำให้ผมผิดหวัง เพราะว่าผม Class ดังกล่าวมี static block ดังเช่นที่แสดงอยู่ด้านล่าง:

static { try { System.out.println("This trial expires February 28. 2008"); if((new Date()).after((new SimpleDateFormat("yyyyMMdd")).parse("20080228"))) { System.out.println("\nThis trial has expired!"); System.out.println("\nPlease obtain a newer version from www.sloppysoft.com"); System.exit(0); } } catch(ParseException parseexception) { System.exit(0); } }

static block นี้เองที่ใช้ในการป้องกันการใช้โปรแกรมเกิน 30 วัน ดังนั้นผมจึงลบ static block นี้ทิ้งหมดเลยครับ แล้วก็ทำการ compile คลาสนี้ใหม่ซึ่งจะได้ไฟล์ที่ชื่อว่า TornadoBase.class หลังจากนั้นผมก็ใช้โปรแกรมจำพวก file archiver เปิดไฟล์ sbbrowser.jar แล้วก็คัดลอกไฟล์ TornadoBase.class ที่ได้จากการ compile ใหม่นี้ ทับไฟล์ TornadoBase.class ที่มีอยู่เดิมแล้วก็ save ไฟล์ sbbrowser.jar ครับ เพียงแค่นี้ผมก็ได้โปรแกรม SloppyBrowser มาใช้ได้ตลอดไปโดยไม่ต้องจ่ายเิงินแม้แต่บาทเดียวแล้วครับ อิอิ ดีใจจังเลย \@/

มี RSS ไหม จะได้ add ใส่ Bookmarks เอาไว้ก

ใส่ tag ข้างล่างนี่ ไว้ใน ด้วยก็ดีนะ browser จะได้รู้ได้ว่า เว็บนี้มี RSS

เอ่อ.. ลืมสังเกตไปว่า allow HTML tags แค่บางตัว

อะ.. เอาใหม่ แนะนำให้ใส่ tag ข้างล่างนี่ไว้ใน <head> น่ะ
<link rel="alternate" type="application/rss+xml" title="A Hacker's Diary" href="http://www.yannarak.net/rss.xml">

รบกวนอีกที..
ขอโทดด้วย เพิ่งสังเกตเห็นว่า RSS มีอยู่แล้วในหน้าหลัก แค่ไม่มีในหน้า single post แค่นั้น

(มาป่วนไปซะ 3 comments เลย..)

น่าจะพูดถึง obfuscator หน่อยนะครับเผื่ออนาคตเราdevelopอะไรจะได้โดนreverse engineerยากหน่อยนึง

โห สุดยอด แต่ก็แปลกนะ โปรแกรมราคาแพ้งแพง แต่ไม่ได้ป้องกันอะไรพวกนี้เลย 555

แต่ก็ขอบคุณเรื่อง JAD ล่วงหน้านะคะ :)

จริงๆใช้ OpenOffice มัน convert เป็น pdf ได้ในตัวนะครับ หรือพูดตามตรง ผมไม่รู้ว่าลง X window จะทำต่อได้ยังไง แต่.... ถ้าเป็นผมผมจะ force ให้ลงแทน แทนที่จะต้องไปใช้วิธี hack แบบนี้ ไปและครับ

# ความคิดเห็นที่ 8
นี่มันเรื่องแต่งครับ ผมไม่ได้ใช้ Hack ให้ลูกค้าหรอกครับเพราะว่ามันผิดกฎหมาย

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

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

คือถ้าใช้ X Windows นี่มันทำ screen capture ได้ครับ แล้วเราก็สามารถทำเป็นไฟล์ภาพได้ง่ายครับ และจะแปลงเป็นอะไรต่อก็แล้วแต่ครับ

สาเหตุที่ใช้ OpenOffice ไม่ได้เพราะว่าผมเขียน Servlet ครับ ต้องใช้ API และ Java API ส่วนใหญ่ต้องใช้ X windows ในการ render หน้าเว็บด้วยครับ จึงเป็นที่มาที่ทำให้ API ตัวนี้ราคาแพง

ตำรวจมา!! :P

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd><img> <object> <embed> <param>
  • Lines and paragraphs break automatically.
  • Images can be added to this post.

More information about formatting options

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Copy the characters (respecting upper/lower case) from the image.
ญาณรักข์ วรรณสาย