如果遇到apk中的lib文件夹中是这样的
基本没有dex文件可以反编译,这中的dex文件一般都是加密混淆压缩后放在so中啦。
但是软件要想运行就需要解出dex字节码然后加载到手机内存中,这样就可以在软件运行过程中把dex提取出来再使用相应的软件反编译成smail啦,接着就是转成java。
好啦,第一次发帖子,以下就是干货。
首先下载附件中的
gdb.7z.001.rar(2.00MB)
gdb.7z.002.rar(1.21MB)
把这两个文件的后缀名去掉使用7zip解压出来二进制文件gdb(大约13MB)
打开安卓虚拟机,把需要逆向的加壳软件安装的虚拟机中,然后启动APK。
1、使用ADB把gdbpush到手机中
adbpush/home/down/gdb/data/local/tmp/gdb
2、找到需要逆向的apk对应linux的进程pid
adb中执行
adbshell
top
会显示手机中全部的进程,然后找到进程名字为apk包名的pid(在此假设pid为482)
3、赋予gdb权限(依次执行以下命令)
adbshell
su
cd/data/local/tmp/
chmod777gdb
4、dump进程482的内存
./gdb--pid482
此时进入了gdb模式
这个时候输入gcore会dump到当前目录/data/local/tmp/core.482
把这个core.482的文件放到安装了.net3.5的电脑上(win7默认是可以得)
比如放到以下位置
D:\core.482
5、下载附件中的DumpAllDEX.7z解压出文件DumpAllDEX.exe
运行
就会把所有的dex文件提取到D:\core.482.dex文件夹中。
6、逐个反编译提取出来的dex文件,直到找到你要逆向的软件dex。这个时候就可以开开心心的转成java看源码啦。
最近做了个微信公众号,要是有觉得这个文章有用的朋友,谢谢关注下呀
DumpAllDEX.exe为C#写的,源码如下:
staticvoidMain(string[]args)
{
REBEGIN:
Console.WriteLine("请输入gcore出来的文件路径:");
stringfilepath=Console.ReadLine();
if(!File.Exists(filepath))
{
Console.WriteLine("指定的文件不存在,请输入正确的文件路径\r\n");
gotoREBEGIN;
}
newDirectoryInfo(filepath+".dex").Create();
FileStreamfs=newFileStream(filepath,FileMode.Open);
longflen=fs.Length;
BinaryReaderbr=newBinaryReader(fs);
byte[]bs=br.ReadBytes((int)flen);
fs.Close();
intbsl=bs.Length;
for(inti=0;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')
{
stringa1=bs[i+35].ToString("x2");
stringa2=bs[i+34].ToString("x2");
stringa3=bs[i+33].ToString("x2");
stringa4=bs[i+32].ToString("x2");
stringhexlen=a1+a2+a3+a4;
intdexlength=Int32.Parse(hexlen,System.Globalization.NumberStyles.HexNumber);
byte[]dex_tmp=newbyte[dexlength];
inth=0;
for(intj=i;j
{
dex_tmp[h++]=bs[j];
}
File.WriteAllBytes(filepath+".dex\\"+i+".dex",dex_tmp);
}
}
Console.WriteLine("所有的DEX文件已经输出到文件夹"+filepath+".dex\\");
while(true)
{
Console.Read();
}
}
上传的附件:
1.png
(6.23kb,145次下载)
gdb.7z.001.rar
(2.00MB,1776次下载)
gdb.7z.002.rar
(1.21MB,2149次下载)
DumpAllDEX.7z
(2.36kb,1446次下载)
2.png
(3.69kb,112次下载)