obfuscation ก็คือการทำให้โค๊ดที่เราเขียนออกมานั้นอ่านไม่รู้เรื่องงงด้วยการเข้ารหัสและถอดรหัส ซึ่งวันนี้ผมจะแนะนำการ obfuscation แบบง่ายๆกันครับ ซึ่งรับรองว่า มือใหม่ php ไม่สามารถแกะได้แน่ แต่ pro แกะได้แน่นอน แต่ เขาโปรแล้วก็คงมีสามัญสำนึกบ้างอะไรบ้างละนะคงไม่ขโมยไปใช้
ปล. การเข้ารหัสที่ผมจะนำมาเสนอวันนี้ได้ไปเห็นมาจาก Shell Script ของ Hacker ที่มีคนเอามาให้ดูเล่นครับเหอๆ – -*
เกริ่นนำ
ปกติทั่วไปถ้าเห็นสคริปที่เขาแจกแล้วทำ obfuscateมาแล้วส่วนใหญ่จะเป็นรูปแบบ eval(base64_decode(‘BlAhbLahBlah==’)); ประมาณนี้ครับ (ส่วนมากจะเห็นจาก สคริป mod cms หรือว่าสคริปที่ ไวรัสแทรกไป (เอ้ากำตกลงมันมีแต่ของไม่ดีเหรอเนี่ย 555)) โดยทั่วไปแล้ว php มีฟังชั่นในการเข้ารหัสถอดรหัสอยู่พอสมควร (ไม่รวมถึง อัลกอริทึมย่อยสลาย พวกนั้นถอดกลับไม่ได้ ) ในที่นี้ผมจะยกมา 4 ตัว คือ base64_encode ,base64_decode ,gzdeflate และ gzinflate
base64_encode ,base64_decode แน่นอนว่าเป็น ฟังชั่นที่ใช่ในการเข้ารหัส ให้เป็น MIME(Multipurpose Internet Mail Extensions)
*base64 จะกินเพื่อนที่เพิ่มขึ้นอีกประมาณ 33%จากข้อมูลเดิม
gzdeflate , gzinflate เป็นฟังชั่นบีบอัด string ให้เล็กลง(gzdeflate) และคลายstring ที่ถูกบีบอัดให้กลับมาสภาพเดิม(inflate)
*หมวด gz นี้จะใช้กับ browser ทั่วไปในการขนย้ายข้อมูลเพื่อลด bandwidth ให้น้อยลง (ปกติทั่วไปเราจะใช้ ob_start(‘ob_gzhandler’); กัน เพื่อให้ php ส่ง header Content-Encodeing: gzip ; ออกไปพร้อมกับ เข้ารหัส deflate หรือ gzip ไป โดยใช้ output_buffering เข้ารหัสก่อนที่ส่งออกไป
วันนี้เรามาลองอีกแบบคือเข้ารหัสแล้ว return ค่ามาเพื่อที่จะเซฟหรือนำไปใช้ต่อ ส่วนเรื่องของ gzip จะเอากล่าวต่อในบทความ หมวด performance ละกันนะครับ
หากต้องการรายละเอียดของ functions ก็ลองค้นดูจาก http://php.net นะครับ
อันที่จริงแล้ว เอามาใช้ก็ไม่มากมายอะไรครับ อยากจะให้รู้ไว้สักหน่อยฟังชั่นไหนไว้ใช้ทำอะไร เผื่อบางที่จะเอาไปประยุกค์ใช้
Encrypt
มาถึง ขั้นตอนการ Encrypt เข้ารหัส หรือว่า obfuscation จากที่กล่าวไว้ข้างบน เราจะหยิบมาใช้ สองฟังชั่นในส่วนของเข้ารหัส คือ base64_encode และก็ gzdeflate
$source = file_get_contents('test.php'); //ดึง file source เข้ามา
$source = gzflate($source,9); //ใช้ deflate บีบอัดก่อน (ซึ่งขั้นตอนนี้ output ออกมาอ่านไม่ออกแล้วครับ - -*)
$encrypt = base64_encode($source); // บีบให้มันเป็น String บรรทัดเดียวไม่งั้นอาจจะมีปัญหาได้
echo $encrypt; // แสดง code ที่เข้ารหัสไว้แล้ว

deflate
![]()
base64_encode
copy base64 เก็บไว้นะครับเดี่ยวจะเอาไปใช้ในขั้นตอนถอดรหัสไฟล์ที่จะเอาไปจริง
Decrypt & Execute
ในการตอนนี้เราจะเอามาลงไฟล์ที่จะเอาไปใช้จริง (แจก,ขาย หรืออื่นๆ) ฟังชั่นที่เพิ่มเข้ามา eval เพื่อ execute string ก็ให้เราก๊อป code php ที่เราได้เข้ารหัสไว้แล้ว มาถอดรหัสกันตรงนั้น
$source = 'vVt7d9u4sf9b+hRwTk4ptbIcq7d7uslN=='; //ก๊อป Source ที่เข้ารหัสแล้วมาวาง (ของจริงยาวกว่านี้เยอะ) $source = base64_decode($source); //ถอดรหัสกลับไป $source = gzinflate($source); //ถอดกลับอีกชั้น eval($source); //Execute!
กรณี รันแล้ว error ประมาณว่า unexpected ‘< ‘ in xxx/xxxx/xxx.php eval() แปลว่า file ตอนที่เข้ารหัสมาไม่ได้้ ตัด
$source = preg_replace('!^<?php!','',$source); eval($source);
ตอนนำไปใช้จริง คงต้องลด code ให้เหลือบรรทัดเดียวเพื่อความสับสนขึ้นอีกเล็กน้อยนะครับ
eval(preg_replace('!<?php!','',gzinflate(base64_decode('S8lM1VDKKCkpsNLXT0kt03OtKEgtKnEpTc7WS87PVVTStAYA'))));
ประมาณนี้ครับ
สรุป
เป็นการ obfuscation อย่างง่ายจริงๆครับใครที่มี sense หน่อยตัด eval ออกแล้ว echo แทนก็จะเห็นโค๊ดแล้ว แต่ก็อย่างที่เกริ่นนำไว้ตอนต้นแล้วว่า ป้องกันจากมือใหม่ php ไม่มากก็น้อย ก็ยังดีกว่าไม่ทำอะไรเลย จริงใช้มั้ยละครับ
สำหรับ ตัวนี้ผมได้ทำ Tools มาให้ใช้กันเล่นๆแล้วครับที่ PHP Obfuscator
ไม่อยากสมัครแต่ขออ่านได้มิ [$1$]
โอ้ว เมื่อได้เห็นข้อความทั้งหมดแล้วมันสุดยอดมากเลย 55+
ไม่ใช่เพียงแค่นั่น สมัครสมาชิก สิบท่านแรกรับทันที ฟรี spam mail เต็มกล่อง inbox ท่าน – -*
ท่อนครับ ทำแบบที่เข้ารหัสโดยเพิ่มรหัสของเราไปด้วยสิครับ ไหน ๆ ก็ไหน ๆ ละ (หรือคนเอาไปใช้จะลืมเอง – -)
ขอบคุณครับท่าน กำลังศึกษาเรื่องพวกนี้เพิ่มเลย
คงต้องเอาไปใช้มั่งละ
ท่านอาร์มลองดีโค้ดไอออนคู้ปยัง
ลองเปิดไฟล์ที่เข้ารหัสมาดูหยาบๆแล้วครับ ผมว่ายากเลยไม่อยากดูต่อเสียเวลา
อย่างน้อยเขาทำขายก็คงจะซับซ้อนน่าดู ฮ่าๆ
ใช้ยังไง ไม่เข้าใจง่ะครับ
T^T
อยากใช้เป็น
ชอบการใช้คำพูดในการอธิบายครับ ^^