- 07/04/2024
- admin
Ứng dụng Android-Đảo ngược-101
Ứng dụng Android-Đảo ngược-101
Mỗi ngày, chúng ta thấy một loạt ứng dụng Android mới được xuất bản trên Cửa hàng Google Play, từ trò chơi, tiện ích, ứng dụng khách thiết bị IoT, v.v., hầu hết mọi khía cạnh trong cuộc sống của chúng ta đều có thể được kiểm soát bằng cách nào đó bằng “một ứng dụng”. Chúng ta có nhà thông minh, thiết bị thể dục thông minh và máy pha cà phê thông minh … nhưng liệu những thứ này chỉ thông minh hay còn an toàn ?🙂
Đảo ngược ứng dụng Android có thể là một cách (tương đối) dễ dàng và thú vị để trả lời câu hỏi này, đó là lý do tại sao tôi quyết định viết bài đăng blog này, nơi tôi sẽ cố gắng giải thích những điều cơ bản và cung cấp cho bạn một số “thủ thuật” của tôi để đảo ngược nội dung này nhanh hơn và hiệu quả hơn.
Tôi sẽ không đi sâu vào chi tiết kỹ thuật, bạn có thể tự tìm hiểu cách Android hoạt động, cách hoạt động của máy ảo Dalvik, v.v., đây sẽ là một hướng dẫn thực hành rất cơ bản thay vì một bài đăng đầy nội dung lý thuyết nhưng thực sự không phải vậy. nội dung hữu ích.
Hãy bắt đầu!🙂
bắt đầu
Điều kiện tiên quyết
Để làm theo phần giới thiệu này về việc đảo ngược APK, cần có một số điều kiện tiên quyết:
Một bộ não đang hoạt động (tôi không coi điều này là đương nhiên nữa…).
Một điện thoại thông minh Android ( doh! ).
Bạn có kiến thức cơ bản về ngôn ngữ lập trình Java (bạn sẽ hiểu nếu đọc nó).
Bạn đã cài đặt JRE trên máy tính của mình.
Bạn đã cài đặt adb .
Bạn đã bật Developer Options và USB Debugging kích hoạt trên điện thoại thông minh của mình.
APK là gì?
Ứng dụng Android được đóng gói dưới dạng tệp APK ( Gói Android ), về cơ bản là tệp ZIP chứa mã được biên dịch, tài nguyên, chữ ký, bảng kê khai và mọi tệp khác mà phần mềm cần để chạy. Là một tệp ZIP, chúng ta có thể bắt đầu xem nội dung của nó bằng unzip tiện ích dòng lệnh (hoặc bất kỳ trình giải nén nào khác mà bạn sử dụng):
unzip application.apk -d application
Đây là những gì bạn sẽ tìm thấy bên trong một APK.
/AndroidManifest.xml (file)
Đây là biểu diễn nhị phân của tệp kê khai XML mô tả những quyền mà ứng dụng sẽ yêu cầu (hãy nhớ rằng một số quyền có thể được ứng dụng yêu cầu trong thời gian chạy và không được khai báo ở đây), những hoạt động nào ( GUI ) có trong đó, những gì dịch vụ (nội dung chạy nền không có giao diện người dùng) và người nhận nào (các lớp có thể nhận và xử lý các sự kiện hệ thống như khởi động thiết bị hoặc SMS đến).
Sau khi được giải mã (sẽ nói thêm về điều này sau), nó sẽ trông như thế này:
1
2
3
4
5
6
7
số 8
9
10
11
12
13
14
15
16
17
18
19
< bảng kê khai xmlns:android = “ http://schemas.android.com/apk/res/android” ; gói = “com.company.appname” platformBuildVersionCode = “24” platformBuildVersionName = “7.0” >
< quyền sử dụng android:name = “android.permission.WRITE_EXTERNAL_STORAGE” />
< quyền sử dụng android:name = “android.permission.INTERNET” />
< ứng dụng android:allowBackup = “true” android:icon = “@mipmap/ic_launcher” android:label = “@string/app_name” android:supportsRtl = “true” android:theme = “@style/AppTheme” >
< hoạt động android:name = “com.company.appname.MainActivity” >
< bộ lọc ý định >
< hành động android:name = “android.intent.action.MAIN” />
< danh mục android:name = “android.intent.category.LAUNCHER” />
</ ý định lọc >
</ hoạt động >
</ ứng dụng >
</ bảng kê khai >
Hãy nhớ rằng đây là điểm khởi đầu hoàn hảo để tách biệt các “điểm vào” của ứng dụng, cụ thể là các lớp bạn sẽ đảo ngược trước tiên để hiểu logic của toàn bộ phần mềm. Ví dụ: trong trường hợp này, chúng tôi sẽ bắt đầu kiểm tra com.company.appname.MainActivity lớp được khai báo là giao diện người dùng chính cho ứng dụng.
/assets/* ( folder )
Thư mục này sẽ chứa các tệp cụ thể của ứng dụng, như tệp wav mà ứng dụng có thể cần phát, phông chữ tùy chỉnh, v.v. Việc đảo ngược thông minh thường không quan trọng lắm, tất nhiên trừ khi bạn tìm thấy bên trong các tài liệu tham khảo chức năng của phần mềm đối với các tệp như vậy.
/res/* ( folder )
Tất cả các tài nguyên, như tệp xml hoạt động, hình ảnh và kiểu tùy chỉnh đều được lưu trữ ở đây.
/resources.arsc ( file )
Đây là “chỉ mục” của tất cả các tài nguyên, nói ngắn gọn là, tại mỗi tệp tài nguyên được gán một mã định danh bằng số mà ứng dụng sẽ sử dụng để xác định mục nhập cụ thể đó và tệp resources.arsc sẽ ánh xạ các tệp này tới mã định danh của chúng… không có gì thú vị cả Nó.
/classes.dex ( file )
Tệp này chứa mã byte Dalvik (máy ảo chạy ứng dụng Android) của ứng dụng, hãy để tôi giải thích rõ hơn. Một ứng dụng Android (hầu hết) được phát triển bằng ngôn ngữ lập trình Java. Các tệp nguồn java sau đó được biên dịch thành mã byte này mà máy ảo Dalvik cuối cùng sẽ thực thi… gần như những gì xảy ra với các chương trình Java thông thường khi chúng được biên dịch thành .class các tệp.
Tóm lại, tệp này chứa logic, đó là điều chúng tôi quan tâm.
Đôi khi, bạn cũng sẽ tìm thấy một classes2.dex tệp, điều này là do định dạng DEX có giới hạn về số lượng lớp bạn có thể khai báo bên trong một tệp dex duy nhất, tại một thời điểm nào đó trong lịch sử, các ứng dụng Android ngày càng lớn hơn và vì vậy Google phải làm vậy điều chỉnh định dạng này, hỗ trợ .dex tệp phụ nơi các lớp khác có thể được khai báo.
Theo quan điểm của chúng tôi, điều đó không thành vấn đề, các công cụ chúng tôi sắp sử dụng có thể phát hiện nó và thêm nó vào quy trình dịch ngược.
/libs/ ( folder )
Đôi khi một ứng dụng cần thực thi mã gốc, nó có thể là thư viện xử lý hình ảnh, công cụ trò chơi hoặc bất cứ thứ gì. Trong trường hợp như vậy, .so các thư viện ELF đó sẽ được tìm thấy bên trong libs thư mục, được chia thành các thư mục con theo kiến trúc cụ thể (vì vậy ứng dụng sẽ chạy trên ARM, ARM64, x86, v.v.).
/META-INF/ ( folder )
Mọi ứng dụng Android cần phải được ký bằng chứng chỉ nhà phát triển để chạy trên thiết bị, ngay cả các bản dựng gỡ lỗi cũng được ký bằng chứng chỉ gỡ lỗi, thư META-INF mục chứa thông tin về các tệp bên trong APK và về nhà phát triển.
Trong thư mục này, bạn thường sẽ tìm thấy:
Tệp MANIFEST.MF có hàm băm SHA-1 hoặc SHA-256 của tất cả các tệp bên trong APK.
Một CERT.SF tệp khá giống MANIFEST.MF nhưng được ký bằng RSA khóa.
Một CERT.RSA tệp chứa khóa chung của nhà phát triển được sử dụng để ký vào CERT.SF tệp và thông báo.
Những tệp đó rất quan trọng để đảm bảo tính toàn vẹn của APK và quyền sở hữu mã. Đôi khi việc kiểm tra chữ ký như vậy có thể rất hữu ích để xác định ai thực sự đã phát triển APK nhất định. Nếu bạn muốn lấy thông tin về nhà phát triển, bạn có thể sử dụng openssl tiện ích dòng lệnh:
openssl pkcs7 -in /path/to/extracted/apk/META-INF/CERT.RSA -inform DER -print
Điều này sẽ in một kết quả như:
PKCS7:
type: pkcs7-signedData (1.2.840.113549.1.7.2)
d.sign:
version: 1
md_algs:
algorithm: sha1 (1.3.14.3.2.26)
parameter: NULL
contents:
type: pkcs7-data (1.2.840.113549.1.7.1)
d.data:
cert:
cert_info:
version: 2
serialNumber: 10394279457707717180
signature:
algorithm: sha1WithRSAEncryption (1.2.840.113549.1.1.5)
parameter: NULL
issuer: C=TW, ST=Taiwan, L=Taipei, O=ASUS, OU=PMD, CN=ASUS AMAX Key/emailAddress=admin@asus.com
validity:
notBefore: Jul 8 11:39:39 2013 GMT
notAfter: Nov 23 11:39:39 2040 GMT
subject: C=TW, ST=Taiwan, L=Taipei, O=ASUS, OU=PMD, CN=ASUS AMAX Key/emailAddress=admin@asus.com
key:
algor:
algorithm: rsaEncryption (1.2.840.113549.1.1.1)
parameter: NULL
public_key: (0 unused bits)
…
…
…
Đây có thể là vàng đối với chúng tôi, chẳng hạn như chúng tôi có thể sử dụng thông tin này để xác định xem một ứng dụng có thực sự được ký bởi (giả sử) Google hay không hoặc liệu nó đã bị bên thứ ba từ bỏ, do đó được sửa đổi.
Làm cách nào để có được APK của một ứng dụng?
Bây giờ chúng ta đã có ý tưởng cơ bản về những gì chúng ta phải tìm thấy bên trong APK, chúng ta cần một cách để thực sự lấy được tệp APK của ứng dụng mà chúng ta quan tâm. Có hai cách, bạn cài đặt vào máy và sử dụng adb để tải hoặc sử dụng dịch vụ trực tuyến để tải xuống.
Kéo một ứng dụng bằng ADB
Trước hết, hãy cắm điện thoại thông minh của chúng ta vào cổng USB trên máy tính và nhận danh sách các gói đã cài đặt cũng như không gian tên của chúng:
adb shell pm list packages
Điều này sẽ liệt kê tất cả các gói trên điện thoại thông minh của bạn, khi bạn đã tìm thấy không gian tên của gói bạn muốn đảo ngược ( com.android.systemui trong ví dụ này), hãy xem đường dẫn vật lý của nó là gì:
adb shell pm path com.android.systemui
Cuối cùng chúng ta có đường dẫn APK:
package:/system/priv-app/SystemUIGoogle/SystemUIGoogle.apk
Hãy kéo nó ra khỏi thiết bị:
adb pull /system/priv-app/SystemUIGoogle/SystemUIGoogle.apk
Và đây, bạn có APK mà bạn muốn đảo ngược!
Sử dụng dịch vụ trực tuyến
Có nhiều dịch vụ trực tuyến nếu bạn không muốn cài đặt ứng dụng trên thiết bị của mình (ví dụ: nếu bạn đang đảo ngược phần mềm độc hại, bạn muốn bắt đầu có tệp trước, sau đó chỉ cài đặt trên thiết bị sạch), đây là danh sách những cái tôi sử dụng:
Apk-DL
Trình tải xuống Evozi
Apk Leecher
Hãy nhớ rằng sau khi tải xuống APK từ các dịch vụ này, bạn nên kiểm tra chứng chỉ nhà phát triển như được hiển thị trước đó để chắc chắn 100% rằng bạn đã tải xuống đúng APK chứ không phải một số nội dung được đóng gói lại và từ chức chứa đầy quảng cáo và có thể là phần mềm độc hại .
Phân tích mạng
Bây giờ chúng ta bắt đầu với một số thử nghiệm để hiểu ứng dụng đang làm gì trong khi thực thi. Thử nghiệm đầu tiên của tôi thường bao gồm việc kiểm tra lưu lượng truy cập mạng do chính ứng dụng tạo ra và để làm được điều đó, công cụ tôi lựa chọn là Bettercap … à, đó là lý do tại sao tôi phát triển nó ngay từ đầu😛
Đảm bảo bạn đã cài đặt Bettercap và cả máy tính và thiết bị Android của bạn đều nằm trên cùng một mạng wifi, sau đó bạn có thể khởi động MITM-ing điện thoại thông minh ( 192.168.1.5 trong ví dụ này) và xem lưu lượng truy cập của nó trong thời gian thực từ thiết bị đầu cuối:
sudo bettercap -T 192.168.1.5 -X
Tùy chọn này -X sẽ kích hoạt trình thám thính, ngay khi khởi động ứng dụng, bạn sẽ thấy một loạt máy chủ HTTP và/hoặc HTTPS đang được liên hệ, bây giờ bạn đã biết ứng dụng đang gửi dữ liệu đến ai, bây giờ hãy xem nó đang gửi dữ liệu gì :
sudo bettercap -T 192.168.1.5 –proxy –proxy-https –no-sslstrip
Điều này sẽ chuyển từ chế độ đánh hơi thụ động sang chế độ ủy quyền. Tất cả lưu lượng HTTP và HTTPS sẽ bị chặn (và nếu cần, sẽ được sửa đổi) bởi Bettercap.
Nếu ứng dụng sử dụng khóa công khai đúng cách ( như mọi ứng dụng nên làm ), bạn sẽ không thể thấy lưu lượng HTTPS của ứng dụng đó, nhưng thật không may, theo kinh nghiệm của tôi, điều này chỉ xảy ra với một số lượng rất nhỏ ứng dụng.
Từ giờ trở đi, hãy tiếp tục kích hoạt các hành động trên ứng dụng trong khi kiểm tra lưu lượng truy cập (bạn cũng có thể sử dụng Wireshark song song để lấy PCAP tệp chụp để kiểm tra sau) và sau một thời gian, bạn sẽ có ý tưởng ít nhiều đầy đủ về giao thức mà nó đang sử dụng và cho mục đích gì.
mũ tốt hơn
Phân tích tĩnh
Sau khi phân tích mạng, chúng tôi đã thu thập một loạt URL và gói, chúng tôi có thể sử dụng thông tin này làm điểm bắt đầu, đó là những gì chúng tôi sẽ tìm kiếm khi thực hiện phân tích tĩnh trên ứng dụng. “Phân tích tĩnh” có nghĩa là bạn sẽ không thực thi ứng dụng ngay bây giờ mà chỉ nghiên cứu mã của nó. Trong hầu hết các trường hợp, đây là tất cả những gì bạn cần để đảo ngược điều gì đó.
Có nhiều công cụ khác nhau mà bạn có thể sử dụng cho mục đích này, hãy xem những công cụ phổ biến nhất.
apktool
APKTool là công cụ đầu tiên bạn muốn sử dụng, nó có khả năng dịch ngược tệp AndroidManifest sang định dạng XML ban đầu, tệp resources.arsc và nó cũng sẽ chuyển đổi tệp classes.dex (và classes2.dex nếu có) sang ngôn ngữ trung gian được gọi là SMALI, một ngôn ngữ giống ASM được sử dụng để thể hiện các mã máy ảo Dalvik như một ngôn ngữ có thể đọc được.
Nó có vẻ như:
1
2
3
4
5
6
7
số 8
.super Ljava/lang/Object;
.method public static main([ Ljava/lang/String; )V
.đăng ký 2
sget-object v0, Ljava/lang/System; ->out: Ljava/io/PrintStream;
const-string v1, “Xin chào thế giới!”
gọi-ảo {v0, v1}, Ljava/io/PrintStream; ->println( Ljava/lang/String; )V
trả lại khoảng trống
phương thức .end
Nhưng đừng lo lắng, trong hầu hết các trường hợp, đây không phải là ngôn ngữ cuối cùng bạn sẽ đọc để đảo ngược ứng dụng😉
Đưa ra một APK, dòng lệnh này sẽ dịch ngược nó:
apktool d application.apk
Sau khi hoàn tất, application thư mục sẽ được tạo và bạn sẽ tìm thấy tất cả đầu ra của apktool trong đó.
Bạn cũng có thể sử dụng apktool để dịch ngược một APK, sửa đổi nó rồi biên dịch lại nó (như tôi đã làm với ứng dụng Nike+ chẳng hạn để có thêm nhật ký gỡ lỗi), nhưng trừ khi các công cụ khác không dịch ngược được, bạn sẽ không thể dịch ngược được. cần đọc smali mã để đảo ngược ứng dụng, hãy chuyển sang các công cụ khác ngay bây giờ😉
jADX
Bộ jADX cho phép bạn chỉ cần tải APK và xem mã nguồn Java của nó. Điều đang diễn ra ẩn giấu là jADX đang dịch ngược APK thành smali và sau đó chuyển đổi smali trở lại Java. Không cần phải nói, đọc code Java dễ hơn nhiều so với đọc smali như tôi đã đề cập.🙂
Sau khi tải APK, bạn sẽ thấy giao diện người dùng như thế này:
jADX
Một trong những tính năng tốt nhất của jADX là tìm kiếm chuỗi/ký hiệu ( nút ) cho phép bạn tìm kiếm URL, chuỗi, phương thức và bất kỳ thứ gì bạn muốn tìm bên trong cơ sở mã của ứng dụng.
Ngoài ra, còn có Find Usage tùy chọn menu, chỉ cần đánh dấu một số biểu tượng và nhấp chuột phải vào nó, tính năng này sẽ cung cấp cho bạn danh sách mọi tham chiếu đến biểu tượng đó.
Dex2Jar và JD-Gui
Tương tự như jADX là các công cụ dex2jar và JD-GUI , sau khi cài đặt, bạn sẽ sử dụng dex2jar để chuyển đổi APK thành tệp JAR:
/path/to/dex2jar/d2j-dex2jar.sh application.apk
Khi bạn có tệp JAR, chỉ cần mở nó bằng JD-GUI và bạn sẽ thấy mã Java của nó, khá giống jADX:
JD-GUI
Thật không may, JD-GUI không có nhiều tính năng phong phú như jADX, nhưng đôi khi khi một công cụ này bị lỗi bạn phải thử công cụ khác và hy vọng sẽ may mắn hơn.
JEB
Phương sách cuối cùng của bạn là bạn có thể thử trình dịch ngược JEB . Đây là một phần mềm rất tốt, nhưng tiếc là nó không miễn phí, có phiên bản dùng thử nếu bạn muốn dùng thử, đây là giao diện của nó:
JEB
JEB cũng có trình phân tách ARM (hữu ích khi có thư viện gốc trong APK) và trình gỡ lỗi ( rất hữu ích cho phân tích động), nhưng một lần nữa, nó không miễn phí và không rẻ.
Phân tích tĩnh của các nhị phân gốc
Như đã đề cập trước đó, đôi khi bạn sẽ tìm thấy các thư viện gốc ( .so đối tượng được chia sẻ) bên trong lib thư mục của APK và trong khi đọc mã Java, bạn sẽ tìm thấy native các khai báo phương thức như sau:
1
Chuỗi gốc công khaiFromJNI () ;
Từ native khóa có nghĩa là việc triển khai phương thức không nằm trong dex tệp mà thay vào đó, nó được khai báo và thực thi từ mã gốc thông qua cái được gọi là a Java Native Interface hoặc JNI .
Gần với các phương thức gốc, bạn cũng sẽ thường tìm thấy một cái gì đó như thế này:
1
System.loadLibrary( “xin chào-jni” );
Điều này sẽ cho bạn biết phương thức này được triển khai ở thư viện gốc nào. Trong những trường hợp như vậy, bạn sẽ cần một trình dịch ngược ARM (hoặc x86 nếu có thư mục con x86 bên trong thư libsmục) để đảo ngược đối tượng gốc.
IDA
Trình dịch ngược và dịch ngược đầu tiên mà mọi trình đảo ngược tốt nên biết đến là Hex-Rays IDA , đây là công cụ đảo ngược hiện đại dành cho mã gốc. Cùng với giấy phép IDA, bạn cũng có thể mua giấy decompiler phép, trong trường hợp đó IDA cũng sẽ có thể xây dựng lại mã giả giống C từ hợp ngữ, cho phép bạn đọc biểu diễn logic thư viện ở cấp độ cao hơn.
IDA
Thật không may, IDA là một phần mềm rất đắt tiền và, trừ khi bạn đang đảo ngược nội dung gốc một cách chuyên nghiệp, thực sự không đáng để chi tất cả số tiền đó cho một công cụ duy nhất… warez … ehm …😛
Phễu
Nếu bạn đang tiết kiệm ngân sách nhưng cần đảo ngược mã gốc, thay vì IDA, bạn có thể dùng thử Hopper . Nó chắc chắn không tốt và đầy đủ như IDA, nhưng nó rẻ hơn nhiều và sẽ đủ tốt cho hầu hết các trường hợp.
Hopper hỗ trợ GNU/Linux và macOS (không có Windows! ) và, giống như IDA, có một trình dịch ngược tích hợp khá tốt nếu xét đến giá của nó:
Phễu
Phân tích động
Khi phân tích tĩnh là không đủ, có thể do ứng dụng bị xáo trộn hoặc đơn giản là cơ sở mã quá lớn và phức tạp để nhanh chóng tách biệt các quy trình mà bạn quan tâm, bạn cần phải chuyển sang phân tích động.
Phân tích động đơn giản có nghĩa là bạn sẽ thực thi ứng dụng (giống như chúng tôi đã làm khi thực hiện phân tích mạng) và bằng cách nào đó theo dõi việc thực thi ứng dụng bằng các công cụ, chiến lược và phương pháp khác nhau.
Hộp cát
Hộp cát là một chiến lược phân tích động hộp đen, có nghĩa là bạn sẽ không chủ động truy tìm mã ứng dụng (giống như bạn làm khi gỡ lỗi), nhưng bạn sẽ thực thi ứng dụng vào một số vùng chứa sẽ ghi lại các hành động phù hợp nhất cho bạn và sẽ trình bày một báo cáo khi kết thúc quá trình thực hiện.
Cuckoo-Droid
Cuckoo-Droid là một cổng Android của hộp cát Cuckoo nổi tiếng, sau khi được cài đặt và định cấu hình, nó sẽ cung cấp cho bạn báo cáo hoạt động với tất cả các URL mà ứng dụng đã liên hệ, tất cả các truy vấn DNS, lệnh gọi API, v.v.:
Chim cu
Joe Sandbox
Joe Sandbox di động là một dịch vụ trực tuyến tuyệt vời cho phép bạn tải lên APK và nhận báo cáo hoạt động của nó mà không gặp rắc rối khi cài đặt hoặc định cấu hình bất kỳ thứ gì.
Đây là một báo cáo mẫu , vì bạn có thể thấy loại thông tin này khá giống với Cuckoo-Droid, ngoài ra còn có một loạt các phương pháp phỏng đoán đang được thực thi để liên hệ mẫu với các ứng dụng đã biết khác về mặt hành vi.
Joe Sandbox
Gỡ lỗi
Nếu hộp cát là không đủ và bạn cần hiểu sâu hơn về hành vi của ứng dụng, bạn sẽ cần phải gỡ lỗi nó. Gỡ lỗi một ứng dụng, trong trường hợp bạn không biết, có nghĩa là gắn vào tiến trình đang chạy bằng một debugger phần mềm, cài đặt breakpoints đó sẽ cho phép bạn dừng quá trình thực thi và kiểm tra trạng thái bộ nhớ cũng như step vào từng dòng mã để tuân theo biểu đồ thực thi rất gần.
Kích hoạt chế độ gỡ lỗi
Khi một ứng dụng được biên dịch và cuối cùng được xuất bản lên Cửa hàng Google Play, đó thường là release bản dựng mà bạn đang xem, nghĩa là nhà phát triển đã tắt tính năng gỡ lỗi và bạn không thể đính kèm trực tiếp vào ứng dụng đó. Để bật lại tính năng gỡ lỗi, chúng tôi cần sử dụng apktool để dịch ngược ứng dụng:
apktool d application.apk
Sau đó, bạn sẽ cần chỉnh sửa AndroidManifest.xml tệp đã tạo, thêm android:debuggable=”true” thuộc tính vào application nút XML của nó:
1
2
3
4
5
6
7
số 8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
< bảng kê khai xmlns:android = “ http://schemas.android.com/apk/res/android” ; gói = “com.company.appname” platformBuildVersionCode = “24” platformBuildVersionName = “7.0” >
< quyền sử dụng android:name = “android.permission.WRITE_EXTERNAL_STORAGE” />
< quyền sử dụng android:name = “android.permission.INTERNET” />
< ứng dụng android:allowBackup = “true” android:icon = “@mipmap/ic_launcher” android:label = “@string/app_name” android:supportsRtl = “đúng” android:theme = “@style/AppTheme” android:debuggable = “true” > < – !!! THÔNG BÁO TÔI !!! — >
< hoạt động android:name = “com.company.appname.MainActivity” >
< bộ lọc ý định >
< hành động android:name = “android.intent.action.MAIN” />
< danh mục android:name = “android.intent.category.LAUNCHER” />
</ ý định lọc >
</ hoạt động >
</ ứng dụng >
</ bảng kê khai >
Sau khi bạn cập nhật tệp kê khai, hãy xây dựng lại ứng dụng:
apktool b -d application_path output.apk
Bây giờ chúng ta hãy từ chức nó:
git clone https://github.com/appium/sign
java -jar sign/dist/signapk.jar sign/testkey.x509.pem sign/testkey.pk8 output.apk signed.apk
Và cài đặt lại nó trên thiết bị (đảm bảo bạn đã gỡ cài đặt phiên bản gốc trước):
adb install signed.apk
Bây giờ bạn có thể tiến hành gỡ lỗi ứng dụng ^_^
Studio Android
Android Studio là IDE Android chính thức, sau khi bật chế độ gỡ lỗi cho ứng dụng của mình, bạn có thể đính kèm trực tiếp vào ứng dụng đó bằng IDE này và bắt đầu gỡ lỗi:
Trình gỡ lỗi Android Studio
IDA
Nếu bạn có giấy phép IDA hỗ trợ gỡ lỗi Dalvik, bạn có thể đính kèm vào một quy trình đang chạy và bước qua mã smali, tài liệu này mô tả cách thực hiện, nhưng về cơ bản, ý tưởng là bạn tải lên máy chủ gỡ lỗi ARM (một tệp nhị phân ARM gốc ) trên thiết bị của mình, bạn khởi động nó bằng cách sử dụng nó adb và cuối cùng bạn bắt đầu phiên gỡ lỗi từ IDA.
Trình gỡ lỗi IDA Dalvik
Thiết bị động
Công cụ đo lường động có nghĩa là bạn muốn sửa đổi hành vi của ứng dụng trong thời gian chạy và để làm như vậy, bạn đưa một số “tác nhân” vào ứng dụng mà cuối cùng bạn sẽ sử dụng để đo lường nó.
Bạn có thể muốn thực hiện việc này để giúp ứng dụng bỏ qua một số bước kiểm tra (ví dụ: nếu việc ghim khóa công khai được thực thi, bạn có thể muốn tắt nó bằng công cụ động để dễ dàng kiểm tra lưu lượng HTTPS), làm cho nó hiển thị thông tin cho bạn nó không được phép hiển thị (mở khóa các tính năng “Pro” hoặc các hoạt động gỡ lỗi/quản trị viên), v.v.
Frida
Frida là một công cụ tuyệt vời và miễn phí mà bạn có thể sử dụng để đưa toàn bộ công cụ Javascript vào một quy trình đang chạy trên Android, iOS và nhiều nền tảng khác… nhưng tại sao lại là Javascript?
Bởi vì sau khi động cơ được đưa vào, bạn có thể thiết lập ứng dụng theo những cách rất thú vị và dễ dàng như thế này:
1
2
3
4
5
6
7
số 8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
từ __future__ nhập print_function
nhập khẩu frida
hệ thống nhập khẩu
# hãy gắn liền với quy trình ‘xin chào’
phiên = frida.attach( “xin chào” )
# bây giờ hãy tạo Javascript mà chúng ta muốn đưa vào
script = session.create_script( “””
Interceptor.attach(ptr(“%s”), {
onEnter: hàm(args) {
send(args[0].toInt32());
}
});
“”” % int(sys.argv[ 1 ], 16 ))
# hàm này sẽ nhận các sự kiện từ js
def on_message (tin nhắn, dữ liệu) :
in (tin nhắn)
# hãy bắt đầu!
script.on( ‘tin nhắn’ , on_message)
script.load()
sys.stdin.read()
Trong ví dụ này, chúng ta chỉ kiểm tra một số đối số hàm, nhưng có hàng trăm thứ bạn có thể làm với Frida, chỉ có RTFM thôi! và sử dụng trí tưởng tượng của bạn😀
Đây là danh sách các tài nguyên thú vị của Frida, hãy tận hưởng!
XPed
Một tùy chọn khác mà chúng tôi có để trang bị cho ứng dụng của mình là sử dụng XPosed Framework . XPosed về cơ bản là một lớp thiết bị cho toàn bộ máy ảo Dalvik, yêu cầu bạn phải có điện thoại đã root để cài đặt nó.
Từ wiki XPosed :
There is a process that is called “Zygote”. This is the heart of the Android runtime. Every application is started as a copy (“fork”) of it. This process is started by an /init.rc script when the phone is booted. The process start is done with /system/bin/app_process, which loads the needed classes and invokes the initialization methods.
This is where Xposed comes into play. When you install the framework, an extended app_process executable is copied to /system/bin. This extended startup process adds an additional jar to the classpath and calls methods from there at certain places. For instance, just after the VM has been created, even before the main method of Zygote has been called. And inside that method, we are part of Zygote and can act in its context.
The jar is located at /data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar and its source code can be found here. Looking at the class XposedBridge, you can see the main method. This is what I wrote about above, this gets called in the very beginning of the process. Some initializations are done there and also the modules are loaded (I will come back to module loading later).
Sau khi cài đặt XPosed trên điện thoại thông minh của mình, bạn có thể bắt đầu phát triển mô-đun của riêng mình (một lần nữa, hãy làm theo dự án wiki ), ví dụ: đây là ví dụ về cách bạn kết nối phương updateClock thức của ứng dụng SystemUI để trang bị cho nó:
1
2
3
4
5
6
7
số 8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
gói de.robv.android.xpose.mods.tutorial;
nhập tĩnh de.robv.android.xpose.XposeHelpers.findAndHookMethod;
nhập de.robv.android.xpose.IXposeHookLoadPackage;
nhập de.robv.android.xpose.XC_MethodHook;
nhập de.robv.android.xpose.callbacks.XC_LoadPackage.LoadPackageParam;
lớp công khai Hướng dẫn triển khai IXposeHookLoadPackage {
public void handLoadPackage ( Final LoadPackageParam lpparam) ném Throwable {
if (!lpparam.packageName.equals( “com.android.systemui” ))
trở lại ;
findAndHookMethod( “com.android.systemui.statusbar.policy.Clock” , lpparam.classLoader, “updateClock” , ,
XC_MethodHook mới () {
@Ghi đè
protected void beforeHookedMethod (MethodHookParam param) ném Throwable {
// cái này sẽ được gọi trước khi đồng hồ được cập nhật theo phương thức ban đầu
}
@Ghi đè
protected void afterHookedMethod (MethodHookParam param) ném Throwable {
// cái này sẽ được gọi sau khi đồng hồ được cập nhật theo phương thức ban đầu
}
});
}
}
Hiện đã có rất nhiều mô-đun do người dùng đóng góp mà bạn có thể sử dụng, nghiên cứu và sửa đổi theo nhu cầu của riêng mình.
Phần kết luận
Tôi hy vọng bạn sẽ thấy hướng dẫn tham khảo này hữu ích cho cuộc phiêu lưu đảo ngược Android của mình, hãy nhớ rằng điều quan trọng nhất khi đảo ngược không phải là công cụ bạn đang sử dụng mà là cách bạn sử dụng nó, vì vậy bạn sẽ phải học cách hãy chọn công cụ thích hợp cho kịch bản của bạn và đây là điều bạn chỉ có thể học được bằng kinh nghiệm, vì vậy hãy đọc đủ và bắt đầu đảo ngược!😀
Nguồn:
Ps: đang học java với adnroid dc 1 ngày thì tìm thấy bài này. lưu về nghiên cứu :V