KUWIN Autologin

ผมเห็นรุ่นพี่หลายคนทำ KUWIN autologin ไว้หลายตัว @nattster on Android Firefox Standalone แต่เหมือนว่าจะโดน CAPTCHA ติดเลยใช้ไม่ได้ (หรือเปล่า ผมไม่ได้ลอง)

ทีนี้หน้า Login KUWIN เนี่ย จะเป็น CAPTCHA บวกเลขครับ ผมเดาๆ อยู่นะว่ามันมีทางแกะได้ ไว้ไม่มีไรทำจริงๆ (แปลว่าชาติหน้า) จะลองแกะดูเพราะมันดูง่าย ทีนี้ผมเป็นคนบวกเลขในใจไม่ได้ เจอสองหลักมีทดเปิด terminal รัน bc คิดอย่างเดียว บังเอิญผมเจอกับ KUWIN Tools บน Android ซึ่งเป็น Official apps เลยก็เลยสงสัยว่ามันทำยังไง แอพทางการไม่น่าจะใช้วิธีแกะ CAPTCHA

เอาล่ะ ได้เวลาแฮค!

ก่อนอื่นเลยก็ต้องมี APK มันก่อนครับ ก็สอยกลับมาง่ายๆ ด้วย adb pull โง่ๆ ทีนึง เสร็จแล้วผมก็ Google ต่อ ว่าจะทำอะไรกับมันดี เอาเป็นว่า decompile ละกัน

Google แนะนำคำถามนี้ มาให้ผมซึ่งก็ตรงเป๊ะ คือ โหลด dex2jar มาแก้เป็น jar แล้วใช้ jd-gui แก้กลับเป็น Java ก็ลุยสิครับ

Screen Shot 2556-09-14 at 11.29.40 PM

ผมเดาว่าโค้ดต้องสงสัยอยู่ไม่ใกล้ไม่ไกลอยู่นี่แหละ แต่โค้ดมันแก้ตัวแปรนิดๆ แล้วมีเมธอดนี้หลายอันแต่หลาย signature ผมไม่แน่ใจ เลยตัดสินใจว่าจะเล่นมุกเดิมอีกคือ Privoxy ขาประจำ แต่ทว่า…

Screen Shot 2556-09-14 at 11.31.32 PM

มันมีเส้นกั้นบางระหว่างผมกับปลายทาง ผมเห็น mobile.php ขึ้นหรา นั่นคือคำตอบผมแน่ๆ แต่ผมจะรู้ได้ยังไงว่าจะส่งอะไรเข้าไป และตอนนี้กำแพงระหว่างผมกับมันคือตัว s เพียงตัวเดียวที่อยู่ในคำว่า https

เอาวะ!

ด้วยความที่ผมยังไม่อยากจะอ่าน Java มั่วๆ นั่น ผมเลยตัดสินใจว่าเรามาอ่าน assembly (หรือให้ถูกคือ smali) ดีกว่า

Screen Shot 2556-09-14 at 11.34.55 PM

เข้าใจง่ายกว่า Java สิบเท่า gg…

ยังสิ ผมตัดสินใจว่าแก้ก็แก้วะ ก็เลยเดาไปเดามาสองสามที สุดท้ายแทบจะ rewrite method ตัวนั้นใหม่ให้เหลือ string เดียว (เหมือนจะก๊อปจากเมธอดอื่นมา) แล้วก็ได้ตามต้องการ โค้ดจะส่งข้อมูลไปหาเว็บผมแทน ผมลงแอพที่โมในมือถือทันทีและรัน ไม่นานก็ได้ข้อมูลที่ต้องการ ไม่ต้องพึ่ง Privoxy


ตอนนี้ protocol mobile.php ก็แกะมาได้พอสมควรแล้วครับ เลยทำเป็น extension KUWIN Autologin ขึ้นมา ก็เข้าไปดาวน์โหลดใช้ได้ เวลาเข้าเว็บอะไรมันจะดีดขึ้นมาว่า logging in แล้วก็ logged in ให้เข้าเว็บนั้นอีกทีก็เข้าได้เลยโดยไม่ต้องใส่รหัสผ่าน

(Chrome มันไม่มี API wifi connect อะนะครับเลยทำ auto login แบบไม่ต้องกดอะไรเลยไม่ได้ ผมจะ hold request คาไว้จนกว่าจะ login เสร็จก็ไม่ได้เพราะ sync request มันห้าม AJAX กลัวเกิด circular ซ้อนกันไปมา)

สำหรับหน้า settings ผมขี้เกียจทำก็เลยฝากเพื่อนทำ เพื่อนก็ฝากพี่ทำมาให้แบบที่เห็น ตอนแรกเป็น Comic Sans ผมเห็นแล้วปวดใจเลยแก้ๆ ได้เท่านี้ ไว้รุ่นหน้าอยากเพิ่มฟีเจอร์แล้วจะมาทำเอง (ว่าจะใส่ bandwidth log น่ะครับ)

Okay, KUWIN fixed. Next stop: nisit.kasetsart.org…

myHTC

หลายเดือนก่อน HTC Thailand เปิดตัว HTC Desire ซึ่งมาพร้อมกับโปรแกรม myHTC ซึ่งเอาไว้แข่งกับ BB โดยเฉพาะ ปรากฎว่าเขาเขียนไว้ชัดเจนว่าเฉพาะเครื่องศูนย์ประเทศไทยเท่านั้น ผมเองเลยสงสัยว่า ผมอยากได้ Nexus One เนี่ย ศูนย์ไม่เอามาขายเอง งั้นผมก็ hack ซะ ก็เลยดาวน์โหลดมาติดตั้ง โดยโหลดจาก [myhtcsite.com/apk](http://myhtcsite.com/apk)

หลังจากติดตั้งเสร็จแล้ว มันเป็น widget ก็ add ไปตามปกติครับ

เพิ่ม Widget

ใส่ไปปุ๊บ ก็ขึ้นหน้านี้ทันที

หน้าลงทะเบียน

จริงๆ ผมหา Shop ID จากเว็บนึงที่เค้าไม่ให้แจกได้นะครับ แต่ถึงใส่เข้าไปก็จริงแต่…

Error

ดังนั้น ในเมื่อเข้าประตูหน้าไม่ได้ ก็ต้องประตูหลังครับ

adb shell
sqlite3 /data/data/com.js.htc/databases/myhtc

*อ้าว เฮ้ย Java เค้าให้ใช้แพคเกจตามโดเมนที่ตัวเองเป็นเจ้าของนะครับ นี่มันอะไรใช้โดเมนคนอื่น คุณภาพระดับนี้ Market ไม่รับแน่ๆ ถึงไม่ยอมให้ device อื่นใช้*

sqlite> .schema
CREATE TABLE android_metadata (locale TEXT);
CREATE TABLE tbads (_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,add_id NUMERIC ,ad_desc TEXT,ad_count INTEGER DEFAULT 0 ,ad_max INTEGER DEFAULT 0 ,ad_promo TEXT,appg_id INTEGER, ad_click INTEGER DEFAULT 0, ad_promotype INTEGER DEFAULT 0, ad_expire DATETIME);
CREATE TABLE tbapps (app_id INTEGER PRIMARY KEY NOT NULL , app_name VARCHAR(100), app_desc VARCHAR(200), app_thumb VARCHAR(50), appg_id INTEGER, app_package VARCHAR(100), app_rev INTEGER, app_vername VARCHAR(15), app_status INTEGER);
CREATE TABLE tbdevice (shop_id VARCHAR(20), pincode VARCHAR(20), age INTEGER, genger INTEGER, lastsync_app DATETIME);

อ๊ะ tbdevice น่าสนใจ ไหนลอง

sqlite> .dump tbdevice
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE tbdevice (shop_id VARCHAR(20), pincode VARCHAR(20), age INTEGER, genger INTEGER, lastsync_app DATETIME);
COMMIT;

ไม่มีอะไรเลย ไม่เป็นไร ยัดไปเลยดีกว่า

sqlite> INSERT INTO tbdevice VALUES(“omgwtflolroflcopters”, “M79AKAC4”, 0, 0, NULL);
sqlite> .quit

แล้วก็ add widget ไปอีกที…

แจ่มมม !!
Chat ได้ด้วย

ปัญหาคือ ผมขอให้เพื่อนที่ใช้ Tattoo add เข้ามา ปรากฎว่าใช้ไม่ได้ ก็เลยไปนั่งแกะทาง backend อยู่นาน จนได้ pin มาอันนึง แต่มันทำกี่ที่ได้เลขเดิมเพราะมันล็อคกับ IMEI ครับ วิธีการที่หาคือ ผมติดตั้ง proxy server ไว้ใน server โดยเลือก privoxy จากนั้นให้มัน log request เต็มรูปแบบ แล้วผมก็กด register จะได้ URL มา ผมก็นั่งเดาอยู่นาน จนพิมพ์ผิดทำให้ argument ตกหายไปหมด ทีนี้ดันได้พินออกมา -*- (เจ๋งจริงๆ security เทพสุดในสามโลก)

ครั้นแล้ว ยังไม่สะใจ เอางี้ดีกว่า..

อ๋อ ได้…

sqlite> UPDATE tbdevice SET pincode=”S0000001″;
sqlite> .quit

(เวลาทำ อย่าลืม kill ตัว myHTC ทิ้งก่อนนะครับ ผมไม่นิยม task manager ก็ใช้ปุ่ม force stop ใน applications setting ได้)

ดี สม

(เนื่องจากว่าผมไม่ได้ต่อผ่าน proxy อะไรเลยไม่อยากแก้อะไรนะครับ ถ้าหาได้แล้วเดี๋ยวอาจจะเอา @petdo ใส่แทนเห็นคล้ายๆ กัน ;P)

เรื่องนี้สอนให้รู้ว่า Login ต้องมีรหัสเสมอนะครับ และ อย่าเชื่่อ user ^^

ปล. myHTC ใช้ polling อะ ผมว่าเด็กป. 6 ก็วางระบบระดับนี้ได้นะ (ใช้คำว่า วาง ไม่ใช่ เขียน แต่ถ้ารู้จักการใช้ภาษาต่างๆ แล้วง่ายนิดเดียว) สากลโลกเค้าใช้ socket กันแล้วคร๊าบบ

ปล2. จริงๆ แล้วสามารถเปลี่ยนเป็น PIN ใครก็ได้นะครับ จะได้ contact กับ status เค้ามาด้วยเลย เรียกได้ว่าแค่ใส่ pin เข้าไปก็ปลอมตัวได้แล้ว แจ่มไหมหละ