分析样例下载:链接: https://pan.baidu.com/s/1Mb6U4D24SlG_K6n1dxszOQ 密码: ikpe

第一题algorithmbase_40.apk

直接ida打开libnative-lib.so。找到Java_com_kanxue_algorithmbase_MainActivity_encodeFromJni_140。然后根据返回值看来源。最后v15是返回的。然后v8=&v15。然后v8的值是v17逐个字节赋值的。所以关键在于v17。关键函数直接定位出来在sub_AB90.另外看v16的值。和MD5的算法有点像。可能也是一个hash算法。

image-20210112223827223

接着看到里面只有一个函数sub_9AFC。直接进去看看。

image-20210112224210157

进去后也只有一个函数sub_9BA4。继续进去看看是不是算法的部分

image-20210112224302944

果然看到熟悉的算法部分。搜索一下常量看看有啥收获不

image-20210112224400383

看到直接就是sha1的关键常量。我们验证下看看

image-20210112224455289

先frida抓一下计算的结果

1
input: cKGiDKZnhktnzCxsXzGP output: ec048f770484aee853187e413d1dd4f478ce842e

然后验证一下kanxue_imyang_40_cKGiDKZnhktnzCxsXzGP的sha1值是否和结果一致。第一题搞定

image-20210112224911512

==========================================================================================

第二题algorithmbase_41.apk

先ida简单看下关键函数处

image-20210113204338119

然后frida打印一下结果

1
input: fgfPLREXkGWWzfVPvtSjGxkkBsFP output: d58aa1c17830271e523dcc59808ec75e1f6660ad

然后再用sha1标准的计算一下kanxue_imyang_41_fgfPLREXkGWWzfVPvtSjGxkkBsFP的结果是b5d3a0ebffb5eb1048e19455bcea310068833c0e

说明可能是sha1算法是经过修改的或者是input值还有其他的拼接。先排查下sha1标准算法的常量是否被修改了。

然后用ida在sub_9BA4函数中挨个搜索一遍。然后发现0x8f1bbcdc和0xca62c1d6搜索不到。估计是被修改了。在ida中找0x6ed9eba1的下一个常量是0x70E44324。再下一个常量是0x359D3E2A。发现这个变动后。我们找个sha1的算法来修改常量测试一下结果。我随便找个项目测试下https://github.com/vog/sha1.git

1
2
3
4
5
6
7
8
9
int main(int /* argc */, const char ** /* argv */)
{
const string input = "kanxue_imyang_41_fgfPLREXkGWWzfVPvtSjGxkkBsFP";
SHA1 checksum;
checksum.update(input);
const string hash = checksum.final();
cout << "input:" << input << " output:" << hash << endl;
return 0;
}

输出和标准的一样。确定人家这个sha1算法没问题。

1
input:kanxue_imyang_41_fgfPLREXkGWWzfVPvtSjGxkkBsFP output:b5d3a0ebffb5eb1048e19455bcea310068833c0e

继续找几个常量是否发生了变动

1
2
3
4
5
digest[0] = 0x67452301;
digest[1] = 0xefcdab89;
digest[2] = 0x98badcfe;
digest[3] = 0x10325476;
digest[4] = 0xc3d2e1f0;

然后ida搜索一下

image-20210113211935026

果然发生了变动。按照对应的值修改一下

1
2
3
4
5
6
7
8
9
10
11
12
13
inline static void reset(uint32_t digest[], std::string &buffer, uint64_t &transforms)
{
/* SHA1 initialization constants */
digest[0] = 0x45670123;
digest[1] = 0xCDEF89AB;
digest[2] = 0xBA98FEDC;
digest[3] = 0x32107654;
digest[4] = 0xD2C3F0E1;

/* Reset counters */
buffer = "";
transforms = 0;
}

输出结果

1
input:kanxue_imyang_41_fgfPLREXkGWWzfVPvtSjGxkkBsFP output:d58aa1c17830271e523dcc59808ec75e1f6660ad

=============================================================================

第三题algorithmbase_42.apk

直接ida先检查下常量是否正确。然后init里面的常量是没有修改的。我们再看看算法内部用来计算的常量是否一致

image-20210113220511030

对比后发现不单单值发生了变化。并且也从+变成了-。

用frida来取一个计算结果先

1
input: FbeBTeatDdikDjhyV output: c603885c6817b5e15919d9b50d6d951eb1fd11fc

然后参考ida的4个常量的值修改一下sha1的代码。留意第一个和第二个的运算要改成减号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
inline static void R0(const uint32_t block[BLOCK_INTS], const uint32_t v, uint32_t &w, const uint32_t x, const uint32_t y, uint32_t &z, const size_t i)
{
z += ((w&(x^y))^y) + block[i] - 0x7DA56687 + rol(v, 5);
w = rol(w, 30);
}
inline static void R1(uint32_t block[BLOCK_INTS], const uint32_t v, uint32_t &w, const uint32_t x, const uint32_t y, uint32_t &z, const size_t i)
{
block[i] = blk(block, i);
z += ((w&(x^y))^y) + block[i] - 0x7DA56687 + rol(v, 5);
w = rol(w, 30);
}
inline static void R2(uint32_t block[BLOCK_INTS], const uint32_t v, uint32_t &w, const uint32_t x, const uint32_t y, uint32_t &z, const size_t i)
{
block[i] = blk(block, i);
z += (w^x^y) + block[i] - 0x26915E15 + rol(v, 5);
w = rol(w, 30);
}
inline static void R3(uint32_t block[BLOCK_INTS], const uint32_t v, uint32_t &w, const uint32_t x, const uint32_t y, uint32_t &z, const size_t i)
{
block[i] = blk(block, i);
z += (((w|x)&y)|(w&x)) + block[i] + 0x1B8FDCBC + rol(v, 5);
w = rol(w, 30);
}
inline static void R4(uint32_t block[BLOCK_INTS], const uint32_t v, uint32_t &w, const uint32_t x, const uint32_t y, uint32_t &z, const size_t i)
{
block[i] = blk(block, i);
z += (w^x^y) + block[i] + 0x62CAD6C1 + rol(v, 5);
w = rol(w, 30);
}

最后计算结果一致。第三题搞定

1
input:kanxue_imyang_42_FbeBTeatDdikDjhyV output:c603885c6817b5e15919d9b50d6d951eb1fd11fc

=============================================================================

第四题algorithmbase_43.apk

直接ida打开。结果发现字符串被加密了。没法直接看到前面固定加的字符串了。不要紧。先拿去用unidbg或者AndroidNativeEmu来生成一个解密的so

image-20210113221844233

下面贴上解密后的结果

image-20210113221902907

然后frida打印下输出

1
input: gkoOrszvENhJEgIFcmnccPtUkAPG output: 4b3ed910435a1b7231cd01ff7b8ddab64926ee75

先验证下sha1标准的对不对。结果是正确的。没有任何修改。第4题搞定

image-20210113222120944