บทนำ (Overview)
จากบทความก่อนหน้าเราได้นำเสนอวิธีการหลบหลีกการ “Login” โดยการใช้วิธีการเรียกว่า “Method Swizzling”
โดยจะใช้โปรแกรม Frida ในการ Hook method จากการที่ User กดปุ่ม Login จากนั้นเราจะเรียกใช้งาน Method ที่เราสนใจตรงๆ ได้ดังนี้
ขั้นตอน (Steps)
ติดตั้งโปรแกรมสำหรับการทดสอบ
- ติดตั้ง Frida ดังบทความต่อไปนี้
- สำหรับเครื่อง Jailbreak How to install Appmon on MACOS
- สำหรับเครื่องไม่ Jailbreak How to setup AppMon for a non jailbroken iOS device
- ติดตั้งโปรแกรม “DVIA” จากนั้นไปที่รายการ “Runtime manipulation” และเลือก “Login Method1″
- จากนั้นเข้าใช้งาน Frida โดยใช้คำสั่งดังนี้
//ตรวจสอบชื่อ Application ที่ Run อยู่บนเครื่อง iOS frida-ps -U //ใช้ Frida เชื่อมต่อ Process ของ Application ที่เราต้องทดสอบ frida -U Gadget
ค้นหา Classes และ Method ที่สนใจ
- ตรวจสอบชื่อ Class และ Method โดยใช้วิธีดังต่อไปนี้
- จากการ Reverse Engineering เราสนใจ Class ที่ชื่อ RuntimeManipulationDetailsVC และ Method ที่ชื่อ isLoginValidated
@interface RuntimeManipulationDetailsVC : UIViewController { @private UITextField* _usernameTextField; UITextField* _passwordTextField; UITextField* _codeTextField; NSString* _urlToLoad; UIScrollView* _mainScrollView; } @property(assign, nonatomic) __weak UIScrollView* mainScrollView; @property(retain, nonatomic) NSString* urlToLoad; @property(assign, nonatomic) __weak UITextField* codeTextField; @property(retain, nonatomic) UITextField* passwordTextField; @property(retain, nonatomic) UITextField* usernameTextField; +(BOOL)validateCode:(int)code; -(void).cxx_destruct; -(void)validateCodeTapped:(id)tapped; -(void)readTutorialTapped:(id)tapped; -(void)showLoginFailureAlert; -(void)pushSuccessPage; -(BOOL)isLoginValidated; -(void)loginMethod2Tapped:(id)tapped; -(void)loginMethod1Tapped:(id)tapped; -(void)didReceiveMemoryWarning; -(void)viewDidLoad; -(id)initWithNibName:(id)nibName bundle:(id)bundle; @end
เขียนโปรแกรมเพื่อเชื่อมต่อกับ Frida
- เราสามารถเขียน Javascript ให้เรียกใช้งาน Function ดังกล่าวดังนี้
if (ObjC.available) { try { var className = "RuntimeManipulationDetailsVC"; var funcName = "- isLoginValidated"; var hook = eval('ObjC.classes.' + className + '["' + funcName + '"]'); console.log("Start on Run Javascripts"); Interceptor.attach(hook.implementation, { onEnter: function(args) { console.log("Enter"); var aa = new ObjC.Object(args[0]); aa.pushSuccessPage(); } }); } catch(err) { console.log("[!] Exception2: " + err.message); } } else { console.log("Objective-C Runtime is not available!"); }
- เมื่อสร้าง Script เสร็จเรียบร้อย ให้บันทึกลงไฟล์นามสกุล .js เราสามารถเรียกใช้งานโดยใช้คำสั่งดังนี้
//frida -U -l Script_file_name Application_name frida -U -l a.js Gadget
- ที่นี้ลองคลิก “Login Method 1” อีกครั้งจะพบว่าสามารถ “Login” ผ่านโดยไม่ต้องกรอก “username” และ “password”