diff --git a/client/android/CMakeLists.txt b/client/android/CMakeLists.txt new file mode 100644 index 000000000..a4e04b8ca --- /dev/null +++ b/client/android/CMakeLists.txt @@ -0,0 +1,403 @@ +#需要的最cmake版本 +cmake_minimum_required(VERSION 3.4.1) + +#添加预编译宏定义参数,此次的作用是开启配置文件的引入! +add_definitions(-DANDROID -D"getlocaledecpoint()='.'" -DZ_SOLO) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -O3 -fvisibility=hidden -w") + +#缩短路径定义 +set(PM3_ROOT ../../) + +#添加动态库定义 +add_library(pm3rrg_rdv4 SHARED + ${PM3_ROOT}/common/util_posix.c + ${PM3_ROOT}/common/crapto1/crapto1.c + ${PM3_ROOT}/common/crapto1/crypto1.c + ${PM3_ROOT}/common/crc.c + ${PM3_ROOT}/common/crc16.c + ${PM3_ROOT}/common/crc32.c + ${PM3_ROOT}/common/crc64.c + ${PM3_ROOT}/common/cardhelper.c + ${PM3_ROOT}/common/parity.c + ${PM3_ROOT}/common/commonutil.c + ${PM3_ROOT}/common/generator.c + ${PM3_ROOT}/common/lfdemod.c + ${PM3_ROOT}/common/iso15693tools.c + ${PM3_ROOT}/common/bucketsort.c + ${PM3_ROOT}/common/legic_prng.c + ${PM3_ROOT}/common/mbedtls/aes.c + ${PM3_ROOT}/common/mbedtls/base64.c + ${PM3_ROOT}/common/mbedtls/rsa.c + ${PM3_ROOT}/common/mbedtls/rsa_internal.c + ${PM3_ROOT}/common/mbedtls/arc4.c + ${PM3_ROOT}/common/mbedtls/bignum.c + ${PM3_ROOT}/common/mbedtls/asn1parse.c + ${PM3_ROOT}/common/mbedtls/asn1write.c + ${PM3_ROOT}/common/mbedtls/blowfish.c + ${PM3_ROOT}/common/mbedtls/camellia.c + ${PM3_ROOT}/common/mbedtls/certs.c + ${PM3_ROOT}/common/mbedtls/des.c + ${PM3_ROOT}/common/mbedtls/ecdsa.c + ${PM3_ROOT}/common/mbedtls/ecp.c + ${PM3_ROOT}/common/mbedtls/ecp_curves.c + ${PM3_ROOT}/common/mbedtls/entropy.c + ${PM3_ROOT}/common/mbedtls/entropy_poll.c + ${PM3_ROOT}/common/mbedtls/error.c + ${PM3_ROOT}/common/mbedtls/md.c + ${PM3_ROOT}/common/mbedtls/md5.c + ${PM3_ROOT}/common/mbedtls/md_wrap.c + ${PM3_ROOT}/common/mbedtls/sha1.c + ${PM3_ROOT}/common/mbedtls/sha256.c + ${PM3_ROOT}/common/mbedtls/sha512.c + ${PM3_ROOT}/common/mbedtls/timing.c + ${PM3_ROOT}/common/mbedtls/cmac.c + ${PM3_ROOT}/common/mbedtls/oid.c + ${PM3_ROOT}/common/mbedtls/pem.c + ${PM3_ROOT}/common/mbedtls/pk.c + ${PM3_ROOT}/common/mbedtls/pk_wrap.c + ${PM3_ROOT}/common/mbedtls/pkcs5.c + ${PM3_ROOT}/common/mbedtls/pkcs12.c + ${PM3_ROOT}/common/mbedtls/pkparse.c + ${PM3_ROOT}/common/mbedtls/pkwrite.c + ${PM3_ROOT}/common/mbedtls/x509.c + ${PM3_ROOT}/common/mbedtls/x509_crl.c + ${PM3_ROOT}/common/mbedtls/x509_crt.c + ${PM3_ROOT}/common/mbedtls/ctr_drbg.c + ${PM3_ROOT}/common/mbedtls/cipher_wrap.c + ${PM3_ROOT}/common/mbedtls/cipher.c + ${PM3_ROOT}/common/mbedtls/platform_util.c + ${PM3_ROOT}/common//zlib/inflate.c + ${PM3_ROOT}/common/zlib/inffast.c + ${PM3_ROOT}/common/zlib/zutil.c + ${PM3_ROOT}/common/zlib/inftrees.c + ${PM3_ROOT}/common//zlib/adler32.c + # client inside + ${PM3_ROOT}/client/src/fileutils.c + ${PM3_ROOT}/client/src/uart/uart_posix.c + ${PM3_ROOT}/client/src/loclass/cipherutils.c + ${PM3_ROOT}/client/src/loclass/cipher.c + ${PM3_ROOT}/client/src/loclass/ikeys.c + ${PM3_ROOT}/client/src/loclass/elite_crack.c + ${PM3_ROOT}/client/src/emv/emvcore.c + ${PM3_ROOT}/client/src/emv/cmdemv.c + ${PM3_ROOT}/client/src/emv/tlv.c + ${PM3_ROOT}/client/src/emv/dol.c + ${PM3_ROOT}/client/src/emv/emv_tags.c + ${PM3_ROOT}/client/src/emv/emv_roca.c + ${PM3_ROOT}/client/src/emv/dump.c + ${PM3_ROOT}/client/src/emv/crypto_polarssl.c + ${PM3_ROOT}/client/src/emv/crypto.c + ${PM3_ROOT}/client/src/emv/emv_pk.c + ${PM3_ROOT}/client/src/emv/emv_pki.c + ${PM3_ROOT}/client/src/emv/emvjson.c + ${PM3_ROOT}/client/src/emv/apduinfo.c + ${PM3_ROOT}/client/src/emv/test/cryptotest.c + ${PM3_ROOT}/client/src/emv/test/sda_test.c + ${PM3_ROOT}/client/src/emv/test/dda_test.c + ${PM3_ROOT}/client/src/emv/test/cda_test.c + ${PM3_ROOT}/client/src/emv/test/crypto_test.c + ${PM3_ROOT}/client/src/emv/test/cryptotest.c + ${PM3_ROOT}/client/src/emv/test/sda_test.c + ${PM3_ROOT}/client/src/emv/test/dda_test.c + ${PM3_ROOT}/client/src/emv/test/cda_test.c + ${PM3_ROOT}/client/src/emv/test/crypto_test.c + ${PM3_ROOT}/client/src/crypto/libpcrypto.c + ${PM3_ROOT}/client/src/crypto/asn1utils.c + ${PM3_ROOT}/client/src/crypto/asn1dump.c + ${PM3_ROOT}/client/src/mifare/mad.c + ${PM3_ROOT}/client/src/mifare/mfkey.c + ${PM3_ROOT}/client/src/mifare/mifare4.c + ${PM3_ROOT}/client/src/mifare/mifarehost.c + ${PM3_ROOT}/client/src/mifare/ndef.c + ${PM3_ROOT}/client/src/mifare/desfire_crypto.c + ${PM3_ROOT}/client/src/mifare/mifaredefault.c + ${PM3_ROOT}/client/src/fido/cose.c + ${PM3_ROOT}/client/src/fido/fidocore.c + ${PM3_ROOT}/client/src/fido/cbortools.c + ${PM3_ROOT}/client/src/fido/additional_ca.c + ${PM3_ROOT}/client/src/preferences.c + ${PM3_ROOT}/client/src/graph.c + ${PM3_ROOT}/client/src/ui.c + ${PM3_ROOT}/client/src/tea.c + ${PM3_ROOT}/client/src/util.c + ${PM3_ROOT}/client/src/comms.c + ${PM3_ROOT}/client/src/cmdcrc.c + ${PM3_ROOT}/client/src/cmdanalyse.c + ${PM3_ROOT}/client/src/cmddata.c + ${PM3_ROOT}/client/src/cmdtrace.c + ${PM3_ROOT}/client/src/cmdhf.c + ${PM3_ROOT}/client/src/cmdhflto.c + ${PM3_ROOT}/client/src/aidsearch.c + ${PM3_ROOT}/client/src/cmdhf14a.c + ${PM3_ROOT}/client/src/cmdhf14b.c + ${PM3_ROOT}/client/src/cmdwiegand.c + ${PM3_ROOT}/client/src/wiegand_formatutils.c + ${PM3_ROOT}/client/src/wiegand_formats.c + ${PM3_ROOT}/client/src/cmdlfmotorola.c + ${PM3_ROOT}/client/src/cmdlfgallagher.c + ${PM3_ROOT}/client/src/cmdhf15.c + ${PM3_ROOT}/client/src/cmdhfepa.c + ${PM3_ROOT}/client/src/cmdhflegic.c + ${PM3_ROOT}/client/src/cmdhfthinfilm.c + ${PM3_ROOT}/client/src/cmdflashmemspiffs.c + ${PM3_ROOT}/client/src/cmdhffelica.c + ${PM3_ROOT}/client/src/cmdhficlass.c + ${PM3_ROOT}/client/src/cmdhflist.c + ${PM3_ROOT}/client/src/cmdhfmf.c + ${PM3_ROOT}/client/src/cmdhfmfdes.c + ${PM3_ROOT}/client/src/cmdhfmfu.c + ${PM3_ROOT}/client/src/cmdhfmfp.c + ${PM3_ROOT}/client/src/cmdhffido.c + ${PM3_ROOT}/client/src/cmdhftopaz.c + ${PM3_ROOT}/client/src/cmdhw.c + ${PM3_ROOT}/client/src/cmdlf.c + ${PM3_ROOT}/client/src/cmdlfkeri.c + ${PM3_ROOT}/client/src/cmdlffdx.c + ${PM3_ROOT}/client/src/cmdlfio.c + ${PM3_ROOT}/client/src/cmdlfem4x.c + ${PM3_ROOT}/client/src/cmdlfhid.c + ${PM3_ROOT}/client/src/cmdlfnedap.c + ${PM3_ROOT}/client/src/cmdlfguard.c + ${PM3_ROOT}/client/src/cmdlfhitag.c + ${PM3_ROOT}/client/src/cmdlfjablotron.c + ${PM3_ROOT}/client/src/cmdsmartcard.c + ${PM3_ROOT}/client/src/cmdlfti.c + ${PM3_ROOT}/client/src/cmdlfpac.c + ${PM3_ROOT}/client/src/cmdlfnoralsy.c + ${PM3_ROOT}/client/src/cmdlfnexwatch.c + ${PM3_ROOT}/client/src/cmdlfpresco.c + ${PM3_ROOT}/client/src/cmdlfindala.c + ${PM3_ROOT}/client/src/cmdlfviking.c + ${PM3_ROOT}/client/src/cmdlfsecurakey.c + ${PM3_ROOT}/client/src/cmdlfpyramid.c + ${PM3_ROOT}/client/src/cmdlfparadox.c + ${PM3_ROOT}/client/src/cmdlfcotag.c + ${PM3_ROOT}/client/src/cmdlfawid.c + ${PM3_ROOT}/client/src/cmdparser.c + ${PM3_ROOT}/client/src/cmdscript.c + ${PM3_ROOT}/client/src/cmdlfvisa2000.c + ${PM3_ROOT}/client/src/whereami.c + ${PM3_ROOT}/client/src/cmdmain.c + ${PM3_ROOT}/client/src/cmdflashmem.c + ${PM3_ROOT}/client/src/scripting.c + ${PM3_ROOT}/client/src/pm3_binlib.c + ${PM3_ROOT}/client/src/pm3_bitlib.c + ${PM3_ROOT}/client/src/cmdlft55xx.c + ${PM3_ROOT}/client/src/cmdlfpcf7931.c + ${PM3_ROOT}/client/src/cmdhfmfhard.c + ${PM3_ROOT}/client/src/cmdusart.c + # deps ouside + ${PM3_ROOT}/client/deps/jansson/utf.c + ${PM3_ROOT}/client/deps/jansson/dump.c + ${PM3_ROOT}/client/deps/jansson/path.c + ${PM3_ROOT}/client/deps/jansson/load.c + ${PM3_ROOT}/client/deps/jansson/error.c + ${PM3_ROOT}/client/deps/jansson/value.c + ${PM3_ROOT}/client/deps/jansson/memory.c + ${PM3_ROOT}/client/deps/jansson/pack_unpack.c + ${PM3_ROOT}/client/deps/jansson/hashtable_seed.c + ${PM3_ROOT}/client/deps/jansson/strbuffer.c + ${PM3_ROOT}/client/deps/jansson/strconv.c + ${PM3_ROOT}/client/deps/jansson/hashtable.c + ${PM3_ROOT}/client/deps/jansson/hashtable.c + # cliparser + ${PM3_ROOT}/client/deps/cliparser/cliparser.c + ${PM3_ROOT}/client/deps/cliparser/argtable3.c + # tinycbor + ${PM3_ROOT}/client/deps/tinycbor/cborencoder.c + ${PM3_ROOT}/client/deps/tinycbor/cborencoder_close_container_checked.c + ${PM3_ROOT}/client/deps/tinycbor/cborerrorstrings.c + ${PM3_ROOT}/client/deps/tinycbor/cborparser.c + ${PM3_ROOT}/client/deps/tinycbor/cborparser_dup_string.c + ${PM3_ROOT}/client/deps/tinycbor/cborpretty.c + ${PM3_ROOT}/client/deps/tinycbor/cborpretty_stdio.c + ${PM3_ROOT}/client/deps/tinycbor/cbortojson.c + ${PM3_ROOT}/client/deps/tinycbor/cborvalidation.c + ${PM3_ROOT}/client/deps/tinycbor/open_memstream.c + # reveng + ${PM3_ROOT}/client/deps/reveng/cli.c + ${PM3_ROOT}/client/deps/reveng/bmpbit.c + ${PM3_ROOT}/client/deps/reveng/preset.c + ${PM3_ROOT}/client/deps/reveng/model.c + ${PM3_ROOT}/client/deps/reveng/poly.c + ${PM3_ROOT}/client/deps/reveng/reveng.c + # liblua + ${PM3_ROOT}/client/deps/liblua/lapi.c + ${PM3_ROOT}/client/deps/liblua/ldo.c + ${PM3_ROOT}/client/deps/liblua/lgc.c + ${PM3_ROOT}/client/deps/liblua/ltm.c + ${PM3_ROOT}/client/deps/liblua/lvm.c + ${PM3_ROOT}/client/deps/liblua/lzio.c + ${PM3_ROOT}/client/deps/liblua/lcode.c + ${PM3_ROOT}/client/deps/liblua/llex.c + ${PM3_ROOT}/client/deps/liblua/liolib.c + ${PM3_ROOT}/client/deps/liblua/loslib.c + ${PM3_ROOT}/client/deps/liblua/lopcodes.c + ${PM3_ROOT}/client/deps/liblua/lmem.c + ${PM3_ROOT}/client/deps/liblua/lmathlib.c + ${PM3_ROOT}/client/deps/liblua/ldump.c + ${PM3_ROOT}/client/deps/liblua/ldblib.c + ${PM3_ROOT}/client/deps/liblua/lundump.c + ${PM3_ROOT}/client/deps/liblua/lcorolib.c + ${PM3_ROOT}/client/deps/liblua/lauxlib.c + ${PM3_ROOT}/client/deps/liblua/ltablib.c + ${PM3_ROOT}/client/deps/liblua/linit.c + ${PM3_ROOT}/client/deps/liblua/lstring.c + ${PM3_ROOT}/client/deps/liblua/lctype.c + ${PM3_ROOT}/client/deps/liblua/ltable.c + ${PM3_ROOT}/client/deps/liblua/ldebug.c + ${PM3_ROOT}/client/deps/liblua/lstate.c + ${PM3_ROOT}/client/deps/liblua/lstrlib.c + ${PM3_ROOT}/client/deps/liblua/lfunc.c + ${PM3_ROOT}/client/deps/liblua/lparser.c + ${PM3_ROOT}/client/deps/liblua/lobject.c + ${PM3_ROOT}/client/deps/liblua/loadlib.c + ${PM3_ROOT}/client/deps/liblua/lbaselib.c + ${PM3_ROOT}/client/deps/liblua/lbitlib.c + ${PM3_ROOT}/client/deps/hardnested/hardnested_bruteforce.c + # android source + jni_tools.c + pm3_main.c + ) + +#添加头文件配置 +target_include_directories(pm3rrg_rdv4 PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${PM3_ROOT}/ + ${PM3_ROOT}/include/ + ${PM3_ROOT}/common + ${PM3_ROOT}/common/zlib + ${PM3_ROOT}/common_fpga + ${PM3_ROOT}/common/mbedtls + ${PM3_ROOT}/client/src + ${PM3_ROOT}/client/src/fido + ${PM3_ROOT}/client/src/uart + ${PM3_ROOT}/client/deps/liblua + ${PM3_ROOT}/client/deps/reveng + ${PM3_ROOT}/client/deps/jansson + ${PM3_ROOT}/client/deps/tinycbor + ${PM3_ROOT}/client/deps/cliparser + ${PM3_ROOT}/client/deps/hardnested) + +## CPU-specific code +## These are mostly for x86-based architectures, which is not useful for many Android devices. +add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT + ${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c + ${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) + +target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE + ${PM3_ROOT}/common + ${PM3_ROOT}/client + ${PM3_ROOT}/include/ + ${PM3_ROOT}/client/deps/hardnested) + +set(X86_CPUS x86 x86_64 i686) + +message(STATUS "CMAKE_SYSTEM_PROCESSOR := ${CMAKE_SYSTEM_PROCESSOR}") + +if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) + message(STATUS "Building optimised x86/x86_64 binaries") + target_compile_options(pm3rrg_rdv4_hardnested_nosimd BEFORE PRIVATE + -mno-mmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) + + set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) + + ## x86 / MMX + add_library(pm3rrg_rdv4_hardnested_mmx OBJECT + ${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c + ${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) + + target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE + -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) + + target_include_directories(pm3rrg_rdv4_hardnested_mmx PRIVATE + ${PM3_ROOT}/common + ${PM3_ROOT}/client + ${PM3_ROOT}/include/ + ${PM3_ROOT}/client/deps/hardnested) + + set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) + + ## x86 / SSE2 + add_library(pm3rrg_rdv4_hardnested_sse2 OBJECT + ${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c + ${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) + + target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE + -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) + + target_include_directories(pm3rrg_rdv4_hardnested_sse2 PRIVATE + ${PM3_ROOT}/common + ${PM3_ROOT}/client + ${PM3_ROOT}/include/ + ${PM3_ROOT}/client/deps/hardnested) + + set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) + + ## x86 / AVX + add_library(pm3rrg_rdv4_hardnested_avx OBJECT + ${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c + ${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) + + target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE + -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) + + target_include_directories(pm3rrg_rdv4_hardnested_avx PRIVATE + ${PM3_ROOT}/common + ${PM3_ROOT}/client + ${PM3_ROOT}/include/ + ${PM3_ROOT}/client/deps/hardnested) + + set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) + + ## x86 / AVX2 + add_library(pm3rrg_rdv4_hardnested_avx2 OBJECT + ${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c + ${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) + + target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE + -mmmx -msse2 -mavx -mavx2 -mno-avx512f) + + target_include_directories(pm3rrg_rdv4_hardnested_avx2 PRIVATE + ${PM3_ROOT}/common + ${PM3_ROOT}/client + ${PM3_ROOT}/include/ + ${PM3_ROOT}/client/deps/hardnested) + + set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) + + ## x86 / AVX512 + add_library(pm3rrg_rdv4_hardnested_avx512 OBJECT + ${PM3_ROOT}/client/deps/hardnested/hardnested_bf_core.c + ${PM3_ROOT}/client/deps/hardnested/hardnested_bitarray_core.c) + + target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE + -mmmx -msse2 -mavx -mavx2 -mavx512f) + + target_include_directories(pm3rrg_rdv4_hardnested_avx512 PRIVATE + ${PM3_ROOT}/common + ${PM3_ROOT}/client + ${PM3_ROOT}/include/ + ${PM3_ROOT}/client/deps/hardnested) + + set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) + + set(SIMD_TARGETS + $ + $ + $ + $ + $) +else () + message(STATUS "Not building optimised targets") + set(SIMD_TARGETS) +endif () + +#定义为静态库,被最终的pm3库依赖! +add_library(pm3rrg_rdv4_hardnested STATIC + $ + ${SIMD_TARGETS}) + +#添加动态库链接! +target_link_libraries(pm3rrg_rdv4 pm3rrg_rdv4_hardnested android log z) \ No newline at end of file diff --git a/client/android/jni_tools.c b/client/android/jni_tools.c new file mode 100644 index 000000000..74e05051c --- /dev/null +++ b/client/android/jni_tools.c @@ -0,0 +1,97 @@ +// +// Created by DXL on 2017/9/1. +// + +//including header +#include +#include +#include "stdbool.h" + +//当前线程是否添加的标志位 +static bool g_IsAttach; + +//TODO 环境变量获取函数 +JNIEnv *getJniEnv() { + JNIEnv *currentThreadEnv; + g_IsAttach = false; + if ((*g_JavaVM)->GetEnv(g_JavaVM, (void **) ¤tThreadEnv, JNI_VERSION_1_4) != JNI_OK) { + LOGE("Get Env Fail!"); + if ((*g_JavaVM)->AttachCurrentThread(g_JavaVM, ¤tThreadEnv, NULL) != JNI_OK) { + LOGE("Attach the current thread Fail!"); + g_IsAttach = false; + return NULL; + } else { + g_IsAttach = true; + LOGE("Attach the current thread Success!"); + return currentThreadEnv; + } + } else { + g_IsAttach = false; + //LOGE("Get Env Success!"); + return currentThreadEnv; + } +} + +//解绑线程env +void deatchThread() { + if (g_IsAttach) { + LOGD("线程解绑成功!"); + (*g_JavaVM)->DetachCurrentThread(g_JavaVM); + } +} + +//TODO 命令行解析 +CMD *parse_command_line(const char *commandStr) { + //一个指针,指向传进来的命令字符串(const修饰的,我们需要复刻一份!) + CMD *cmd = (CMD *) malloc(sizeof(CMD)); + if (!cmd) { + LOGD("申请空间失败!"); + return NULL; + } + //拷贝字符串到堆空间! + char *pTmp = strdup(commandStr); + LOGD("拷贝参数字符串到临时堆!"); + //返回的结果!先初始化为20个空间 + int size = 20; + cmd->cmd = (char **) malloc(size * sizeof(char **)); + if (cmd->cmd) { + LOGD("申请参数空间成功!"); + } else { + LOGD("申请空间失败!"); + } + //进行截取 + char *pStr = strtok(pTmp, " "); + LOGD("第0次截取完成: %s", pStr); + //给结果数组进行下标为0的第一次初始化 + cmd->cmd[0] = pStr; + //局部变量用于储存解析到的命令个数,下标移动为一 + int count = 1; + //需要截取命令参数,以空格为限定符 + for (; pStr != NULL; ++count) { + //如果容量不够,则扩容! + if (count == (size - 1)) { + size += 20; + cmd->cmd = (char **) realloc(cmd->cmd, size * sizeof(char **)); + LOGD("超过初始容量,自动扩容!"); + } + pStr = strtok(NULL, " "); + if (pStr) { + cmd->cmd[count] = pStr; + LOGD("第%d次截取完成: %s", count, pStr); + } + } + cmd->len = (count - 1); + LOGD("解析函数执行完成!"); + return cmd; +} + +//内存释放 +void free_command_line(CMD *cmd) { + //二级指针需要逐层释放! + LOGD("释放命令行字符串二级引用!"); + free(cmd->cmd[0]); + LOGD("释放命令行一级引用!"); + free(cmd->cmd); + LOGD("释放结构体内存"); + free(cmd); +} \ No newline at end of file diff --git a/client/android/jni_tools.h b/client/android/jni_tools.h new file mode 100644 index 000000000..121cf043f --- /dev/null +++ b/client/android/jni_tools.h @@ -0,0 +1,40 @@ +// +// Created by dell on 2017/9/1. +// + +#ifndef DXL_TOOLS_H +#define DXL_TOOLS_H + +#include +#include +#include + +//JNI LOG +#define TAG "DXL BlUESPP_PN532" +#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE,TAG,__VA_ARGS__) +#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__) +#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__) +#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG,__VA_ARGS__) +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__) + +//全局的环境变量定义 +JavaVM *g_JavaVM; + +//线程环境指针获取函数 +JNIEnv *getJniEnv(); + +//子线程释放函数,必须是native层创建的线程才可以调用 +void deatchThread(); + +typedef struct { + char **cmd; + int len; +} CMD; + +//命令行解析函数 +CMD *parse_command_line(const char *commandStr); + +//解析结果释放函数! +void free_command_line(CMD *); + +#endif //DXL_TOOLS_H \ No newline at end of file diff --git a/client/android/pm3_main.c b/client/android/pm3_main.c new file mode 100644 index 000000000..d9c2386c8 --- /dev/null +++ b/client/android/pm3_main.c @@ -0,0 +1,175 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2009 Michael Gernoth +// Copyright (C) 2010 iZsh +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// Main binary +//----------------------------------------------------------------------------- + +#include "proxmark3.h" + +#include +#include // for Mingw readline +#include +#include +#include +#include "usart_defs.h" +#include "util_posix.h" +#include "proxgui.h" +#include "cmdmain.h" +#include "ui.h" +#include "cmdhw.h" +#include "whereami.h" +#include "comms.h" +#include "fileutils.h" +#include "jni_tools.h" + +#define LOCAL_SOCKET_SERVER_NAME "DXL.COM.ASL" + +void ShowGraphWindow() { + +} + +void HideGraphWindow(void) { + +} + +void RepaintGraphWindow() { + +} + +int push_cmdscriptfile(char *path, bool stayafter) { + return PM3_SUCCESS; +} + +static char *my_executable_path = NULL; +static char *my_executable_directory = NULL; + +const char *get_my_executable_path(void) { + return my_executable_path; +} + +const char *get_my_executable_directory(void) { + return my_executable_directory; +} + +static void set_my_executable_path(void) { + +} + +static const char *my_user_directory = NULL; + +const char *get_my_user_directory(void) { + return my_user_directory; +} + +static void set_my_user_directory(void) { +} + +static bool open() { + if (conn.run) { + return true; + } + // Open with LocalSocket(Not a tcp connection!) + bool ret = OpenProxmark("socket:"LOCAL_SOCKET_SERVER_NAME, false, 1000, false, 115200); + return ret; +} + +/* + * 发送一条命令等待执行! + * */ +jint sendCMD(JNIEnv *env, jobject instance, jstring cmd_) { + //may be pm3 not running. + if (!conn.run) { + if (open() && TestProxmark() == PM3_SUCCESS) { + LOGD("Open Successfully!"); + PrintAndLogEx(NORMAL, "Open Successfully!"); + } else { + LOGD("Open failed!"); + PrintAndLogEx(NORMAL, "Open failed!"); + CloseProxmark(); + } + } + //无论如何,新的命令的输入了,就要换个行! + PrintAndLogEx(NORMAL, "\n"); + char *cmd = (char *) ((*env)->GetStringUTFChars(env, cmd_, 0)); + // Many parts of the PM3 client will assume that they can read any write from pwd. So we set + // pwd to whatever the PM3 "executable directory" is, to get consistent behaviour. + /*int ret = chdir(get_my_executable_directory()); + if (ret == -1) { + LOGW("Couldn't chdir(get_my_executable_directory()), errno=%s", strerror(errno)); + } + char pwd[1024]; + memset((void *) &pwd, 0, sizeof(pwd)); + getcwd((char *) &pwd, sizeof(pwd)); + LOGI("pwd = %s", pwd);*/ + int ret = CommandReceived(cmd); + if (ret == 99) { + // exit / quit + // TODO: implement this + PrintAndLogEx(NORMAL, "Asked to exit, can't really do that yet..."); + } + (*env)->ReleaseStringUTFChars(env, cmd_, cmd); + return ret; +} + +/* + * 是否在执行命令 + * */ +jboolean isExecuting(JNIEnv *env, jobject instance) { + return (jboolean) ((jboolean) conn.run); +} + +/* + * 进行设备链接验证! + * */ +jboolean testPm3(JNIEnv *env, jobject instance) { + bool ret1 = open(); + if (!ret1) { + CloseProxmark(); + return false; + } + bool ret2 = TestProxmark() == PM3_SUCCESS; + return (jboolean) (ret1 && ret2); +} + +void stopPm3(JNIEnv *env, jobject instance) { + CloseProxmark(); +} + +JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { + JNIEnv *jniEnv = NULL; + if ((*vm)->GetEnv(vm, (void **) &jniEnv, JNI_VERSION_1_4) != JNI_OK) { + return -1; + } + (*jniEnv)->GetJavaVM(jniEnv, &g_JavaVM); + jclass clazz = (*jniEnv)->FindClass(jniEnv, "cn/rrg/natives/Proxmark3RRGRdv4Tools"); + if (clazz == NULL) { + return -1; + } + jclass clz_test = (*jniEnv)->FindClass(jniEnv, "cn/rrg/devices/Proxmark3RRGRdv4"); + JNINativeMethod methods[] = { + {"startExecute", "(Ljava/lang/String;)I", (void *) sendCMD}, + {"stopExecute", "()V", (void *) stopPm3}, + {"isExecuting", "()Z", (void *) isExecuting} + }; + JNINativeMethod methods1[] = { + {"testPm3", "()Z", (void *) testPm3}, + {"closePm3", "()V", stopPm3} + }; + if ((*jniEnv)->RegisterNatives(jniEnv, clazz, methods, sizeof(methods) / sizeof(methods[0])) != + JNI_OK) { + return -1; + } + if ((*jniEnv)->RegisterNatives(jniEnv, clz_test, methods1, + sizeof(methods1) / sizeof(methods1[0])) != + JNI_OK) { + return -1; + } + (*jniEnv)->DeleteLocalRef(jniEnv, clazz); + (*jniEnv)->DeleteLocalRef(jniEnv, clz_test); + return JNI_VERSION_1_4; +}