如何在android上支持jna <二>实战步骤 如何利用Capstone引擎写一个Android反汇编工具

java web\u5de5\u7a0bjna\u52a0\u8f7ddll\u9a71\u52a8\u95ee\u9898

\u4f60\u597d

\u53ef\u4ee5\u901a\u8fc7System.out.println(System.getProperty("java.library.path"))
\u6765\u67e5\u770b\u5230\u5e95\u5e94\u8be5\u5728\u4ec0\u4e48\u5730\u65b9\u653e\u7f6eDLL\uff0c\u5728\u8fd9\u4e9b\u76ee\u5f55\u4e0b\u6709\u5c31\u53ef\u4ee5\u52a0\u8f7d

\u3000\u3000\u5728\u505a\u4e00\u4e9b\u9006\u5411\u5de5\u7a0b\u65f6\uff0c\u5076\u7136\u60f3\u5230\u6211\u8fd8\u6ca1\u6709\u4e00\u6b3e\u7528\u4e8e\u5b89\u5353\u53cd\u6c47\u7f16\u4e8c\u8fdb\u5236\u6587\u4ef6\u7684\u5de5\u5177\u3002\u4e4b\u540e\u505a\u4e86\u4e00\u4e9b\u7814\u7a76\uff0c\u6211\u5c06\u76ee\u6807\u9009\u5b9a\u4e3aCapstone Engine\uff0c\u4e0b\u9762\u5c31\u5c06\u4ecb\u7ecd\u6211\u662f\u5982\u4f55\u96c6\u6210Capstone Engine\u5728\u5b89\u5353\u8bbe\u5907\u4e0a\u8fd0\u884c\u7684\u3002
\u521b\u5efaAndroid\u9879\u76ee
\u4e3a\u6b64\uff0c\u6211\u8fd8\u7279\u610f\u4f7f\u7528\u4e86Android Studio\u3002\u521b\u5efa\u4e00\u4e2a\u7a7a\u767d\u7684\u9879\u76ee \u2013 \u8fd9\u91cc\u6ca1\u5565\u7279\u522b\u7684\uff0c\u4f46\u662f\u9700\u8981\u6ce8\u610f\u7684\u662f\u6211\u5728app/src/main/\u4e0b\u521b\u5efa\u4e86\u4e00\u4e2a\u540d\u4e3ajniLibs\u7684\u76ee\u5f55\uff0c\u5176\u4e2d\u5305\u542b\u4e86\u6211\u4eec\u4e4b\u540e\u4f1a\u7528\u5230\u7684\u7f16\u8bd1\u597d\u7684C\u51fd\u6570\u5e93\u3002
\u8bf7\u6ce8\u610f\uff0c\u6211\u901a\u8fc7Android Studio SDK Manager\u5b89\u88c5\u4e86NDK
\u7f16\u8bd1Capstone Engine
\u63a5\u4e0b\u6765\u4e3aAndroid\u4ea4\u53c9\u7f16\u8bd1Capstone Engine
\u3000\u3000# git clone https://github.com/aquynh/capstone.git
Cloning into 'capstone'...
remote: Counting objects: 16805, done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 16805 (delta 4), reused 0 (delta 0), pack-reused 16789
Receiving objects: 100% (16805/16805), 26.10 MiB | 3.01 MiB/s, done.
Resolving deltas: 100% (12089/12089), done.Checking connectivity... done.
# cd capstone
# NDK=~/Library/Android/sdk/ndk-bundle/ ./make.sh cross-android arm

\u5728\u5f53\u524d\u76ee\u5f55\u4e2d\u6211\u4eec\u5e94\u8be5\u6709\u4e00\u4e2a\u540d\u4e3alibcapstone.so\u7684\u6587\u4ef6\uff0c\u5c06\u5176\u590d\u5236\u5230\u6211\u4eec\u4e4b\u524d\u521b\u5efa\u7684jniLibs\u76ee\u5f55\u4e2d\u3002
\u63a5\u7740\u4e0b\u8f7d\u4e00\u4efdCapstone Java bindings\uff0c\u5e76\u5c06\u5176\u653e\u5165Android Studio\u9879\u76ee\u4e2d\u7684app/libs/\u76ee\u5f55\uff0c\u5176\u63d0\u4f9b\u4e86\u4e00\u4e9b\u65b9\u6cd5\u548c\u7c7b\u5e2e\u52a9\u6211\u4eec\u4e0eCapstone Engine\u8fdb\u884c\u4ea4\u4e92\u3002
\u7f16\u8bd1JNA
Capstone Java bindings\u5229\u7528JNA\u51fd\u6570\u5e93\u52a0\u8f7d\u5e76\u4e0eCapstone\u9884\u5236\u51fd\u6570\u5e93\u6c9f\u901a\uff0c\u6211\u4eec\u9700\u8981\u4e3aAndroid\u7f16\u8bd1JNA JAR\u5e76\u63d0\u53d6\u652f\u6301JNA\u7684\u4e8c\u8fdb\u5236\u5e93\u5e73\u53f0\u3002
\u8fd9\u4e00\u6b65\uff0c\u4f60\u9700\u8981\u5b89\u88c5ant\uff1a

\u3000\u3000# git clone https://github.com/twall/jna.git
Cloning into 'jna'...
remote: Counting objects: 41416, done.
remote: Total 41416 (delta 0), reused 0 (delta 0), pack-reused 41416
Receiving objects: 100% (41416/41416), 213.06 MiB | 4.51 MiB/s, done.
Resolving deltas: 100% (26780/26780), done.Checking connectivity... done.
# cd jna
# PATH=$PATH:~/Library/Android/sdk/ NDK_PLATFORM=~/Library/Android/sdk/ndk-bundle/platforms/android-21/ ant -Dos.prefix=android-arm dist

JNA\u5b8c\u6210\u7f16\u8bd1\u4e4b\u540e\uff0c\u6211\u4eec\u8fd8\u9700\u8981\u590d\u5236\u4e00\u4e9b\u6587\u4ef6\u5230Android Studio project\u3002\u9996\u5148\u590d\u5236dist/jna.jar\u5230\u9879\u76ee\u4e0b\u7684app/libs/\u76ee\u5f55\uff0c\u7136\u540e\u5c31\u50cf\u89e3\u538bzip\u6587\u4ef6\u5305\u4e00\u6837\u63d0\u53d6dist/android-arm.jar\u6587\u4ef6\uff0c\u5c06libjnidispatch.so\u6587\u4ef6\u590d\u5236\u5230\u9879\u76ee\u4e0b\u7684app/src/main/jniLibs\u76ee\u5f55\u3002JNA\u4f7f\u7528\u7684\u8fd9\u4e9b\u51fd\u6570\u5e93\u901a\u8fc7JNI\u4e0e\u672c\u673a\u51fd\u6570\u5e93\u8fdb\u884c\u4ea4\u4e92\u3002
\u5728\u4e00\u8d77\uff0c\u5728\u4e00\u8d77\uff01
\u65e2\u7136\u5df2\u7ecf\u5c06\u6240\u6709\u7684\u51fd\u6570\u5e93\u90fd\u8fdb\u884c\u4e86\u7f16\u8bd1\uff0c\u5e76\u5c06\u8fd9\u4e9b\u6587\u4ef6\u590d\u5236\u5230\u9879\u76ee\u4e0b\u76f8\u5bf9\u5e94\u7684\u76ee\u5f55\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5f00\u59cb\u4f7f\u7528Capstone Engine\u3002\u5728\u6211\u4eec\u5f00\u59cb\u4f7f\u7528\u4e4b\u524d\uff0c\u6211\u4eec\u9700\u8981\u4fdd\u8bc1\u590d\u5236\u5230\u9879\u76ee\u4e0b\u7684\u4e24\u4e2aJava\u5e93\u5df2\u7ecf\u88ab\u5305\u542b\u3002\u8981\u505a\u5230\u8fd9\u4e00\u70b9\uff0c\u5728Android Studio\u4e2d\u5c06\u4ed6\u4eec\u4f5c\u4e3a\u6587\u4ef6\u7684\u4f9d\u8d56\u8fdb\u884c\u589e\u52a0(\u53f3\u952e\u5355\u51fb\u6a21\u5757\uff0c\u6253\u5f00\u6a21\u5757\u8bbe\u7f6e\uff0c\u7136\u540e\u6253\u5f00\u4f9d\u8d56\u5173\u7cfb\u9009\u9879\u5361\uff0c\u6700\u540e\u70b9\u51fb'+'\u6309\u94ae\u8fdb\u884c\u6dfb\u52a0)
\u6dfb\u52a0\u5b8c\u6210\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5728Android\u9879\u76ee\u4e2d\u4f7f\u7528Capstone\u4e86\uff1a

\u3000\u3000import capstone.Capstone;public class MainActivity extends Activity {
private byte [] CODE = { 0x55, 0x48, (byte) 0x8b, 0x05, (byte) 0xb8, 0x13, 0x00, 0x00 };
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Capstone cs = new Capstone(Capstone.CS_ARCH_X86, Capstone.CS_MODE_64);
Capstone.CsInsn[] allInsn = cs.disasm(CODE, 0x1000);
for (int i=0; i<allinsn.length; i++)="" { Log.e("CAPSTONE", allInsn[i].address + " " + allInsn[i].mnemonic + " " + allInsn[i].opStr);
}
}}

1) 首先 JNA存在形式只是一个jna.jar 结构为java class + platform native
lib(libjnidispatch.so),现在支持的平台有win32 x86/amd64/mac, linux x86/bsd, sun os
等等,java层应该是通用,无需做改动。所以文章就做在怎样得到android平台辨认的native .so 上。

2) 确定思路,搭建jna/native arm交叉编译环境,得到android自己的jna.jar.

3) 源码下载,开源项目非常方便

$ svn co https //jna dev java net/svn/jna/trunk/jnalib

4) 选择编译器,考虑到jna是gnu项目,而且所有eabi编译器都兼容,所以选择arm-linux-none-gnueabi-gcc.

5) 进入源码树,

$ cd jnalib

6) 设置环境变量。java, gcc, ant等。

$ export
PATH=/opt/ant/bin:/opt/jdk1.6.0_11/bin:/opt/arm-none-linux-gnueabi/bin:/opt/android-ndk-r4/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin:$PATH

$ export JAVA_HOME=/usr/java/jdk1.6.0_21/

7) 更改build.xml,native/makefile来支持arm平台。(比较长,可略过不看)

ndex:
native/Makefile
===================================================================
---
native/Makefile (revision 1146)
+++ native/Makefile (working
copy)
@@ -54,8 +54,8
@@
LIBSFX=.so
ARSFX=.a
JNISFX=$(LIBSFX)
-CC=gcc
-LD=gcc
+CC=arm-none-linux-gnueabi-gcc
+LD=arm-none-linux-gnueabi-gcc
LIBS=
#
Default to Sun recommendations for JNI compilation
COPT=-O2
-fno-omit-frame-pointer -fno-strict-aliasing
@@ -126,10 +126,12
@@
endif

ifeq ($(OS),linux)
-ARCH=$(shell uname -m | sed
's/i.86/i386/g')
+ARCH=arm #$(shell uname -m | sed
's/i.86/i386/g')
PCFLAGS+=-fPIC
CDEFINES+=-DHAVE_PROTECTION
LDFLAGS+=-Wl,-soname,$@
+FFI_CONFIG
+=
--host=arm-none-linux-gnueabi
+CINCLUDES+=-I/usr/include
endif

ifeq
($(OS),freebsd)
Index:
build.xml
===================================================================
---
build.xml (revision 1146)
+++ build.xml (working copy)
@@ -92,6
+92,7 @@
<os arch="ppc64"/>
<os
arch="sparcv9"/>
<os arch="amd64"/>
+ <os
arch="arm"/>
</or>
</condition>

<condition property="ld.preload" value="LD_PRELOAD_64"
else="LD_PRELOAD">
@@ -110,6 +111,9 @@
<condition
property="jre.arch" value="i386">
<equals arg1="x86"
arg2="${os.arch}"/>
</condition>
+ <condition
property="jre.arch" value="arm">
+ <equals arg1="arm"
arg2="${os.arch}"/>
+ </condition>
<condition
property="jre.arch" value="amd64">
<equals arg1="x86_64"
arg2="${os.arch}"/>
</condition>
@@ -285,6 +289,7 @@

<copy file="${dist}/out-of-date.jar" tofile="${dist}/win32-x86.jar"
overwrite="true"/>
<copy file="${dist}/out-of-date.jar"
tofile="${dist}/win32-amd64.jar" overwrite="true"/>
<copy
file="${dist}/out-of-date.jar" tofile="${dist}/linux-i386.jar"
overwrite="true"/>
+ <copy file="${dist}/out-of-date.jar"
tofile="${dist}/android.jar" overwrite="true"/>
<copy
file="${dist}/out-of-date.jar" tofile="${dist}/linux-amd64.jar"
overwrite="true"/>
<copy file="${dist}/out-of-date.jar"
tofile="${dist}/linux-ia64.jar" overwrite="true"/>
<copy
file="${dist}/out-of-date.jar" tofile="${dist}/freebsd-i386.jar"
overwrite="true"/>
@@ -598,6 +603,9 @@
<zipfileset
src="${dist}/linux-i386.jar"

includes="*jnidispatch*"

prefix="com/sun/jna/linux-i386"/>
+ <zipfileset
src="${dist}/arm-none-linux.jar"
+
includes="*jnidispatch*"
+
prefix="com/sun/jna/android"/>
<zipfileset
src="${dist}/linux-amd64.jar"

includes="*jnidispatch*"

prefix="com/sun/jna/linux-amd64"/>

8) 编译

$ ant -Djre.arch=arm -Dos.arch=arm -Dos.prefix=linux-arm

9)编译完成,你就可以在build下等到arm编译器编出来的jna.jar了, 如果你用eclipse,就可以直接Project...->add
Jar 使用它了。有可能(还不确定), android不支持在jar包中加本地native .so 的做法,你可以将jna.jar分拆开将java
class还以Jar的方式加载,而把linux-arm/下的libjnidispatch.so以add Lib..的方法加入,你可以尝试一下。
转载五品员外郎

  • 涓夋槦jn1鐩稿綋浜庣储灏肩殑浠涔
    绛旓細绱㈠凹IMX700銆備笁鏄jn1鍜岀储灏糏MX700鐩稿綋锛屼紶鎰熷櫒瑙勬牸涓婂嚑涔庝竴鏍凤紝灏哄閮芥槸鍦1/1.3鑻卞宸﹀彸锛屼篃閮芥槸5000涓囧儚绱犲洓鍚堜竴璁捐銆備笁鏄熸槸2012骞10鏈堜笂甯傜殑涓娆炬櫤鑳藉钩鏉挎墜鏈猴紝鏀寔AndroidOS4.1鎿嶄綔绯荤粺銆
  • 鍗庝负nova6se鍜JN涓獳L10鏄悓涓娆炬満鍨嬪悧?
    绛旓細2銆佺浉鏈猴細鍚庣疆鍥涙憚锛4800涓囧儚绱犺秴鎰熷厜鎽勫儚澶达紙F/1.8鍏夊湀锛+800涓囧儚绱犺秴骞胯鎽勫儚澶达紙F/2.4鍏夊湀锛+200涓囧儚绱犲井璺濋暅澶达紙F/2.4鍏夊湀锛+200涓囧儚绱犺儗鏅櫄鍖栭暅澶达紙F/2.4鍏夊湀锛夈傚墠缃憚鍍忓ご1600涓囧儚绱狅紝f/2.0鍏夊湀锛屾媿鐓ф洿鍔犵粏鑵伙紝鏇村姞娓呮櫚銆3銆佹ц兘锛氶噰鐢‥MUI 10.0.1(鍩轰簬Android 10)绯荤粺锛屾惌杞藉崕涓...
  • 涓夋槦鍏ラ棬鏂版満Galaxy A13 5G鍗冲皢鍙戝竷 棰勮閰嶅5000涓囧儚绱JN1涓绘憚
    绛旓細5000姣畨鏃剁數姹鏀寔15W蹇熷厖鐢靛姛鑳姐傝繛鎺ュ姛鑳藉寘鎷4G LTE銆乄i-Fi銆佽摑鐗5.0銆丟PS/GPS銆3.5姣背闊抽鎻掑瓟鍜孶SB Type-C绔彛锛岃繖娆炬櫤鑳芥墜鏈鸿繍琛屽湪鍩轰簬Android 11鐨勪笁鏄烵neUI涓娿
  • 鍗庝负nova6se鍜JN涓獳L10鏄悓涓娆炬満鍨嬪悧?
    绛旓細1. 灞忓箷锛氳繖娆炬墜鏈洪厤澶囦簡涓鍧6.4鑻卞鐨勫睆骞曪紝鏀寔1670涓囪壊鏄剧ず锛屽垎杈ㄧ巼涓2310*1080鍍忕礌锛屼负鐢ㄦ埛甯︽潵瑙傚奖鍜屾祻瑙堢綉椤垫椂鐨勮垝閫備綋楠屻2. 鐩告満锛氭憚褰辨柟闈紝鍗庝负nova 6 SE鍚庣疆浜嗗洓鎽勫儚澶寸郴缁燂紝鍖呮嫭4800涓囧儚绱犵殑涓绘憚鍍忓ご锛團/1.8鍏夊湀锛夈800涓囧儚绱犵殑瓒呭箍瑙掓憚鍍忓ご锛團/2.4鍏夊湀锛夈200涓囧儚绱犵殑寰窛鎽勫儚澶达紙F...
  • vivos16鍙傛暟
    绛旓細鍓嶇疆鎽勫儚澶翠负5000涓囧儚绱狅紝鍓嶇疆鎽勫儚澶存惌杞JN1瓒呴珮鍍忕礌JN1鎰熷厜鍏冧欢锛鏀寔鏈楂4K60甯х殑瑙嗛鎷嶆憚锛屾诲儚绱犺緝涓婁唬鎻愬崌浜56锛咃紝鏀寔瓒呯骇PD瀵圭劍锛屾湁鏁堝皢瀵圭劍鍍忕礌澧炶嚦2鍊嶏紝閫氳繃閲囩敤瀹氬埗鐨勬煍鍏夌僵锛岃闂厜鐏殑鍏夌収鏇村姞杈冧负鍧囧寑锛屾敼鍠勬殫鍏夌幆澧冧笅鐨勪汉鍍忔媿鎽勮兘鍔涖倂ivoS16鎼浇楂橀氶獊榫870锛5G鑺墖锛岄噰鐢7绾崇背鍒剁▼宸ヨ壓锛...
  • 鏇漹ivox100绯诲垪鍙傛暟
    绛旓細鎵嬫満鍐呯疆浜5000mAh鐨勫ぇ瀹归噺鐢垫睜锛屽苟鏀寔120W鏈夌嚎蹇厖锛屼娇寰楃敤鎴峰湪蹇欑鐨勭敓娲讳腑涔熻兘闅忔椂闅忓湴鍏呯數銆傝繖娆炬墜鏈鸿繍琛屽熀浜Android14鐨凮riginOS4鎿嶄綔绯荤粺锛屾彁渚涗簡涓板瘜鐨勫姛鑳藉拰涓у寲鐨勪綋楠屻傛墜鏈鸿繕鏀寔钃濈墮5.4銆佺孩澶栦紶鎰熷櫒銆乄iFi7銆丯FC绛夎繛鎺ュ姛鑳斤紝鏂逛究鐢ㄦ埛杩涜鏁版嵁浼犺緭鍜岃澶囨帶鍒躲備互涓...
  • 鏈夋病鏈瀹夊崜骞抽潰灞忕殑瓒呭兼墜鏈烘帹鑽愪竴娆惧晩,涓嶆兂鐢ㄦ洸闈㈠睆,鐜板湪甯傞潰澶у閮芥槸...
    绛旓細realme GT2 Pro鍒欎笂浜5000涓囧儚绱犵殑150掳楸肩溂瓒呭箍瑙,浠ュ強鏀寔40鍊嶆斁澶х殑鏄惧井闀滃ご銆傜浉鏈虹殑瀹炵敤鎬,鍙帺鎬ф湁璐ㄧ殑鎻愬崌銆 缁间笂鎵杩,realme GT2 Pro鏇磋儨涓绛广 realme GT2 Pro涓嶄粎灞忓箷浣跨敤浜嗕笁鏄熺殑2K AMOLED鏃犵骇鍙樺抚鐩村睆銆佹惌杞界殑CPU涓洪珮閫氶獊榫8Gen1銆佷富鎽勫垯鏄50MP鐨凷ONY IMX766鍔犱笁鏄JN1,鎵嬫満鍚庣洊鏇存槸浠ョ敓鐗╁熀涓...
  • 鎷嶆憚鐓х墖鐢ㄥ摢娆炬墜鏈哄ソ?
    绛旓細vivo S12 Pro鎼浇鍩轰簬Android 12鐨凮riginOS Ocean鎿嶄綔绯荤粺,瀹炵幇浜嗙嫭鐗圭殑绯荤粺椋庢牸鍜岃仈閫氫竾鐗╃殑浜や簰,vivo S12 Pro鐨勬暎鐑郴缁熼噰鐢ㄥぇ闈㈢Н鐨刅C鍧囩儹鏉+鐭冲ⅷ鏁g儹鑶+鍐涚儹缁濈紭鑶滆璁° 褰卞儚鏂归潰: vivo S12 Pro鍓嶆憚閰嶇疆鍙岃壊娓╁洓鏌斿厜鐏,涓棰椾负5000涓囧儚绱犱富鎽,鎷ユ湁f/2.0鐨勫厜鍦,鏀寔鑷姩瀵圭劍;鍓嶇疆5000涓囪秴娓呭儚绱犻暅澶存槸vivo鑱斿悎涓...
  • vivo鏈鍊煎緱鍏ユ墜鐨勬墜鏈烘帹鑽
    绛旓細vivo S15 Pro鍐呯疆4500姣畨鏃剁數姹,鏀寔80鐡﹀弻鑺棯鍏,宄板艰浆鎹㈡晥鐜囪揪鍒颁簡98.5%,鍏呯數鎶鏈幏寰楀痉鍥借幈鑼靛畨鍏ㄥ揩鍏呰璇,10鍒嗛挓鍙互鍏呭叆53%,32鍒嗛挓鍙厖鑷100%銆 [5] 鍥:鎿嶄綔绯荤粺 vivo S15 Pro鎼浇鍩轰簬Android 12寮鍙戠殑OriginOS Ocean,鐢ㄦ埛鍙互閫氳繃鈥滃钩琛屼笘鐣屸濆湪OriginOS鍜孉ndroid涔嬮棿鍒囨崲,涓娆炬墜鏈轰綋楠屽埌涓ょ涓嶅悓绯荤粺UI...
  • java鍖呬笅鐨凪ETA-INF鏂囦欢澶逛笅鐨凪ANIFEST.MF鏂囦欢鏈夌椹綔鐢 android...
    绛旓細android瀹㈡埛绔湇鍔″櫒java鏂囦欢搴旇濡備綍閮ㄧ讲鍒皌omcat 1銆佸皢java绋嬪簭缂栬瘧鎴.class鏂囦欢锛屽鍒跺埌tomcat涓綘鐨勯」鐩噷鐨勭浉搴斾綅缃2銆佺幇鍦ㄥ緢澶氬紑鍙戝伐鍏峰彲浠ユ柟渚跨殑閮ㄧ讲java绋嬪簭鍒皌omcat锛屾瘮濡俥clipse 閫氳繃add鍜宺emove鏉ラ儴缃蹭綘鐨勯」鐩紝閫氳繃publish鏉ラ儴缃查」鐩埌tomcat浣犳墍璁惧畾鐨勪綅缃紝榛樿鏄痆鐩樼]:\workspace\.metadata\....
  • 扩展阅读:android苹果版下载 ... android系统怎么打开 ... 苹果android怎么设置 ... android在哪里打开 ... 苹果手机android在哪打开 ... android下载安装app ... 苹果android怎么打开 ... 平板android系统下载 ... 安卓手机解除data限制 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网