【APP解密系列】04APP反编译静态分析

admin 2026-02-03 01:09:06 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍了使用jadx进行AndroidAPP反编译静态分析的方法,涵盖Windows和Mac下的安装与启动。详细讲解了针对未加固及加固APP的分析步骤,并提供了dex2jar脚本用于批量将DEX转换为JAR以便于进一步分析,适合移动安全入门学习。 综合评分: 85 文章分类: 逆向分析,移动安全,安全工具


cover_image

【APP解密系列】04 APP反编译静态分析

原创

GSCL GSCL

GSCL Sec

2026年2月2日 08:02 甘肃

APP反编译静态分析

引言

jadx 是用于从 Android Dex 和 Apk 文件中生成 Java 源代码的命令行和图形用户界面工具,DEX是编译后的Android APP源代码,jadx就是反编译工具,将编译后的DEX文件反编译为可读的JAVA代码。

安装

Windows系统 直接去Github的releases中下载即可,图形化即jadx-gui https://github.com/skylot/jadx/releases/tag/v1.5.3 Macos系统 直接安装即可使用 brew install jadx

启动

直接命令行jadx-gui即可启动应用,windows打开对应的exe文件即可

未加固的APP

直接将apk文件拖入jadx工具既可打开分析

加固的APP

参考前面的文章APP脱壳【APP解密系列】02 APP脱壳

将APP脱壳之后,会形成dex文件 将整个文件夹拖入jadx既可进行简单的分析

如何批量将dex文件转换为jar文件

dex 仅适配安卓运行环境,如何将其转换为适配性更强的jar文件呢 借助dex2jar工具,解压并将其放置到脚本目录下 官方下载链接: https://github.com/pxb1988/dex2jar/releases

MAC下脚本

#!/usr/bin/env bash## 批量将 DEX 转为 JAR,并合并为一个 JAR# 优先使用 dex2jar(快),未安装时使用当前目录的 enjarify## 用法: ./dex2jar_merge.sh [DEX目录] [输出JAR路径]#   参数1: 输入的 dex 文件所在目录,默认为脚本运行时的当前目录#   参数2: 输出的合并 JAR 文件路径,默认为当前目录下的 merged.jar#set -eSCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"RUN_DIR="$(pwd)"ENJARIFY_DIR="$SCRIPT_DIR/enjarify"INPUT_DIR="${1:-$RUN_DIR}"OUTPUT_JAR="${2:-$RUN_DIR/merged.jar}"JAR_STAGE="$SCRIPT_DIR/.jar_stage"MERGE_DIR="$SCRIPT_DIR/.merge_tmp"if [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]]; then  echo "用法: $0 [DEX目录] [输出JAR路径]"  echo "  DEX目录   输入的 .dex 文件所在目录(默认: 当前目录)"  echo "  输出JAR   合并后的 JAR 文件路径(默认: 当前目录/merged.jar)"  echo "示例: $0 /path/to/dex_dir /path/to/out.jar"  exit 0fi# 强制使用 enjarify 时可设置: USE_ENJARIFY=1 ./dex2jar_merge.shUSE_ENJARIFY="${USE_ENJARIFY:-0}"# 选择转换工具:优先 dex2jar(快很多),自动找当前目录下的 dex-toolsD2J_CMD=""if [[ "$USE_ENJARIFY" != "1" ]]; then  if [[ -n "$DEX2JAR_HOME" ]] && [[ -x "$DEX2JAR_HOME/d2j-dex2jar.sh" ]]; then    D2J_CMD="$DEX2JAR_HOME/d2j-dex2jar.sh"  else    # 当前目录下查找 dex-tools-* 或 dex-tools*    for dir in "$SCRIPT_DIR"/dex-tools*; do      if [[ -d "$dir" ]] && [[ -x "$dir/d2j-dex2jar.sh" ]]; then        D2J_CMD="$dir/d2j-dex2jar.sh"        break      fi    done  fi  if [[ -z "$D2J_CMD" ]]; then    command -v d2j-dex2jar &>/dev/null && D2J_CMD="d2j-dex2jar"    [[ -z "$D2J_CMD" ]] && command -v d2j-dex2jar.sh &>/dev/null && D2J_CMD="d2j-dex2jar.sh"  fifiif [[ -n "$D2J_CMD" ]]; then  CONVERTER="dex2jar"else  if [[ ! -f "$ENJARIFY_DIR/enjarify.sh" ]]; then    echo "错误: 未找到转换工具"    echo "方案一(推荐,更快): 将 dex-tools 解压到当前目录(如 dex-tools-v2.4/)"    echo "  下载: https://github.com/pxb1988/dex2jar/releases"    echo "方案二: 将 enjarify 放在当前目录的 enjarify/ 下"    exit 1  fi  CONVERTER="enjarify"firm -rf "$JAR_STAGE" "$MERGE_DIR"mkdir -p "$JAR_STAGE" "$MERGE_DIR"# 无论正常退出还是报错,都删除中间目录,只保留最终 JARtrap 'rm -rf "$JAR_STAGE" "$MERGE_DIR"' EXITecho "输入目录: $INPUT_DIR"echo "输出 JAR: $OUTPUT_JAR"echo ""echo "=== 1/2 批量 DEX -> JAR($CONVERTER)==="count=0for dex in "$INPUT_DIR"/*.dex; do  [[ -f "$dex" ]] || continue  name=$(basename "$dex" .dex)  out="$JAR_STAGE/${name}.jar"  echo "[$((++count))] $(basename "$dex") -> $(basename "$out")"  if [[ "$CONVERTER" == "dex2jar" ]]; then    "$D2J_CMD" -f -o "$out" "$dex" || { echo "    失败: $dex"; exit 1; }  else    (      cd "$ENJARIFY_DIR"      export PYTHONPATH="$ENJARIFY_DIR"      python3 -O -m enjarify.main -o "$out" -f "$dex"    ) || { echo "    失败: $dex"; exit 1; }  fidoneif [[ $count -eq 0 ]]; then  echo "未找到任何 .dex 文件"  exit 1fiecho ""echo "=== 2/2 合并为单个 JAR ==="# 用 jar 解压/打包,避免 unzip 对 JAR 内中文等 UTF-8 文件名报 Illegal byte sequenceif command -v jar &>/dev/null; then  for jar in "$JAR_STAGE"/*.jar; do    [[ -f "$jar" ]] || continue    echo "  解包: $(basename "$jar")"    (cd "$MERGE_DIR" && jar xf "$jar")    rm -f "$jar"  done  echo "  打包: $OUTPUT_JAR"  (cd "$MERGE_DIR" && jar cf "$OUTPUT_JAR" .)else  export LC_ALL=en_US.UTF-8  for jar in "$JAR_STAGE"/*.jar; do    [[ -f "$jar" ]] || continue    echo "  解包: $(basename "$jar")"    unzip -o -q "$jar" -d "$MERGE_DIR"    rm -f "$jar"  done  echo "  打包: $OUTPUT_JAR"  (cd "$MERGE_DIR" && zip -r -q "$OUTPUT_JAR" .)fiecho ""echo "完成: 共转换 $count 个 DEX,已合并为 $OUTPUT_JAR"

Windwos下脚本

@echo offsetlocal EnableDelayedExpansionchcp 65001 >nultitle DEX to JAR Merge:: ============================================================:: Batch script: convert DEX to JAR and merge into one JAR:: Same behavior as dex2jar_merge.sh on Linux/Mac:::: Usage: dex2jar_merge.bat [DEX_dir] [output_jar]::   Arg1: directory containing .dex files (default: current dir)::   Arg2: path of merged output JAR (default: current_dir\merged.jar):: ============================================================:: Script dir (no trailing backslash for easier concat)set "SCRIPT_DIR=%~dp0"if "%SCRIPT_DIR:~-1%"=="\" set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%"set "RUN_DIR=%CD%"set "ENJARIFY_DIR=%SCRIPT_DIR%\enjarify":: Parameters: default to current directoryif "%~1"=="" (set "INPUT_DIR=%RUN_DIR%") else (set "INPUT_DIR=%~1")if "%~2"=="" (set "OUTPUT_JAR=%RUN_DIR%\merged.jar") else (set "OUTPUT_JAR=%~2"):: Normalize paths (remove trailing backslash for INPUT_DIR)if "%INPUT_DIR:~-1%"=="\" set "INPUT_DIR=%INPUT_DIR:~0,-1%":: Helpif "%~1"=="-h" goto :helpif "%~1"=="--help" goto :helpif "%~1"=="/?" goto :help:: Temp dirs (under script dir, same as .sh)set "JAR_STAGE=%SCRIPT_DIR%\.jar_stage"set "MERGE_DIR=%SCRIPT_DIR%\.merge_tmp":: Resolve converter: dex2jar (prefer) or enjarifyset "D2J_CMD="if not "%USE_ENJARIFY%"=="1" (  if defined DEX2JAR_HOME (    if exist "!DEX2JAR_HOME!\d2j-dex2jar.bat" set "D2J_CMD=!DEX2JAR_HOME!\d2j-dex2jar.bat"  )  if "!D2J_CMD!"=="" (    for /d %%D in ("%SCRIPT_DIR%\dex-tools*") do (      if exist "%%~D\d2j-dex2jar.bat" (        set "D2J_CMD=%%~D\d2j-dex2jar.bat"        goto :d2j_found      )    )    :: Also check run dir (current dir) for dex-tools    for /d %%D in ("%RUN_DIR%\dex-tools*") do (      if exist "%%~D\d2j-dex2jar.bat" (        set "D2J_CMD=%%~D\d2j-dex2jar.bat"        goto :d2j_found      )    )    where d2j-dex2jar.bat >nul 2>&1 && set "D2J_CMD=d2j-dex2jar.bat"    where d2j-dex2jar >nul 2>&1 && set "D2J_CMD=d2j-dex2jar"  )  :d2j_found)if defined D2J_CMD (  set "CONVERTER=dex2jar") else (  if not exist "%ENJARIFY_DIR%\enjarify.sh" (    if not exist "%ENJARIFY_DIR%\enjarify\main.py" (      echo Error: No converter found.      echo Option 1: Extract dex-tools to script dir or current dir ^(e.g. dex-tools-v2.4^)      echo   Download: https://github.com/pxb1988/dex2jar/releases      echo Option 2: Put enjarify in script_dir\enjarify\      exit /b 1    )  )  set "CONVERTER=enjarify"):: Clean and create temp dirsif exist "%JAR_STAGE%" rd /s /q "%JAR_STAGE%"if exist "%MERGE_DIR%" rd /s /q "%MERGE_DIR%"mkdir "%JAR_STAGE%"mkdir "%MERGE_DIR%"echo Input dir: %INPUT_DIR%echo Output JAR: %OUTPUT_JAR%echo.echo === 1/2 DEX -^> JAR ^(%CONVERTER%^) ===set "count=0"for %%f in ("%INPUT_DIR%\*.dex") do (  set /a count+=1  set "name=%%~nf"  set "out=%JAR_STAGE%\!name!.jar"  echo [!count!] %%~nxf -^> !name!.jar  if "!CONVERTER!"=="dex2jar" (    call "!D2J_CMD!" -f -o "!out!" "%%f"    if errorlevel 1 ( echo   Failed: %%f & goto :cleanup_err )  ) else (    pushd "%ENJARIFY_DIR%"    set "PYTHONPATH=%ENJARIFY_DIR%"    python -O -m enjarify.main -o "!out!" -f "%%f"    set "pyerr=!errorlevel!"    popd    if !pyerr! neq 0 ( echo   Failed: %%f & goto :cleanup_err )  ))if %count% equ 0 (  echo No .dex files found.  goto :cleanup_err)echo.echo === 2/2 Merge into one JAR ===:: Prefer jar (Java) to avoid encoding issues with non-ASCII nameswhere jar >nul 2>&1if %errorlevel% equ 0 (  for %%j in ("%JAR_STAGE%\*.jar") do (    echo   Extract: %%~nxj    pushd "%MERGE_DIR%"    jar xf "%%j"    popd    del /f /q "%%j"  )  echo   Pack: %OUTPUT_JAR%  for %%A in ("%OUTPUT_JAR%") do (    set "OUT_DIR=%%~dpA"    if not "%%~dpA"=="" if not exist "%%~dpA" mkdir "%%~dpA"  )  pushd "%MERGE_DIR%"  jar cf "%OUTPUT_JAR%" .  popd) else (  :: Fallback: PowerShell Expand-Archive or leave merge to user  echo   Using jar is recommended ^(install JDK^). Checking for jar...  for %%j in ("%JAR_STAGE%\*.jar") do (    echo   Extract: %%~nxj    powershell -NoProfile -Command "Expand-Archive -Path '%%j' -DestinationPath '%MERGE_DIR%' -Force"    del /f /q "%%j"  )  for %%A in ("%OUTPUT_JAR%") do (    set "OUT_DIR=%%~dpA"    if not "%%~dpA"=="" if not exist "%%~dpA" mkdir "%%~dpA"  )  powershell -NoProfile -Command "Compress-Archive -Path \"%MERGE_DIR%\*\" -DestinationPath \"%OUTPUT_JAR%\" -Force")echo.echo Done: %count% DEX merged into %OUTPUT_JAR%goto :cleanup_ok:cleanup_errecho.echo Aborted or failed.rd /s /q "%JAR_STAGE%" 2>nulrd /s /q "%MERGE_DIR%" 2>nulexit /b 1:cleanup_okrd /s /q "%JAR_STAGE%" 2>nulrd /s /q "%MERGE_DIR%" 2>nulexit /b 0:helpecho Usage: %~nx0 [DEX_dir] [output_jar]echo   DEX_dir    Directory containing .dex files ^(default: current dir^)echo   output_jar Path of merged JAR ^(default: current_dir\merged.jar^)echo Example: %~nx0 C:\dex_files C:\out\merged.jarecho.echo Set DEX2JAR_HOME to use dex-tools from another location.echo Set USE_ENJARIFY=1 to force enjarify instead of dex2jar.exit /b 0
./dex2jar_merge.sh [DEX目录] [输出JAR路径]

即可直接生成jar文件


免责说明

本公众号提供的信息仅供学习和研究之用,不支持非法活动。使用者自行承担所有风险和责任。本公众号不对因使用相关信息造成的任何损失负责。


本文所有工具获取

工具下载链接,公众号回复0201


如果我分享的内容可以帮到你,欢迎一键三连(点赞+关注+星标)


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:GSCL Sec GSCL GSCL《【APP解密系列】04 APP反编译静态分析》

工具|ApricusFindEvil 网络安全文章

工具|ApricusFindEvil

文章总结: ApricusFindEvil是一款专注于内存马检测的安全工具,由浅安开发。该工具旨在帮助安全研究人员识别和分析驻留在内存中的恶意后门,仅适用于安全
评论:0   参与:  0