บทนำ (Overview)
บทความนี้นำเสนอ การเขียนโปรแกรม เกี่ยวกับการ “Copy” และ “Paste” ข้อมูลใน “Clipboard” ซึ่งข้อมูลที่ถูกเก็บไว้ที่นี้ สามารถเข้าถึงจากโปรแกรมอื่น ๆ ได้ เพราะฉะนั้นข้อมูลสำคัญใน “Textbox” หรือที่ใด ๆ ก็ไม่ควรเก็บไว้ใน “Clipboard” เพื่อป้องกันโปรแกรมไม่ประสงค์ดีแอบอ่านและส่งไปยังผู้ประสงค์ร้าย เพื่อนำไปประติดประต่อเป็นข้อมูลสำคัญ โดยที่เราอาจไม่ตั้งใจก็ได้
ขั้นตอน (Steps)
- ติดตั้งโปรแกรม How to install Android Studio เราจะใช้เพื่อเขียนโปรแกรมอ่าน “Clipboard”
- สร้าง “AVD” โดยสามารถติดตามจากบทความ How to start Android Emulator (AVD)
- เราจะสร้างโปรแกรมสำหรับอ่าน “Clipboard” เข้าไป โดยแก้ไข “Source Code” ของโปรแกรมช่องโหว่ “DIVA”
- ติดตั้งโปรแกรม sieve เพื่อใช้เป็นตัวอย่างสำหรับโปรแกรมช่องโหว่ How to install sieve.apk on Genymotion Emulator
- เปิด “Source” ของ “DIVA” เราจะสร้าง “Activity” ใหม่ขึ้นมาสำหรับอ่าน “Clipboard” คลิกขวาและเรียกเมนูตามภาพข้างล่าง
- ตั้งชื่อ “Activity” ตามใจชอบ จากนั้นกดปุ่ม “Finish”
- จากนั้นไปที่เมนู “res\layout\<activity ที่สร้างขึ้นมาใหม่>” จากนั้นคลิก “Tab Text” เพื่อสร้าง “GUI”
- เพื่อ “Controls” ปุ่มกับกล่องแสดงข้อความ ดังนี้
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/rBuffer" android:id="@+id/cmdRead" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:onClick="access"/> <TextView android:layout_height="wrap_content" android:id="@+id/txtShowBuffer" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_below="@+id/cmdRead" android:textAlignment="center" />
- ที่นี้เราจะต้องตามไปเพิ่มที่ “\value\string.xml”
<string name="rBuffer">Read Buffer</string>
- ที่นี้เราจะเพิ่มปุ่มในหน้า “Main menu” (\res\layout\content_main.xml) เพื่อเรียกใช้งาน “Activity” ใหม่ที่เราสร้าง
<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/rBuffer" android:id="@+id/cmdReadActivity" android:onClick="startChallenge" android:layout_below="@+id/d13button" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" />
- กลับมาเขียน “Intent” ที่ “MainActivity” ให้กับปุ่มหน้าจอหลักเพื่อไปเรียก “Activity” ใหม่ที่เราสร้างมา
else if (view == findViewById(R.id.cmdReadActivity)) { Intent i = new Intent(this, ReadClipBoardActivity.class); startActivity(i); }
- จากนั้นกลับไปเขียน code สำหรับการอ่าน “Clipboard” ที่ “Activity” ใหม่ที่สร้างไว้
package jakhar.aseem.diva; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Button; import android.view.View; import android.widget.TextView; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; public class ReadClipBoardActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_read_clip_board); final Button btn1 = (Button) findViewById(R.id.cmdRead); final TextView txtRead = (TextView)findViewById(R.id.txtShowBuffer); txtRead.setTextSize(30); btn1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0); txtRead.setText(item.getText().toString()); } }); } }
- โปรแกรมที่ผ่านการ “Compile” และจะอยู่ใน “Folder” ของ “\diva-android-master\app\build\outputs\apk” เราสามารถนำไป “Install” และทดสอบการอ่าน “Clipboard” ของ “Sieve” ได้ดังนี้
- เมื่อคลิกอ่าน “Password” โปรแกรมใช้วิธีการซ่อนผ่าน “Clipboard” เพื่อไม่ให้คนอื่น ๆ มองเห็น เพื่อนำใน “Paste” ใส่ “Field” ของ “Password” ได้ทันที ลองใช้โปรแกรมที่เราสร้างขึ้นมา