[原创]逆向360加固等dex被隐藏的APK
如果遇到apk中的lib文件夹中是这样的

基本没有dex文件可以反编译,这中的dex文件一般都是加密混淆压缩后放在so中啦。
但是软件要想运行就需要解出dex字节码然后加载到手机内存中,这样就可以在软件运行过程中把dex提取出来再使用相应的软件反编译成smail啦,接着就是转成java。
好啦,第一次发帖子,以下就是干货。
首先下载附件中的
gdb.7z.001.rar (2.00 MB)
gdb.7z.002.rar (1.21 MB)
把这两个文件的后缀名去掉使用7zip解压出来二进制文件gdb (大约13MB)
打开安卓虚拟机,把需要逆向的加壳软件安装的虚拟机中,然后启动APK。
1、使用ADB把gdb push到手机中
adb push /home/down/gdb /data/local/tmp/gdb
2、找到需要逆向的apk对应linux的进程pid
adb 中执行
adb shell
top
会显示手机中全部的进程,然后找到进程名字为apk包名的pid (在此假设pid为 482)
3、赋予gdb权限(依次执行以下命令)
adb shell
su
cd /data/local/tmp/
chmod 777 gdb
4、dump进程482的内存
./gdb --pid 482
此时进入了gdb模式
这个时候输入 gcore 会dump到当前目录 /data/local/tmp/core.482
把这个core.482的文件放到安装了.net 3.5 的电脑上(win7默认是可以得)
比如放到以下位置
D:\core.482
5、下载附件中的 DumpAllDEX.7z 解压出文件 DumpAllDEX.exe
运行

就会把所有的dex文件提取到D:\core.482.dex 文件夹中。
6、逐个反编译提取出来的dex文件,直到找到你要逆向的软件dex。这个时候就可以开开心心的转成java看源码啦。
最近做了个微信公众号,要是有觉得这个文章有用的朋友,谢谢关注下呀

DumpAllDEX.exe 为C#写的,源码如下:
static void Main(string[] args)
{
REBEGIN:
Console.WriteLine("请输入gcore出来的文件路径:");
string filepath = Console.ReadLine();
if (!File.Exists(filepath))
{
Console.WriteLine("指定的文件不存在,请输入正确的文件路径\r\n");
goto REBEGIN;
}
new DirectoryInfo(filepath + ".dex").Create();
FileStream fs = new FileStream(filepath, FileMode.Open);
long flen = fs.Length;
BinaryReader br = new BinaryReader(fs);
byte[] bs = br.ReadBytes((int)flen);
fs.Close();
int bsl = bs.Length;
for (int i = 0; i < bsl - 100; i++)
{
if (bs[i] == 'd' && bs[i + 1] == 'e' && bs[i + 2] == 'x' && bs[i + 3] == 10 && bs[i + 4] == '0' && bs[i + 5] == '3' && bs[i + 6] == '5')
{
string a1 = bs[i + 35].ToString("x2");
string a2 = bs[i + 34].ToString("x2");
string a3 = bs[i + 33].ToString("x2");
string a4 = bs[i + 32].ToString("x2");
string hexlen = a1 + a2 + a3 + a4;
int dexlength = Int32.Parse(hexlen, System.Globalization.NumberStyles.HexNumber);
byte[] dex_tmp = new byte[dexlength];
int h = 0;
for (int j = i; j < (i + dexlength); j++)
{
dex_tmp[h++] = bs[j];
}
File.WriteAllBytes(filepath + ".dex\\" + i + ".dex", dex_tmp);
}
}
Console.WriteLine("所有的DEX文件已经输出到文件夹" + filepath + ".dex\\");
while (true)
{
Console.Read();
}
}
