Android Easy

一个apk程序,先装上看看。破解密码的,随便输试试。
“1”

拖入改之理看看
“2”

我们目标就是拿到藏在程序中的 flag,这个文件名就是 flagapp,在一看 smali 代码有个 Corret,打开java源码看看
“3”

java代码一看就非常清楚了。
我们想要的 flag 就是 arrayOfByte2 里面的内容,也就是 private String i() 这个函数的返回值。
那么,下面就看 arrayOfByte2 是经过了怎样的变换。
只关心String i()函数, 一行一行的来看看

private String i()
{
int i = 0;
byte[] arrayOfByte1 = new byte[p.length];  //创建byte数组,长度是 p 这个数组的长度。
for (int j = 0; j < arrayOfByte1.length; j++) {
arrayOfByte1[j] = ((byte)(byte)(p[j] ^ q[j])); // 把 p,q2个数组异或 ,再赋值给arrayOfByte1
}
int k = arrayOfByte1[0]; // 取arrayOfByte1的第一个元素,赋给变量 k
for (j = 0; arrayOfByte1[(k + j)] != 0; j++) {} //这个for循环就是为了确定 j 的值
byte[] arrayOfByte2 = new byte[j]; // 由上面确定的 j 的值,来创建一个长度为 j 的数组。
while (i < j)
{
arrayOfByte2[i] = ((byte)arrayOfByte1[(k + i)]); //把 arrayOfByte1 特定部分赋值给 arrayOfByte2
i++;
}
return new String(arrayOfByte2);
}

差不多代码的执行过程清楚了,来写下我们的代码,直接顺着它的这个 String i()函数写就行,它里面的byte数组,我用char型数组代替了。下面附上自己的C++代码。

#include

#include

#include

using namespace std;
template

int getArrayLen(T& array)

{//使用模板定义一 个函数getArrayLen,该函数将返回数组array的长度

return (sizeof(array) / sizeof(array[0]));

}
void main()
{
char p[] = { -40, -62, 107, 66, -126, 103, -56, 77, 122, -107, -24, -127, 72, -63, -98, 64, -24, -5, -49, -26, 79, -70, -26, -81, 120, 25, 111, -100, -23, -9, 122, -35, 66, -50, -116, 3, -72, 102, -45, -85, 0, 126, -34, 62, 83, -34, 48, -111, 61, -9, -51, 114, 20, 81, -126, -18, 27, -115, -76, -116, -48, -118, -10, -102, -106, 113, -104, 98, -109, 74, 48, 47, -100, -88, 121, 22, -63, -32, -20, -41, -27, -20, -118, 100, -76, 70, -49, -39, -27, -106, -13, -108, 115, -87, -1, -22, -53, 21, -100, 124, -95, -40, 62, -69, 29, 56, -53, 85, -48, 25, 37, -78, 11, -110, -24, -120, -82, 6, -94, -101 };
char q[] = { -57, -90, 53, -71, -117, 98, 62, 98, 101, -96, 36, 110, 77, -83, -121, 2, -48, 94, -106, -56, -49, -80, -1, 83, 75, 66, -44, 74, 2, -36, -42, -103, 6, -115, -40, 69, -107, 85, -78, -49, 54, 78, -26, 15, 98, -70, 8, -90, 94, -61, -84, 64, 112, 51, -29, -34, 126, -21, -126, -71, -31, -24, -60, -2, -81, 66, -84, 85, -91, 10, 84, 70, -8, -63, 26, 126, -76, -104, -123, -71, -126, -62, -23, 11, -39, 70, 14, 59, -101, -39, -124, 91, -109, 102, -49, 21, 105, 0, 37, -128, -57, 117, 110, -115, -86, 56, 25, -46, -55, 7, -125, 109, 76, 104, -15, 82, -53, 18, -28, -24 };

 int i = 0;

 char arrayOfByte1[120];
for(int j=0; j < getArrayLen(p) ; j++)
 {
     arrayOfByte1[j] =(char)(p[j]^q[j]);
 }

// cout <<getArrayLen(p)<<endl;
// cout <<arrayOfByte1<<endl;

int k = arrayOfByte1[0];
for (j = 0; arrayOfByte1[(k + j)] != 0; j++) {}

// cout << j <<endl; 确定 j 的值

char arrayOfByte2[1000];   // 写代码的时候不知道 数组有多长,直接写大点就行了。
while (i < j)
{
  arrayOfByte2[i] = arrayOfByte1[(k + i)];
  i++;
}
string result;
result = arrayOfByte2;

cout << result <<endl;

return ;

}

“4”

flag 就是前面那串邮箱了。
“5”