相关文章推荐
追风的花生  ·  小甲鱼python论坛 - CSDN文库·  1 年前    · 
谦逊的板栗  ·  用Python编写一下比较复杂的代码进行工件 ...·  1 年前    · 
读研的木耳  ·  java kafka删除consumers ...·  1 年前    · 
豪情万千的台灯  ·  nuxt 兼容ie-掘金·  2 年前    · 
勤奋的大白菜  ·  electron怎样获取windows设备w ...·  2 年前    · 
Code  ›  【移动应用安全】工具使用_apksigner' 不是内部或外部命令,也不是可运行的程序_doubleU0x00的博客
sign apk apktool smali
https://blog.csdn.net/m0_52682586/article/details/127174622
寂寞的哑铃
2 年前
    • dex2jar
      • 工具介绍
      • 使用方法
        • 将dex文件变成jar文件
      • 报错处理
      • com.googlecode.d2j.DexException: not support version.
    • jd-gui
      • 工具介绍
      • 使用方法
        • windows系统
      • APKTool
        • 工具介绍
        • 使用方法
          • 反编译apk文件
        • jdk自带的签名工具
          • keytool
            • 报错处理
              • ‘keytool‘ 不是内部或外部命令,也不是可运行的程序
            • jarsigner&apksigner
              • 报错处理
                • apksigner
                • 重签名时,用jarsigner签名显示没有清单,jar未签名
                • -Djava.ext.dirs=D:\AndroidStudio\SDK\build-tools\26.0.2\lib is not supported. Use -classpath instead.
                • 由于该 jar 是使用目前已禁用的弱算法签名的, 因此该 jar 将被视为未签名。
              • ideasmali插件
                • 安装
                • 使用方法&AliCrackme_1 wp

                将dex文件变成jar文件

                将dex2jar安装包解压,在目录dex2jar-2.0文件夹下找到d2j-dex2jar.bat,要运行的就是这个程序
                图方便的话就把这个目录加入环境变量,否则每次使用都要把dex文件放在这里很麻烦
                在这里插入图片描述
                关于加入环境变量方法可以
                点击此链接 的文章查看相关教程
                在需要反编译的dex文件目录下打开cmd
                输入命令 d2j-dex2jar.bat classes.dex
                在这里插入图片描述
                看到目录中多了classes-dex2jar.jar文件
                在这里插入图片描述
                要打开它,使用jd-gui工具

                com.googlecode.d2j.DexException: not support version.

                这是因为dex2jar-2.0工具只支持035和036版本协议 1
                解决方法:
                修改dex文件中的版本信息
                比如这里我用NotePad++打开dex文件
                果然这里的版本号是038,所以把038改成035或036即可
                在这里插入图片描述
                再次尝试运行dex2jar,可以运行成功了
                在这里插入图片描述

                jd-gui

                将classes-dex.jar 文件转换为java文件打开
                详见下载地址的官方介绍

                windows系统

                下载zip文件后解压,双击运行exe文件,把需要反编译的文件拖进去即可
                在这里插入图片描述
                在这里插入图片描述
                可以看到这里release版本的反编译结果,变量名和类名被替换成了简单字母
                在这里插入图片描述
                再看看debug版本的
                在这里插入图片描述

                APKTool

                对apk文件静态分析。使用APKTool工具反编译APK生成Smali文件,然后对程序进行分析。将apk文件利用APKTool反编译,生成smali格式的反汇
                编代码,然后阅读Smali文件的代码来理解程序的运行机制,找到程序的突破口进行修改,最后使用APKTool重新编译生成apk文件并签名,最后运行测试,如此循环,直至程序被成功破译。
                2

                解压APKTool并将其添加到系统变量中( 添加方法 )
                在任意目录下cmd命令行中输入apktool测试是否添加成功
                在这里插入图片描述

                反编译apk命令
                Apktool d[ecode] [OPTS] <file.apk> [< dir>]
                编译apk命令
                Apktool b[uild] [OPTS] <app_path> [<out_file>]

                反编译apk文件

                现在用apktool反编译crackme0701.apk
                在这里插入图片描述
                在要反编译的文件目录下打开cmd
                输入命令 Apktool d crackme0701.apk
                3
                在这里插入图片描述
                看到在默认目录 4 下生成了反编译结果的目录
                在这里插入图片描述
                前面说过的smali文件就在对应的文件夹中,去分析smali格式的反汇编代码
                在这里插入图片描述
                smali格式文件在目录.\smali\com\droider\crackme0201
                在这里插入图片描述

                jdk自带的签名工具

                keytool

                密钥库口令输了android,其他部分用于生成密钥对和自签名证书,大概是填什么都可以。
                在这里插入图片描述

                ‘keytool‘ 不是内部或外部命令,也不是可运行的程序

                在这里插入图片描述
                找到jdk安装位置下keytool的位置,在jdk的bin目录下
                比如我的是D:\Java\jdk-18\bin
                在这里插入图片描述
                然后把它加入环境变量()
                重新打开cmd窗口输入命令就可以正常运行了
                在这里插入图片描述

                jarsigner&apksigner

                还是在刚才的目录下D:\Java\jdk-18\bin
                把jarsigner加入环境变量(刚才加过了就不用加了)
                把生成的.keystore文件放在dist目录下
                在这里插入图片描述
                输入命令 apksigner sign --ks crackme0701.keystore --ks-key-alias crack crackme0701.apk
                在这里插入图片描述
                这个报错解决了,在报错处理部分有详细说明
                包括报错 -Djava.ext.dirs=D:\AndroidStudio\SDK\build-tools\26.0.2\lib is not supported. Use -classpath instead. 也有相应的解决方法
                报错解决完后输入命令,正常执行(password就输之前生成keystore文件时输的android)
                在这里插入图片描述
                这里其实还报了个错
                在这里插入图片描述
                发现是把文件名写错了,就没单独列出

                然后输入命令签名 jarsigner -verify crackme0701.apk
                在这里插入图片描述

                apksigner

                ‘apksigner’ 不是内部或外部命令,也不是可运行的程序
                或批处理文件。
                在这里插入图片描述

                把apksigner.bat添加到环境变量,apksigner在SDK目录下
                在我这的目录是
                D:\AndroidStudio\SDK\build-tools\26.0.2
                在这里插入图片描述
                重新打开cmd窗口再次输入命令,可以执行
                在这里插入图片描述

                重签名时,用jarsigner签名显示没有清单,jar未签名

                看到这个报错,那现在咱们就去define the JAVA_HOME environment variable in Control Panel / System / Avanced System Settings to point to the JDK folder
                这里是要添加JAVA_HOME到系统变量(看了一下我的系统目录确实是没有JAVA_HOME)
                找到jdk的安装目录,我这里是D:\Java\jdk-18
                在系统变量里新建一个JAVA_HOME,把jdk的安装目录添加进去
                在这里插入图片描述
                依次点确定返回,JAVA_HOME加入系统变量
                在这里插入图片描述
                再去设置Path环境变量,把%JAVA_HOME%\bin加入环境变量,并移到最上面
                在这里插入图片描述
                然后发现还是不行
                又参考了
                这篇文章 发现是find_java.bat的原因,所以又从文章里提供的地址下载了find_java替换原来的文件
                我的find_java.bat在目录D:\AndroidStudio\SDK\tools\lib,即安装了sdk的目录下tools\lib
                在这里插入图片描述
                再在任意目录下输入命令apksigner,没有那个报错了 5

                -Djava.ext.dirs=D:\AndroidStudio\SDK\build-tools\26.0.2\lib is not supported. Use -classpath instead.

                在这里插入图片描述
                意思是批处理文件apksigner.bat里面的-Djava.ext.dirs不支持了,换成-classpath
                在sdk下面搜apksigner又好几个,就按报错修改了26.0.2的apksigner
                我的apksigner在D:\AndroidStudio\SDK\build-tools\26.0.2
                这里参考了
                这篇 大佬文章,我也先是按提示(REM注释掉上面那行)改成classpath,发现我的jdk也不认识-classpath。按照文章说的改成–class-path,像下面这样
                在这里插入图片描述
                再输入apksigner命令,可以显示apksigner相关信息
                在这里插入图片描述

                由于该 jar 是使用目前已禁用的弱算法签名的, 因此该 jar 将被视为未签名。

                既然说是算法的问题,不妨看看keytool的使用规则
                这里找到
                一篇详细解释
                (目前并没有解决,但是不影响这个实验程序)
                在这里插入图片描述

                ideasmali插件

                AndroidStudio的一个插件,用于动态调试

                参考了 这篇
                下载ideasmali.zip
                打开AndroidStudio,在顶部选择File->Settings->Plugins,齿轮图标那里选install plugins from Disk,安装下载的ideasmali插件
                在这里插入图片描述
                点击ok添加完成,再重启IDE
                在这里插入图片描述
                重启后再打开File->Settings->Editor->File Types

                在这里插入图片描述
                在图示位置加上 *.smali
                在这里插入图片描述
                在这里插入图片描述
                这一步是因为新版本的Android Studio默认解析smali文件的插件是Smali Support,这个插件不支持断点,所以我们需要自己手动下载支持断点的smali解析插件ideasmali

                使用方法&AliCrackme_1 wp

                这里以AliCrackme_1.apk为例
                在这里插入图片描述
                先用apktool反编译.apk文件
                在这里插入图片描述
                用IDE打开生成的文件夹File->new->import project,选择默认生成的同名项目
                在这里插入图片描述
                设置远程监听
                参考了这篇
                Run->Edit Configurations,点+号,选remote
                在这里插入图片描述
                设置端口为8700
                在这里插入图片描述
                在onCreate函数处下断点
                在这里插入图片描述
                配置JDK
                File->Project Structure
                在这里插入图片描述
                打开ddms
                在启动ddms之前要先启动模拟器
                新版Android Studio已经去掉了ddms的界面。

                在DOS命令下打开DDMS方法:
                cd C:\Users\lenovo\AppData\Local\Android\sdk //sdk的安装目录,我的目录在D盘下
                cd tools
                ddms.bat

                下载该程序到虚拟机并运行
                在这里插入图片描述

                打好断点后开始调试,点击

                配置远程调试,修改端口为8601
                在这里插入图片描述
                adb调试状态启动程序
                命令 adb shell am start -D –n packagename/android:name
                其中packagenameh和android:name在AndroidManifest.xml文件中
                在这里插入图片描述
                所以命令是adb shell am start -D -n com.example.simpleencryption/.MainActivity
                在这里插入图片描述
                在这里插入图片描述

                再去androidstudio里点调试
                在这里插入图片描述

                在这里插入图片描述
                点完调试会变成这样
                在这里插入图片描述
                不用管,按f8继续调试
                虚拟机显示界面后,在里面任意输入字符,点登录
                在这里插入图片描述

                到MyActivite$1断点onClick处停下
                添加要追踪的变量(右键,add to watches
                在这里插入图片描述
                (然后我手滑给关了现在端口变8628了
                问题不大,再搞一遍就行
                在这里插入图片描述
                这里enpassword看起来是输入ddddffff的变量password加密后的值
                输入1234看看能不能与字母表对应(发现并没有对应,不过对上了一点,可能是数字
                在这里插入图片描述
                那就看一下字母表有多少字,发现是256个
                在这里插入图片描述
                好像256没什么用啊,不过ASCII码表也是256个来着,1的ASCII值是50,这里不妨去第50个那看一下对应字母表的什么
                在这里插入图片描述
                果然是对应上了,这里的加密算法就是将输入的字符转为ASCII码再用字母表对应加密,要解密只需要写出解密程序输入变量pw对应的值即可得到正确密码
                不过这样还有些瞎蒙乱猜的成分,可以去源码中找找加密程序

                现在对这个程序动态调试找加密程序
                在这里插入图片描述

                到这里还没有被加密,再按F8往下走走
                在这里插入图片描述
                到这里被加密了,出现了变量enPassword
                那加密函数就是在这一段里被调用了
                再按F9回去,前面的过程先步过,到出现enPassword=""时按F7步进
                可以看到此时已经进行了部分加密,栈的状态是

                bytesToAliSmsCode:145, MainActivity (com.example.simpleencryption)
                access$0:143, MainActivity (com.example.simpleencryption)
                onClick:48, MainActivity$1 (com.example.simpleencryption)
                performClick:7448, View (android.view)
                performClickInternal:7425, View (android.view)
                access 3600 : 810 , Vi e w ( an d ro i d . v i e w ) r u n : 28305 , Vi e w PerformClick (android.view)
                handleCallback:938, Handler (android.os)
                dispatchMessage:99, Handler (android.os)
                loop:223, Looper (android.os)
                main:7656, ActivityThread (android.app)
                invoke:-1, Method (java.lang.reflect)
                run:592, RuntimeInit$MethodAndArgsCaller (com.android.internal.os)
                main:947, ZygoteInit (com.android.internal.os)

                发现加密函数是bytesToAliSmsCode:145, MainActivity(com.example.simpleencryption)
                (就是当前栈顶的函数,正在执行的函数)
                在这里插入图片描述
                现在去找到这个函数
                在这里插入图片描述
                现在分析一下这个函数 6

                .method private static bytesToAliSmsCode(Ljava/lang/String;[B)Ljava/lang/String;
                    .locals 3
                    .param p0, "table"    # Ljava/lang/String;
                    .param p1, "data"    # [B
                    .prologue
                    .line 144
                    new-instance v1, Ljava/lang/StringBuilder;
                    invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
                    .line 145
                    .local v1, "sb":Ljava/lang/StringBuilder;
                    const/4 v0, 0x0
                    .local v0, "i":I
                    :goto_0
                    array-length v2, p1
                    if-lt v0, v2, :cond_0
                    .line 148
                    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
                    move-result-object v2
                    return-object v2
                    .line 146
                    :cond_0
                    aget-byte v2, p1, v0
                    and-int/lit16 v2, v2, 0xff #关键指令,将输入的char转换为int
                    invoke-virtual {p0, v2}, Ljava/lang/String;->charAt(I)C #在字母表里查找
                    move-result v2
                    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(C)Ljava/lang/StringBuilder;
                    .line 145
                    add-int/lit8 v0, v0, 0x1
                    goto :goto_0
                .end method
                

                现在写一个解密函数对应解密就可以了
                这里就用python了,简单一点
                在这里插入图片描述
                解密得581026

                1. 参考自https://www.jianshu.com/p/1c54c1ccf5cc ↩︎

                2. 这段话后面的部分来源吉林大学移动应用安全课件7.2节 ↩︎

                3. 不指定目录,反编译的结果输出到默认目录下 ↩︎

                4. apktool反编译结果的默认存放目录 ↩︎

                5. 因为这个文章在写的时候忘记保存,又重写了一遍,这里就不放图片了。因为还有别的问题,要完全复现还有点麻烦 ↩︎

                6. 参考自http://www.manongjc.com/detail/28-aabttzwsnqatppg.html ↩︎

                原来应用认领的时候用过,现在加固完还要用,特此记录: jarsigner -verbose -keystore (签名地址) -signedjar (签名后的apk地址) (待签名apk地址) (别名) jarsigner -verbose -keystore D:\project_x_20210610\demojks.jks -signedjar C:\Users\Administrator\Desktop\demo_sign.apk C:\Users\Administrator\Deskt
                第一个问题是:apktool不是内部或外部命令,也不是可运行的程序或批处理文件。解决办法:1.在cmd窗口运行这个命令 java -jar  apktool.jar d test.apk或者2.在apktool相同目录下创建个apktool.bat文件,文件内容为:@echo off set PATH=%CD%;%PATH%; java -jar "%~dp0\apktool.jar" %1 %...
                如果需要最终发行你的android程序,必需为apk文件签名。这里apk和jar的签名方式都是一样的,使用sun jdk的jarsigner工具来完成,但是执行时会提示jarsigner: 无法对 jar 进行签名: java.util.zip.ZipException: invalid entry compressed size (expected xxx but got xxx bytes
                问题一:jarsigner: 无法打开 jar 文件: ChangeBackgroundWidget.apk 我的解决方法是:将要进行签名的APK放到对应的文件下,如我把要签名的ChangeBackgroundWidget.apk放到JDK的bin文件里。 问题二:jarsigner: 找不到 a export AAPT_HOME=/Users/xxxx/Library/Android/sdk/build-tools/25.0.2 export PATH=$PATH:$AAPT_HOME (3)...
                Linux开发环境是指在Linux操作系统下进行软件开发所需要的一系列工具和软件。常见的Linux开发环境包括编译器、调试器、集成开发环境、版本控制工具等。Linux开发环境的优点是稳定、安全、开源、免费等。 Linux开发环境的应用非常广泛,包括Web开发、移动应用开发、游戏开发、嵌入式系统开发等。在Web开发中,Linux开发环境可以提供Apache、MySQL、PHP等开发工具,支持PHP、Python、Ruby等多种编程语言。在移动应用开发中,Linux开发环境可以提供Android Studio等开发工具,支持Java、Kotlin等编程语言。在游戏开发中,Linux开发环境可以提供Unity、Unreal Engine等开发工具,支持C++、C#等编程语言。在嵌入式系统开发中,Linux开发环境可以提供交叉编译工具链、调试工具等,支持ARM、MIPS等多种处理器架构。 总之,Linux开发环境是现代软件开发不可或缺的一部分,它为开发者提供了强大的工具和平台,帮助开发者更高效地完成软件开发工作。
 
推荐文章
追风的花生  ·  小甲鱼python论坛 - CSDN文库
1 年前
谦逊的板栗  ·  用Python编写一下比较复杂的代码进行工件缺陷检测,能够精确检测出是否有缺陷,不需要训练模型 - CSDN文库
1 年前
读研的木耳  ·  java kafka删除consumers kafka删除已消费的消息_mob64ca140fd7c1的技术博客_51CTO博客
1 年前
豪情万千的台灯  ·  nuxt 兼容ie-掘金
2 年前
勤奋的大白菜  ·  electron怎样获取windows设备wifi的bssid - SegmentFault 思否
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号