附件为一个apk,先拖到模拟器看看:
无法安装,先不管这个错误了,反编译看看。
修改apk扩展名为zip->解压->使用dex2jar对解压后的classes.dex文件进行反编译:
将反编译得到的jar文件拖进jd-gui,看MainActivity,MainActivity代码很简单:
核心就是这个if判断:
if ((new Base64New()).Base64Encode(str.getBytes()).equals("5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs="))
比较输入字符串的Base64是否等于"5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs="。
直接在Base64解密网站解密,发现解密失败,再看Base64类的名字“Base64New”,可能这里是修改过的Base64算法。
看看这个Base64New类的Base64Encode函数:
明显一看就发现,这个Base64替换表不对,我们在百度搜一个Base64解密程序,把里面的替换表换成这里修改后的替换表:
#include <stdio.h> //注意哦,VC中""是当前路径,<>是系统路径
#include <windows.h>
const char BASE_CODE[]= {
'v', 'w', 'x', 'r', 's', 't', 'u', 'o', 'p', 'q',
'3', '4', '5', '6', '7', 'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'J', 'y', 'z', '0', '1', '2',
'P', 'Q', 'R', 'S', 'T', 'K', 'L', 'M', 'N', 'O',
'Z', 'a', 'b', 'c', 'd', 'U', 'V', 'W', 'X', 'Y',
'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'8', '9', '+', '/' };
//子函数 - 取密文的索引
inline char GetCharIndex(char c) //内联函数可以省去函数调用过程,提速
{
for (int i = 0; i < strlen(BASE_CODE); i++)
{
if (BASE_CODE[i] == c)
{
return i;
}
}
return 0;
}
//解码,参数:结果,密文,密文长度
int fnBase64Decode(char *lpString, char *lpSrc, int sLen) //解码函数
{
static char lpCode[4];
register int vLen = 0;
if (sLen % 4) //Base64编码长度必定是4的倍数,包括'='
{
lpString[0] = '\0';
return -1;
}
while (sLen > 2) //不足三个字符,忽略
{
lpCode[0] = GetCharIndex(lpSrc[0]);
lpCode[1] = GetCharIndex(lpSrc[1]);
lpCode[2] = GetCharIndex(lpSrc[2]);
lpCode[3] = GetCharIndex(lpSrc[3]);
*lpString++ = (lpCode[0] << 2) | (lpCode[1] >> 4);
*lpString++ = (lpCode[1] << 4) | (lpCode[2] >> 2);
*lpString++ = (lpCode[2] << 6) | (lpCode[3]);
lpSrc += 4;
sLen -= 4;
vLen += 3;
}
return vLen;
}
int main()
{
char es[] = "5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs=";
char ds[1000] = { 0x00 };
fnBase64Decode(ds, es, strlen(es));
}
就可以得到答案了"05397c42f9b6da593a3644162d36eb01"。
欢迎关注我的微博:大雄_RE。专注软件逆向,分享最新的好文章、好工具,追踪行业大佬的研究成果。