将dex2jar安装包解压,在目录dex2jar-2.0文件夹下找到d2j-dex2jar.bat,要运行的就是这个程序
图方便的话就把这个目录加入环境变量,否则每次使用都要把dex文件放在这里很麻烦
关于加入环境变量方法可以
点击此链接
的文章查看相关教程
在需要反编译的dex文件目录下打开cmd
输入命令
d2j-dex2jar.bat classes.dex
看到目录中多了classes-dex2jar.jar文件
要打开它,使用jd-gui工具
这是因为dex2jar-2.0工具只支持035和036版本协议
1
解决方法:
修改dex文件中的版本信息
比如这里我用NotePad++打开dex文件
果然这里的版本号是038,所以把038改成035或036即可
再次尝试运行dex2jar,可以运行成功了
将classes-dex.jar 文件转换为java文件打开
详见下载地址的官方介绍
下载zip文件后解压,双击运行exe文件,把需要反编译的文件拖进去即可
可以看到这里release版本的反编译结果,变量名和类名被替换成了简单字母
再看看debug版本的
对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>]
现在用apktool反编译crackme0701.apk
在要反编译的文件目录下打开cmd
输入命令
Apktool d crackme0701.apk
3
看到在默认目录
下生成了反编译结果的目录
前面说过的smali文件就在对应的文件夹中,去分析smali格式的反汇编代码
smali格式文件在目录.\smali\com\droider\crackme0201
密钥库口令输了android,其他部分用于生成密钥对和自签名证书,大概是填什么都可以。
找到jdk安装位置下keytool的位置,在jdk的bin目录下
比如我的是D:\Java\jdk-18\bin
然后把它加入环境变量()
重新打开cmd窗口输入命令就可以正常运行了
还是在刚才的目录下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.bat添加到环境变量,apksigner在SDK目录下
在我这的目录是
D:\AndroidStudio\SDK\build-tools\26.0.2
重新打开cmd窗口再次输入命令,可以执行
看到这个报错,那现在咱们就去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,没有那个报错了
意思是批处理文件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相关信息
既然说是算法的问题,不妨看看keytool的使用规则
这里找到
一篇详细解释
(目前并没有解决,但是不影响这个实验程序)
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.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)
(就是当前栈顶的函数,正在执行的函数)
现在去找到这个函数
现在分析一下这个函数
.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
原来应用认领的时候用过,现在加固完还要用,特此记录:
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开发环境是现代软件开发不可或缺的一部分,它为开发者提供了强大的工具和平台,帮助开发者更高效地完成软件开发工作。