Decode Ứng Dụng Công Tác Sinh Viên Của Trường

Decode Ứng Dụng Công Tác Sinh Viên Của Trường

Trong khi chờ thiên thời địa lợi nhân hòa để mình có thể viết tiếp phần 2 cho bài tạo bot đăng ký học thì hôm nay mình sẽ cùng các bạn thử decode file apk ra xem có thể làm được gì với nó nào :)

Khi các bạn xây dựng một ứng dụng mobile các bạn đã nghĩ đến việc bảo vệ mã nguồn, api của ứng dụng chưa? Hôm nay mình sẽ cùng các bạn xem chúng ta có thể thấy được những thông tin gì từ file apk của ứng dụng mobile nhé

Mục tiêu: App ctsv dùng để chấm điểm rèn luyện cho sinh viên Bách Khoa

1. Decode apk 

File APK được tích hợp trên Android để người dùng có thể dễ dàng truy cập và trải nghiệm tất cả các tính năng thú vị mới không có sẵn trên hệ thống của bạn. Ngoài ra khi cài đặt file APK còn hỗ trợ người dùng truy cập một số ứng dụng bị hạn chế khu vực. Chỉ cần truy cập mạng Internet và search, bạn sẽ tìm thấy hàng loạt các trang web chứa nguồn file APK. Tuy nhiên điều đáng nói là lựa chọn trang web nào đáng tin cậy để tải file APK mới là điều quan trọng. Một số file APK có chứa cả các phần mềm độc hại (malware).

App mình lựa chọn là: App ctsv dùng để chấm điểm rèn luyện cho sinh viên Bách Khoa

Đầu tiên hãy tài file apk của ứng dụng về từ link sau.

Sau khi tải xong chúng ta sẽ decode file apk bằng công cụ online sau.

Sau khi decode xong tải về ta sẽ được hai thư mục như dưới đây:

Sau một hồi tìm kiếm thì mình cũng tìm thấy được thư mục chứa mã nguồn của ứng dụng là thư mục com.bk.ctsv_source_from_JADX/sources/com/p006bk/ctsv. Ở đây gần như ta có thể thấy được toàn bộ nội dung mã nguồn của ứng dụng.

Khi nhìn các file mã nguồn này các bạn sẽ quan tâm tới những file nào? Bản thân mình thì sẽ quan tâm đến api giao tiếp giữa ứng dụng và server.

Ok, giờ muốn xem api thì chúng ta sẽ cần đến package webservices ở đây sẽ chứa toàn bộ các api giao tiếp giữa app và server.

Đọc qua code trong 2 file AuthenticationInterceptor.java và WebService.java tôi có thể thấy rằng ứng dụng sử dụng retrofit làm rest client để giao tiếp với server.

  • Cách ứng dụng xác thực:
public final class AuthenticationInterceptor implements Interceptor {
    @NotNull
    public Response intercept(@NotNull Chain chain) {
        Intrinsics.checkParameterIsNotNull(chain, "chain");
        Response proceed = chain.proceed(chain.request().newBuilder().addHeader(ConstantsKt.API_SERVICE_AUTHENTICATION_NAME, "").build());
        Intrinsics.checkExpressionValueIsNotNull(proceed, "chain.proceed(newRequest)");
        return proceed;
    }
}
  • Các api của ứng dụng ở đây tôi chỉ trích xuất ra một vài api mà theo bản thân thấy là quan trọng, ngoài ra các bạn có thể xem đầy đủ tại đây:
@FormUrlEncoded
    @POST("User/UserLogin")
    Call<RespLogin> login(@Field("UserName") String str,
                          @Field("Password") String str2);

    @Multipart
    @POST("UploadFile/CTSV/UploadProofImage")
    Call<Object> uploadFile(@Query("UserCode") String str,
                            @Query("TokenCode") String str2,
                            @Query("AId") int i,
                            @Part MultipartBody.Part part);

    @FormUrlEncoded
    @POST("Activity/GetActivityByUser")
    Call<RespActivity> getActivityByUser(@Field("UserName") String str,
                                         @Field("TokenCode") String str2,
                                         @Field("UserCode") String str3);

    @FormUrlEncoded
    @POST("Activity/UserCheckinActivity")
    Call<Object> userCheckinActivity(@Field("UserName") String str,
                                     @Field("TokenCode") String str2,
                                     @Field("UserCode") String str3,
                                     @Field("AId") int i,
                                     @Field("Longitude") double d,
                                     @Field("Latitude") double d2,
                                     @Field("Address") String str4,
                                     @Field("Signature") String str5);

    @FormUrlEncoded
    @POST("User/LogOut")
    Call<Object> logout(@Field("UserName") String str,
                        @Field("TokenCode") String str2,
                        @Field("Signature") String str3);

Thế là chúng ta đã có thể lấy được toàn bộ api của ứng dụng một cách khá dễ dàng . Ngoài ra để lấy được api các bạn có thể sử dùng Fiddler để có thể bắt request gửi từ ứng dụng.

Như vậy các bạn có thể thấy việc decode một file apk để xem mã nguồn ứng dụng là vô cùng đơn giản vì thế để bảo đảm an toàn cho ứng dụng của các bạn thì trước khi build ứng dụng chúng ta nên sử dụng thêm các plugin để làm rối mã.

2. Tiếp theo sẽ là trò nghịch vui đơn giản sử dụng các api đã lấy được ở trên :D 

Một trong các lý do để tôi thực hiện decode ứng dụng của trường là do thời điểm mới ra mắt ứng dụng thì nó chạy khá tệ khiến cho việc chấm điểm rèn luyện của mình gặp khá nhiều khó khăn. Một lý do nữa là ứng dụng chỉ cho phép checkin + chụp ảnh để upload luôn mà không cho up ảnh từ thư viện. Thế nên mình đã quyết định phải làm gì đó :)

(Note: Hiện tại ứng dụng đã chạy mượt và không có lý do gì để sử dụng những thứ mình sẽ viết tiếp dưới đây :D )

Từ những khó khăn trên mình đã quyết định viết một tool nhỏ để hỗ trợ bản thân upload ảnh từ thư viện ảnh, ngồi nhà checkin vị trí tại trường =))

Hầu như mình dùng lại toàn bộ 2 file AuthenticationInterceptor.java và WebService.java lấy được từ việc decode, mình chỉ viết thêm một chút phần đọc file từ máy tính cũng như việc sửa lại vị trí checkIn và giao diện command line để bản thân có thể sử dụng 

Toàn bộ mã nguồn của tool các bạn có thể đọc ở đây 

-----------------------------------------------------------------------------------------

Tạm kết

Hướng dẫn trên đây giúp các bạn có thể thực hành với APK và giúp các bạn sử dụng App thuận tiện hơn, đừng dùng vào mục đích xấu nhé. Đừng quên để lại comment và rate 5* cho mình. Các bạn cũng có thể ghé thăm blog nhỏ của mình nhé (https://tuhalang.github.io/)

Mọi ý kiến đóng góp các bạn có thể gửi cho mình theo: Facebook Email LinkedIn

Thanks for reading ^^