安卓某加固脱壳
首先反编译apk
看看AndroidManifest.xml情况!
重点看包名
package="com.faloo.BookReader4Android"
还有application下的android:name
android:name="com.tencent.StubShell.TxAppEntry"
看看对应的smali!
smali不熟悉的话,可以反编译dex再转jar 直接用java gui看java代码.
private void a(String paramString)
{
// Byte code:
// 0: aload_0
// 1: invokevirtual 59 com/tencent/StubShell/TxAppEntry:getApplicationInfo ()Landroid/content/pm/ApplicationInfo;
// 4: astore_2
// 5: aload_2
// 6: getfield 64 android/content/pm/ApplicationInfo:dataDir Ljava/lang/String;
// 9: astore_3
// 10: new 66 java/lang/StringBuilder
// 13: dup
// 14: invokespecial 67 java/lang/StringBuilder:<init> ()V
// 17: aload_3
.....
}
有很多 // 开头的 这个是smali 加了 -d 调试选项时 才会出现的. 换jeb看看.
查看smali代码主要是为了找他调用的哪个so来解密dex , 这里代码有点多,没必要花时间去细品代码. 一般so文件都是放在 assets 或者 lib目录下. 先看看 assets 目录
没看到有so文件 可以再看看 lib 目录下
有很多 so 文件! 不出意外的话解密的 so 应该就在其中.
这么多so文件一个个分析也不现实, 为了省事 可以直接上ida查看他加载了哪个so也是一样的.
首先启动ida server 为了防止被检测到 最好将 android_server 改一个名字.
默认的端口也修改一下 命令如下 (有的情况 adb shell su 连着打不能生效,需要进入 adb shell 再 su提权后再执行)
adb shell su ./data/local/tmp/ida7032 -p5555
执行成功提示:
IDA Android 32-bit remote debug server(ST) v1.22. Hex-Rays (c) 2004-2017
Listening on 0.0.0.0:5555...
手机端的服务运行起来 并开了一个 5555 端口, 接着需要将手机端口映射到PC上来
adb forward tcp:6666 tcp:5555
其中5555 是手机里 android_server的端口(需和执行命令时的端口一样)
6666是映射到PC上的端口(理论上是可以1-65535任意端口,前提是没被占用)
注意: 端口转发命令只需运行一次即可. 即使android_server关闭 重开了.也不需要重复运行.可以打如下命令查看是否映射过.
PS > adb forward --list
84B5T15B03002203 tcp:6666 tcp:5555
如果映射过就无需再重复映射.
接着以调试模式启动apk 命令格式是 am start -D -n 包名/入口 具体包名可以通过 AndroidManifest.xml 文件查看. 或者通过如下命令查看.
PS > adb shell dumpsys activity top
TASK com.faloo.BookReader4Android id=120
ACTIVITY com.faloo.BookReader4Android/com.faloo.app.activity.LogoPageActivity 8fc46c9 pid=9911
Failure while dumping the activity: java.io.IOException: Timeout
其中 com.faloo.BookReader4Android/com.faloo.app.activity.LogoPageActivity 是包名+入口
命令连起来则是如下:
PS E:\Android\虚拟机临时使用\临时> adb shell
angler:/ $ su
angler:/ # am start -D -n com.faloo.BookReader4Android/com.faloo.app.activity.BookActivity
Starting: Intent { cmp=com.faloo.BookReader4Android/com.faloo.app.activity.BookActivity }
angler:/ #
执行此命令后 手机上会提示 Walting For Debugger 字样. 因为我们是以调试方式启动 所以 apk 在运行后 PC会在第一条指令处等待 恢复运行.
上IDA
端口输入我们映射后的端口 6666
因为我们要看他加载哪个so来解密so和dex文件. 所以要勾选加载LIB时中断.
如果是多个so解密dex. 这样我们还能观察几个解密so的加载顺序.
点OK后 选择相应的包名.
挂载上去后, 不出意外的话,就能看到如下的画面
直接F9运行.
运行后 手机里面还是 等待状态 这时 需要使用 JDB唤醒进程.
JDB命令如下
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8888
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at com.sun.tools.jdi.SocketTransportService.attach(SocketTransportService.java:222)
at com.sun.tools.jdi.GenericAttachingConnector.attach(GenericAttachingConnector.java:116)
at com.sun.tools.jdi.SocketAttachingConnector.attach(SocketAttachingConnector.java:90)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)