3.1. Thanh phan giao diện ứng dụng
3.1.1. View
Những gi có thé nhìn thấy trên màn hình thiết bi Android được gọi là View (trong Windows thường được gọi là Control), View được vẽ trên thiết bị Android với
1 hình chữ nhật.
View có | sự ràng buộc chặt chẽ với dữ liệu, ví dụ với ImageView thi dữ liệu
chính là Bitmap, hay TextView thì có dữ liệu chính là text. View sẽ dựa vào dữ liệu
dé vẽ lên màn hình Android.
View có thé tương tác với người dùng thông qua các hành động touch, drag, drop, ... với các hành động xảy ra trên View thì từ đó View sẽ được vẽ lại, thay đổi kích thước hay là thay đổi dữ liệu. Những thuộc tinh co bản của một View:
ô layout_height: thuộc tinh layout_height quy định chiều cao của View.
¢ layout_width: thuộc tinh layout_width quy định chiều rộng của View.
e id: thuộc tinh id xác định id cua View, được khai báo ở file định nghĩa giao
diện XML và sử dung lại trong code Java dé ánh xạ đối tượng, tìm kiếm các View trong code Java khi cần.
ô background: thuộc tớnh background xỏc định màu nền của View.
e margin: là khoảng cách từ các cạnh của View hiện tại tới các View khác.
ô padding: là khoảng cỏch từ cỏc cạnh của View tới phần nội dung bờn trong.
3.1.2. View Group
ViewGroup là một lớp con của View và nó sẽ hoạt động như một lớp cơ sở cho
các bố cục và tham số bố cục. ViewGroup sẽ cung cấp một vùng chứa vô hình để chứa các View hoặc ViewGroup khác và dé xác định các thuộc tính bố cục. Những
lớp con của lớp ViewGroup được gọi là Layout (hay còn được gọi là Container).
Layout hỗ trợ xây dựng kiến trúc tổng thể của giao diện như LinearLayout,
RelativeLayout, ...
36
3.1.2.1. Linear Layout
LinearLayout là một ViewGroup mà nó sắp xếp các View con theo một hướng duy nhất, theo chiều doc hoặc chiều ngang, có thé chỉ định hướng (orientation) của
nó bằng cách sử dụng thuộc tính: android:orientation.
Hình 3.1 Linear Layout được sử dung trong ứng dung thử nghiệm
3.1.2.2. Constraint Layout
Constraint Layout là một ViewGroup cho phép tạo các bố cục lớn va phức tap với hệ thống phân cấp dang xem phăng, đồng thời cũng cho phép định vi và định kích thước các widget theo cách rất linh hoạt. Nó được tạo ra dé giúp giảm bớt các chế độ xem lồng vào nhau và cũng cải thiện hiệu suất của các tệp bố cục.
3.1.2.3. Relative Layout
RelativeLayout là một ViewGroup có hiện thi các View con ở các vi tri trong
đối. Vi trí của mỗi View có thé được quy định liên quan đến các View anh em (như
bên trái của hoặc bên dưới một View khác) hoặc ở các vi trí tương đôi với khu vực
cha RelativeLayout (chang hạn như sắp xếp ngay phía đưới, bên trái hoặc trung tâm).
37
3.1.3. Button
Trong Android, Button là một "giao diện người dùng điều khiển" (user interface control), được sử dụng dé thực hiện một hành động khi người dùng nhấp (click) vào nó. Cách để thiết kế một giao diện có sử dung Button:
ô _ Thiết kế bằng XML: khai bỏo và sử dụng tập tin .xml nằm trong thư mục res
để sử dụng.
ô _ Thiết kế bằng code trực tiếp: chi cần khai bỏo trong lớp cần sử dụng.
3.1.4. ListView
ListView là một view group, hién thị các thành phần (elements) theo một danh sách, có thể cuộn được theo chiều thắng đứng. ListView là một view quan trọng, nó
được sử dụng rộng rãi trong các ứng dụng Android.
Dé tạo một ListView hiển thị thông tin thì cần 3 thành phần chính bao gồm:
ô - Listltem: Một ListView được tao từ một danh sỏch cỏc Listltem. Listltem là
một dòng riêng lẻ trong ListView nơi mà dữ liệu sẽ được hiền thị. Bat ky dữ liệu nào trong ListView chỉ được hiển thị thông qua Listltem. Có thể coi
ListView như là một nhóm cuộn của các ListItem.
+ Adapter: Một Adapter là một đối tượng của một lớp cai đặt giao diện Adapter.
Nó đóng vai trò như là một liên kết giữa một tập hợp dữ liệu và một Adapter
View, một đối tượng của một lớp thừa kế lớp trừu tượng Adapter View. Một
Adapter có trách nhiệm lấy di liệu từ bộ dữ liệu và tạo ra các đối tượng View
dựa trên dữ liệu đó. Các đối tượng View được tạo ra sau đó được sử dụng để gắn lên bất kỳ Adapter View mà ràng buộc với Adapter.
ô Data Source: Một mảng hoặc một cấu trỳc dữ liệu dạng danh sỏch, dữ liệu
chứa trong danh sách này sẽ được hiền thị trong ListView khi ứng dụng được
khởi động.
38
3.1.5. Text View
TextView là một View cho phép hiền thị các dòng chữ (text) trên màn hình,
nó có nhiều thuộc tính tùy mục đích sử dụng mà áp dụng, như thiết lập cỡ chữ, font
chữ, mau chữ ... TextView được định nghĩa bởi thẻ <TextView> trong xml.
3.1.6. EditText
Trong Android, EditText là một class con của TextView nên nó thừa kế tat cả
các tính năng của một TextView, ngoài ra nó có các tính năng mới cho phép người
dùng nhập vào hoặc sửa đổi văn bản với nhiều mục đích khác nhau, vì vậy cần phải chỉ định kiểu dữ liệu mà nó có thể chấp nhận thông qua thuộc tính android:inputType.
3.1.7. ImageView
ImageView là một View sử dụng dé hiền thị ảnh, mà nguồn ảnh có thé là một
file ảnh trên ứng dụng, trên thiết bị hoặc từ URL.
3.1.8. VideoView
VideoView là một thành phần tùy biến sẵn có của Android, nó là sự kết hợp cua MediaPlayer và Sufface View, hỗ trợ trong việc thực hiện một video dễ dàng hơn.
Sử dụng VideoView có thé dùng MediaController dé hỗ trợ, đây là một thành phan
39
có sẵn trong Android sử dụng dé điều khiển media (ví dụ như start, stop, tua, tam
dừng, ...)
3.2. Intent
3.2.1. Khai niệm
Intent là một thành phần quan trọng trong Android. Nó cho phép các thành phan ứng dụng có thé yêu cầu các hàm từ các thành phần ứng dụng Android khác [17]. Ví dụ một Activity có thể chạy một Activity khác ở bên ngoai dé chup anh.
Intent trong Android là object của class android.content.Intent. Code có thé gửi Intent đến hệ thống Android với chỉ định thành phần mục tiêu gửi đến. Ví du, thông qua startActivity() có thé xác định một Intent sử dụng dé gọi chạy một Activity
khác. Tai Activity mục tiêu, với startActivity() giúp xác định được Intent của người
gửi đến dé khởi động Activity này.
Second Activity
A
Activity open with an Intent
Hinh 3.3 M6 phong vai tro cua Intent
3.2.2. Phan loại Intent
Intent được chia làm 2 loại:
ô Explicit Intents: Intent đó được xỏc định thuộc tớnh component, nghĩa là đó
chỉ rõ thành phan sẽ nhận và xử ly intent. Thông thường intent dang này sẽ
40
không bổ sung thêm các thuộc tính khác như action, data. Explicit Intent thương được sử dụng dé khởi chạy các activity trong cùng 1 ứng dung.
Implicit Intents: Intent không chỉ rõ component xử lý, thay vào đó nó bổ sung thông tin trong các thuộc tính. Khi intent được gửi di, hệ thống sẽ dựa vào những thông tin nay dé quyết định component nào thích hợp nhất dé xử lý nó.
3.2.3. Thuộc tính của Intent
action: Hành động được thực hiện, vi dụ: ACTION_VIEW, ACTION_MAIN.
data: Phần dữ liệu sẽ được xử lý trong action, thường được diễn tả là một Uri
(Uniform Resource Identifier).
category: Bồ sung thêm thông tin cho action của Intent. Vi du:
CATEGORY_LAUNCHER thông báo sẽ thêm vào Launcher như là một ứng
dụng top-level.
type: Chi rõ kiéu cua data.
component: Chi rõ thành phan sẽ nhận và xử ly intent. Khi thuộc tính nay
được xác định thì các thuộc tính khác sẽ trở thành thuộc tính phụ.
extras: Mang theo đối tượng Bundle chứa các giá trị bỗ sung.
3.3. Chức năng hiện có của ứng dụng
Chức năng tạo tài khoản đăng nhập và sử dụng những thông tin tài khoản đã
được lưu dé khai thác các chức năng của ứng dụng.
Chức năng gửi tin nhắn SMS: chức năng này bao gồm 2 lựa chọn. Lựa chọn thứ nhất là gửi SMS không sử dụng intent mà sử dụng một lớp có sẵn trong Android là SMSManager dé gui truc tiép. Lua chon thứ hai là sử dung intent không tường minh gửi đến hệ thống Android dé yêu cầu gửi tin nhắn.
Chức năng Mobile Banking: mô phỏng một ứng dụng ngân hàng hoặc ví điện
tử trong thực tế. Người dùng sẽ phải đăng nhập bằn một mã PIN được ngân hàng đang sử dụng cung cấp sẵn từ trước để xác thực.
41
Hình 3.4 Giao diện lựa chọn chức năng của ứng dụng thử nghiệm
Chức năng tải về một bức ảnh từ URL nhập vào và hiển thị lên cửa số ứng dụng. Lưu ý chức năng này tương đương với chức năng tải về một trang web
dưới dang html từ URL.
Chức năng sử dụng camera: dùng Intent dé mở camera của thiết bị dé chụp ảnh hoặc quay video và lưu lại trong bộ nhớ của thiết bị.
Chức năng mở lịch để xem ngày tháng với ngày cần xem được nhập vào từ cửa số ứng dụng.
Chức năng hẹn giờ báo thức băng với thời gian số giờ và số phút được nhập
từ cửa số ứng dụng.
Tất cả những chức năng nêu trên schi là phiên bản thử nghiệm trong phạm vi của khóa luận tốt nghiệp nên mục tiêu được xây dựng dùng dé làm môi trường phục vụ cho việc kiểm tra xem giải pháp giám sát hành vi hoạt động như thé
nào là chủ yêu.
42
Chương 4. XÂY DỰNG HE THONG GIAM SÁT HANH VI UNG DỤNG
4.1. Frida
4.1.1. Đánh giá khả năng giám sat
Frida là một bộ công cụ khai thác động được sử dụng dé triển khai các tập lệnh vào quá trình thử nghiệm của apk. Frida cung cấp APIs cho các nhà phát triển đề tạo các công cụ trên đó. Frida là một công cụ cực mạnh, dùng được Frida thì gần như có thé điều khiển toàn bộ ứng dụng. Tuy nhiên do cấu trúc của Frida gồm hai phan là client và server nên trong phạm vi của khóa luận này nhóm tác giả chỉ có thể giám sát ứng dụng từ máy tính cá nhân thay vì có thê xây dựng một ứng dụng khác sử dụng framework này dé có thé chạy hoàn toàn độc lập trên thiết bi Android cần giám sát.
Với hình thức giám sát từ xa qua máy tính thì nhóm tác giả đóng vai trò như
một người lập trình viên hoặc người quản trị hệ thống dé có thé theo dõi những bat thường có thê xảy ra trên ứng dụng thử nghiệm trong một khoảng thời gian nhất định
và có các cách ứng phó phù hop.
4.1.2. Thuc hiện triển khai và mô phỏng một số chức năng
4.1.2.1. Thực hiện hooking phương thức startActivity
Day là một phương thức rất thường xuyên được sử dụng và gần như không thé thiếu trong các class của Android. Trong Android dé chuyên activity có thé sử phương thức startActivityQ với đối số truyền vào là một Intent. Thông qua phương thức startActivity(), có thé định nghĩa một Intent sử dụng dé gọi chạy một Activity khác.
Tại Activity mục tiêu, thông qua phương thức startActivity() có thể xác định được ý định của người gửi đến dé khởi động Activity này.
Do vậy khi thực hiện hooking phương thức startAcivityQ, dựa vào đó có thể xác định được những Intent nào đã được gọi, và thông tin về những activity liên quan.
43
Đây là mã nguôn của đoạn script được sử dụng đê chèn vào và thực hiện hooking.
console.log("Script loaded successfully!");
Java.perform(function () {
var Activity = Java.use("android.app.Activity");
n(p1){
console.log("Hooking android.app.Activity.startActivity(p1) successfully,pl="+p1);
console.log(decodeURIComponent(p1.toUri(256)));
this.startActivity(p1);
Activity.startService.overload(‘android.content.Intent').implementation=functio
n(pl){
console.log("Hooking android.app.Activity.startService(p1) successfully,pl="+p1);
console.log(decodeURIComponent(p1.toUri(256)));
this.startService(p1);
Hình 4.1 Mã nguồn JavaScript dùng dé hook phương thức startActivity()
Trong ví dụ trên đây khi nhóm tác giả thực hiện hooking startActivityQ đối với ứng dụng được xây dựng ở trên, dễ dàng thấy khi thực hiện đăng nhập vào hệ
44
thống xong thì HomeActivity được gọi hay khi ứng dung Calendar vừa mở lên thì xuất hiện phương thức chứa Intent sử dụng dé mở lịch.
shhv@ubuntu: ~
File Edit View Search Terminal Help
shhv@ubuntu:~$ frida -U com.example.demoappkltn -L hookStartActivity.js --no-pau
Frida 14.2.17 - A world-class dynamic instrumentation toolkit
Commands:
help -> Displays the help system object? -> Display information about ‘object' exit/quit -> Exit
More info at https://frida.re/docs/home/
at android. view. View. performClick( View. java:7259)
at com.google.android.material.button.MaterialButton.performClick(Materi
a LButton. java:1119)
at android.view. View. performClickInternal(View. java: 7236)
at android.view. View. access$3600(View. java:801)
Hình 4.2 Kết qua log thu được khi hook phương thức startActivity()
4.1.2.2. Tìm và liệt kê tat cả những lớp (class) đang được sử dung
Các lớp (class) mô tả về những đối tượng (instance) sẽ được tạo ra trong quá
trình ứng dụng chạy. Mỗi lớp có tên lớp, trong lớp có các thuộc tính như là dữ liệu
của lớp và phương thức của lớp đó.
Sau khi tìm được tên thì có thể thực hiện tìm kiếm những lớp liên quan đang được sử dụng, có thé khang định được hầu hết những chức năng dang có của ứng dụng thông qua việc tìm hiểu kiến trúc hệ thống xây dựng từ những class đó.
Cụ thể, nếu một ứng dụng có sử dung class Telephony, ứng dụng đó có thé sử dụng dịch vụ tin nhắn SMS và MMS bao gồm cả dịch vụ nhắn tin đa phương tiện
(MMSC) và danh sách Access Point Name.
45
Sau đây mà mã nguồn của đoạn script dùng dé tìm theo tên hoặc tìm tat cả
những lớp (class) đang được sử dụng bởi ứng dụng.
console.log("Script loaded successfully!");
function printClass(pattern) {
console.warn("\n*** finding all classes that match pattern: " + pattern + "\n");
var allClasses = Java.enumerateLoadedClassesSync();
allClasses.forEach(function(my_Class) {
if (my_Class.match(pattern))
console.log(my_Class);
}
setTimeout(function() {
printClass(); // print all loaded classes
//printClass("calendar"); // print all classes that match a string //printClass(/root/i); // print all classes that match a regex
Hinh 4.3 Ma nguồn JavaScript dùng dé liệt kê Class được sử dụng
Và kết quả thu được với trường hợp tìm tất cả những lớp có liên quan tới ứng
dụng đang chạy.
46
shhv(@ubuntu: ~
Terminal Help -U -f com.example.demoa
More info at https ida. /docs/home/
. -$SLambdaSTmsManager SConn ‹ r]FZH5o1
- -§SLambda Dðo3matefQqo-6
„ ImsManaqe
. -5SLambd onnecto k - 30L-BmtP3M
>. ImsEcbm$ImsEcbmListenerProxy
elFeatureco n$IFeature . Manager
.-$SLambdaSImsManagerS$YhRaDrc3t9_7beNiUS5gQcqZ W -ImsEcbm
. -SSLambdaSTmsManager $F Lxe430UFnnUOpgnksvwPE603Mk
Hình 4.4 Danh sách lớp đã được liệt kê
4.1.2.3. Thực hiện hooking sự kiện onClick
onClick là sự kiện được kích hoạt khi người dùng nhấn vào một View nào đó
và thông thường View được nhấn là nút lệnh (Button). Một View bat kỳ đều có sự kiện onClick. Sự kiện onClick được dùng phô biến nhất được dùng cho các ứng dụng.
setOnClickListener: gan một sự kiện onClick vào trong một View nao đó không
riêng gì Button, có thé là EditText, ImageView, TextView... đa phan tat cả các View đều có sự kiện. Khi gán cho nó sự kiện onClick như vậy thì nó sẽ lắng nghe xem có
ai thao tác click vào nó không, nếu có nó sẽ chạy ngay vào hàm onClick(View view) bên dưới dé xử lý.
Khi nhóm tác giả thực hiện hooking sự kiện này thì có thê biết được người dùng
đang thao tác gì bên trong ứng dụng. Từ đó đưa ra các nhận xét hay cảnh báo cho
47
người dùng nêu như các sự kiện onClick có chạy ngâm hoặc đang sử dụng tài nguyên
không được phép. Đây là mã nguồn mô phỏng việc hooking sự kiện onClick.
function OnClickListener() {
Java.perform(function () {
Java.use("android.view. View").setOnClickListener.implementation = function (listener) {
if (listener != null) {
watch(listener, onClick);
}
return this.setOnClickListener(listener);
b
onMatch: function (instance) {
instance = instance.mOnClickListener.value;
if (instance) {
console.log("OnClickListener name is :" + getObjClassName(instance)); watch(instance, 'onClick');
}
onComplete: function () {
Hình 4.5 Mã nguồn JavaScript dùng dé hook sự kiện onClick
Và kết quả nhận được khi thực hiện liên tục các thao tác trên ứng dụng với các chức năng khác nhau thì sẽ thu được những phản hồi khác nhau với cùng sự kiện
48
onClick. Khi đóng vai trò là người quản tri và phát triển hệ thống, các nhà phân tích hoàn toàn biết được và nắm rõ được ứng dụng đang chạy có phải là một ứng dụng tốt
hay không.
shhv@ubuntu: ~
using Frida!
frida -U -f com.examp ›appk
Frida 14.2.17 - A world-class dynamic instrumentation to
Commands:
More info at https://frida. s/home/
camp1 emoappkttn.
emoappktLtn.
-HomeActivi . SetALarmAc -HomeActir WatchEvent]
Hình 4.6 Kết quả thu được sau những lần sự kiện onClick được gọi 4.1.2.4. Sử dung Frida để khai thác tính năng Mobile Banking
Trong ứng dụng có một tính năng rất quan trọng trong thời điểm cuộc sống chuyên đổi số hiện nay là tính năng Mobile Banking. Tinh năng này mô phỏng việc truy cập vào tài khoản ngân hàng của người dùng và cần xác thực trước bằng một mã PIN được cấp sẵn.
49
Hình 4.7 Màn hình xác thực mã PIN
Dé có thé bỏ qua bước xác thực mã PIN, Frida được dùng dé hook hàm
checkPINQ chứa trong class MobileBankingActivity va sau đó ghi đẻ lên hàm này
bằng một hàm khác mà có khả năng trả về kết quả đúng với bất cứ dữ liệu đầu vào nào. Cách này giúp các nhà phân tích có thể vượt qua những hàm kiểm tra hoặc mã hóa khác khi phân tích được chúng trong mã nguồn ứng dụng. Hiện tại với các ứng dụng liên quan tới tài khoản ngân hàng hoặc ví điện tử thì mã PIN 4 chữ số và 6 chữ
số được sử dụng rất phé biến. Trong các ứng dụng này, mã PIN thường được dùng
dé xác thực quyên truy cập, xác nhận giao dịch chuyền tiền, thanh toán dịch vu, ... . Chính vì vậy, đây là một mục tiêu tấn công ưu tiên hàng đầu của tin tặc và cùng là đối tượng nghiên cứu chính của những nhà quan lý ứng dụng. Và hình dưới đây là
kết quả nhận được khi thực hiện thao tác này.
50