Ndk Là Gì

     
Mở đầu

Gần phía trên ở công ty tôi giành được giao một task khá hay. Doanh nghiệp tôi tất cả một trò chơi viết trên nền tảng gốc rễ android.Game kia viết bởi anđroid, tuy vậy lại hầu hết dùng web view để hiển thị.Mặc cho dù vậy, một số logic như là set session mang đến user, authenticate cho user thì lại vị trí android.

Bạn đang xem: Ndk là gì

Bạn vẫn xem: Ndk là gì

Chắc các bạn cũng đang biết, app android app được viết bằng java, dịch ra file dex, kế tiếp được cung cấp trên google playstore bên dưới dạng file apk. Vì chưng đó, apk app gồm một điểm yếu kém cố hữu mà gần như java tiện ích đều mắc phải, đó là bảo mật. Điểm yếu bảo mật ở đấy là gì? Đó là việc mà hầu như java app đều hoàn toàn có thể được so sánh ngược (reverse engineer) rất đơn giản dàng.

Việc này bắt mối cung cấp từ bản chất java được dịch ra bytecode nghỉ ngơi dạng khá “gần” với ngôn từ lập trình thông thường, với bytecode chứa vừa đủ các thông tin cần thiết để bạn cũng có thể dịch lại khái quát lại lịch trình gốc.

Vậy cái nhược điểm bảo mật này liên quan đến cái phầm mềm tôi đã phụ trách nỗ lực nào? Như tôi vừa nói ở trên, trong chiếc game nhưng tôi vẫn phụ trách, logic authenticate đến user đang nằm bên trên phía android. Điều này tức là trên android app vẫn phụ trách:

Mã hoá uuid của người dùng, trình lên serverServer vẫn nhận uuid đó, và gửi session key về mang đến user nhằm user phối vào cookie.

Chắc hẳn sẽ có bạn thắc mắc là qui trình đảm bảo này quá 1-1 giản. Đúng vậy, các bước này quá đơn giản, dẫn cho là việc chỉ việc user A (người xấu) biết uuid của user B (người bị hại) thì A sẽ giả mạo được bất cứ hành rượu cồn của B như là gửi trang bị từ B đến A.

Vậy lý do không có tác dụng một công đoạn xác thực tốt hơn, như dùng thêm một token y như onetime password nhưng mà chỉ user đó mới biết được, tuyệt là làm phương pháp nào nhằm “giấu” uuid đi khiến cho user khác không biết. Đúng là nên như thế! tuy nhiên vì một số nguyên nhân “lịch sử” của legacy code, mà chúng ta không thể thay đổi qui trình xác xắn một cách dễ dàng như nỗ lực được.

Như vậy thì cùng với flow code lúc này thì với điểm yếu kém của apk tôi đã nhắc đến ở trên thì một người có chút kiến thức và kỹ năng lập trình có thể dễ dàng dịch ngược đoạn logic dùng để làm xác thực nhưng tôi vẫn nói nghỉ ngơi trên. Mà trong những số ấy có việc mã hoá uuid người tiêu dùng mà khi bạn nhìn được xúc tích và ngắn gọn code thì mã hoá cũng bằng thừa. Vì sao tại sao lại bằng thừa vày code lúc này đang sử dụng “Symmetric Cryptography Algorithm”. Symmetric ngơi nghỉ đây tức là thuật toán mã hoá đối xứng, mà điển hình gồm gồm có thuật toán như blowfish, AES, DES.

Nói một cách dễ dàng thì các loại thuật toán symmetric thì bên nhờ cất hộ và bên nhận sẽ dùng cùng một key, và một intitialize vector (Các khái niệm này tôi sẽ trình bày kĩ hơn ở phần sau) , bởi vì đó chỉ cần dịch ngược được code thì user A (người xấu) sẽ có được được key và initialize vector để tạo thành một request thích hợp lệ sử dụng uuid của user B.

Vậy thì họ phải giải quyết vấn đề này nuốm nào? sau một hồi luận bàn với doanh nghiệp thì tôi suy nghĩ ra một phương án “chữa cháy” lâm thời thời, đây là chuyển ngắn gọn xúc tích vào native code áp dụng ndk với C, mục tiêu để dành được là:

“Giấu” đi logic mã hoá uuid bạn dùng, giấu cả các tham số ban sơ như key với initialize vector. Do này mà user A sẽ không còn biết làm bí quyết nào để tạo thành một request đúng theo lệ cùng với uuid của user B.

Cách giải quyết này lý do tôi nói là nhất thời thời, bởi vì user A nếu bao gồm thêm một chút ít hiểu biết về ndk thì sẽ biết được interface cung cấp ở ndk code sẽ được public ra ngoài, cho nên vì thế thì vẫn rất có thể tận dụng được đặc điểm đó để tạo ra một request hợp lệ. Mặc dù do không nghĩ là ra chiến thuật khác nên tạm thời dùng giải pháp này sẽ tinh giảm được các hacker “gà mờ”.

Vậy nhằm đi theo phía đi này bọn họ cần phải tìm hiểu về 2 thứ sẽ là : Android NDK và cách để sử dụng các thuật toán mã hoá bên trên ndk (ở đây là sử dụng ngôn từ C), chính là openssl.Phần reviews hơi lâu năm dòng, nhưng cho đây chúng ta đã vắt được vì sao tiêu đề nội dung bài viết lại là apk NDK và xuất hiện SSL.

Dưới đây bọn họ sẽ đi theo thứ tự về 2 sự việc cần xử lý : apk NDK với OpenSSL

Android NDK

Android NDK là một kit cách tân và phát triển giúp bạn có thể phát triển các ứng dụng android mà lại dựa một phần trên những đoạn code viết bên trên C hoặc C++. Các bạn sẽ cần mang đến NDK trong các sản phầm phải đến tính năng cao, nhưng mà khi đó các đoạn code được build ra binary đã phát huy hiệu năng về tối đa. Các logic code được triển khai trên ndk sinh hoạt dứoi đây tôi sẽ gọi tầm thường là native code.

Về cơ chế hoạt động vui chơi của ndk, chúng ta có thể hiểu một cách đơn giản dễ dàng như vào hình vẽ bên dưới đây, phầm mềm của các bạn sẽ tiến hành giao tiếp với native code thông qua 1 interface hotline là JNI.

Một cách đối chọi giản, JNI là 1 trong những bộ giao thức giao tiếp chuẩn chỉnh của java, giúp cho java code có thể nói chuyện được với C/C++ code, hoàn toàn có thể truyền tài liệu giữa 2 bên.


*

Để xem thêm về apk ndk, các chúng ta cũng có thể vào home của android tại home của android. Sau đây tôi đã tóm tắt công việc cần thiết để sử dụng được ndk.

Xem thêm: Bán Hàng Đa Cấp Tiếng Anh Là Gì : Định Nghĩa, Ví Dụ Anh Việt


Cài đặt

Cách thiết lập android ndk khá như thể với sdk, tức là chỉ đơn thuần là bạn tải cỗ ndk về, để vào đâu đó. Trong cỗ NDK này sẽ chứa không thiếu thốn các tool để có thể build được ndk native code tự C/C++ source (bao có build script và các file header bắt buộc thiết). Thừa trình cài đặt có thể phát âm tóm gọn qua đoạn script tiếp sau đây (chạy trên môi trường unix):

wget http://dl.google.com/android/ndk/android-ndk64-r10-darwin-x86.tar.bz2tar yxvf android-ndk64-r10-darwin-x86.tar.bz2mv android-ndk64-r10-darwin-x86 ~/echo “export PATH=$PATH:/~/android-ndk64-r10-darwin-x86” >> ~/.bash_profileecho “export ANDROID_NDK_ROOT=/Users/huydo/android-ndk64-r10-darwin-x86” >> ~/.bash_profilesource ~/.bash_profileSau khi chạy đoạn script trên thì app android ndk vẫn được chế tạo path của hệ thống, giúp chúng ta có thể gõ những lệnh như ndk-build từ bất cứ đâu

Sử dụng

Trong bộ ndk bạn down về gồm chứa sẵn không hề ít ví dụ về cách sử dụng ndk, từ đơn giản dễ dàng (như hello world) cho đến các ví dụ phức tạp hơn hẳn như xử lý ảnh (mà phải thao tác làm việc gửi tài liệu giữa android app và ndk ứng dụng khá phức tạp). Các bạn cũng có thể tham khảo các ví dụ đó để sở hữu cái nhìn thực tế về ndk program. Tiếp sau đây tôi sẽ trình diễn ngắn gọn về quy trình sử dụng của tôi.

Như sinh hoạt hình nghỉ ngơi trên thì các bạn thấy là apk app và native code vẫn “nói chuyện” với nhau thông qua một “ngôn ngữ” phổ biến gọi là jni. Như vậy sẽ sở hữu được 2 năng lực xảy ra, dẫn cho 2 văn cảnh để sử dụng ndk:

1. Viết một trong những logic code quan trọng đặc biệt ở phía native code, và các logic sót lại để sinh sống phía app android app như bình thường. Các giao tiếp sẽ được gọi từ phía java thông qua jni. Bí quyết tiếp cận này dễ ợt ở vị trí là bọn họ tận cần sử dụng được mọi điểm mạnh của game android frame work, với chỉ những logic nào thật cần thiết mới chuyển vào native code.2. Viết “native activity”, có nghĩa là logic của activity như hiển thị, life cycle, gọi những activity khác.. Sẽ tiến hành code toàn bộ ở bên trên phía native. Bí quyết này thực tiễn khá không nhiều sử dụng, thường sử dụng trong trường phù hợp mà dữ liệu quá cực nhọc để tương truyền truyền lại giữa bên java và native, thì việc code luôn luôn cả activity bên trên native cũng là một trong những lựa chọn buộc phải thiết.

Ở nội dung bài viết này tôi đã đi theo hướng tiếp cận 1, để xử lý bài toán theo hướng:

Đưa logic mã hoá uuid người tiêu dùng vào một file C, build ra binary cùng gọi súc tích đó trên phía java trải qua JNI.

Coding với build

Để đi theo hướng tiếp cận 1 như sẽ nói ngơi nghỉ trên, chúng ta có thể dễ dàng hình dung công việc phải làm:

Step 1: Viết lô ghích code mã hoá bên trên C, nhấn đầu vào là 1 chuỗi trình bày uuid của fan dùng, cổng output là chuỗi kia dã được mã hoá.Step 2: Build đoạn code kia thành một tệp tin thư viện hễ (.so file) với “Nhúng” tệp tin thư viện cồn đó vào trong android projectStep 3: Viết xúc tích code hotline native code trên java.

Step 1: cấu tạo của một tệp tin native code viết bên trên C

Thông thường, họ sẽ sản xuất một thư mục tên là jni với đặt toàn cục các đoạn code, header, những thư viện tương quan vào vào đó.



File native code viết bên trên C khá 1-1 giản, chỉ cần tóm gọn lại trong 2 bước:

include tủ sách Viết các hàm dựa trên convention của jni để tạo ra các “interface”, cùng phía java sẽ call được những “interface” này một giải pháp khá dễ dàng

Một ví dụ hết sức về native code như dưới đây:

#innclude #include jstringJava_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz ) return (*env)->NewStringUTF(env, “Hello from JNI ! “);Các bạn lưu ý tên hàm của native code sẽ tiện lợi nhận thấy convention như trong hình dưới đây:



Nhờ gồm convention đó mà các các bạn sẽ thấy việc gọi ngắn gọn xúc tích của hàm kia trên phía java sẽ thuận lợi hơn lúc nào hết.

Ngoài ra các bạn có thể để ý một vài điểm đặc biệt ở một quãng native code như bên dưới đấy:

Giá trị trả về ở đấy là jstring, đó là một kiểu dữ liệu đặc biệt quan trọng của jni, nhưng khi phía java gọi, thư viện jni vẫn thực hiện biến đổi (marshalling) quý giá này về thứ hạng String của java.Biến JNIEvn* env, bạn có thể hình dung đó là một bé trỏ trỏ đến VirtualMachine (Dalvik) của android, nhờ gồm env này mà chúng ta cũng có thể thao tác ngược tự phía native, để hoàn toàn có thể sử dụng được các logic phía android. Như trong khúc code trên thì chúng ta có thể thấy nhờ bao gồm env mà chúng ta có thể tạo được một unicode string từ vào C code.

Step 2: Build đoạn code đó thành .so file

Để build được file native C mà bọn họ vừa viết ngơi nghỉ trên, chúng ta cần có tác dụng 2 việc:

Tạo 2 tệp tin Android.mk cùng Application.mk trong folder jni mà họ đã nói đến ở trênAndroid.mk có nhiệm vụ “miêu tả” module với hệ thống build. Trong tệp tin này chúng ta sẽ viết là module họ có hầu như file gì, path làm việc đâu, thực hiện những thư viện khác nào (dependency). Trong một app có thể có nhiều file Android.mk khi mà họ có các module.Application.mk sẽ có được nhiệm vụ “miêu tả” ứng dụng của bọn họ với khối hệ thống build. Thường thì trong file này họ sẽ biểu lộ những modules mà phầm mềm sẽ dùng, cũng như là biểu đạt về CPU architecture mà app sẽ cung ứng (mà điển hình gồm bao gồm ARM, x86 với MIPS)Build thực hiện ndk-build không còn sức dễ dàng chỉ bằng việc gõ lệnh ndk-build làm việc trong thư mục hiện tại.



Sau khi thực hiện lệnh ndk-build để build thì công dụng build là những file .so sẽ được copy vào folder libs nghỉ ngơi root folder theo như hình bên trên đây. Các chúng ta cũng có thể thấy là tương ứng với mỗi phong cách xây dựng CPU sẽ có được một folder được chế tạo ra ra, vào mỗi folder đó lại có các file .so không giống nhau chỉ dùng với tốt nhất một phong cách thiết kế nhất định.

Step 3: Viết xúc tích và ngắn gọn code điện thoại tư vấn native code bên trên java

Đã build hoàn thành thư viện tĩnh, chúng ta chỉ còn một quy trình cuối thuộc là áp dụng đoạn xúc tích ở trên trong apk code. Theo như sinh hoạt trên đang nói, interface của jni code sẽ được sử dụng dựa trên convention mà tất cả có: package name, class name cùng cfunction name. Điều đó bao gồm nghĩa là: đoạn code java trong game android của các bạn sẽ phải bao gồm package name, class name với function name y y như interface của jni, thì bạn mới thực hiện được xúc tích và ngắn gọn đó.

Xem thêm: Hệ Số An Toàn Vốn ( Car Là Gì ? Với Car, Ngành Thương Mại Thêm Quả Trúng Lớn

Vậy thì theo như ví dụ của bọn họ ở trên đây thì họ cần phải làm 3 việc:

package name của đoạn code đề nghị là com/example/hellojniClass name nên là HelloJniBạn yêu cầu định nghĩa một hàm thương hiệu là stringFromJNI để điện thoại tư vấn được ngắn gọn xúc tích từ native code.

package com.example.hellojni;import android.app.Activity;import android.widget.TextView;import android.os.Bundle;public class HelloJni extends Activity{