0x1:前言
还有半年的时间就要毕业了,目标的职位是移动安全工程师,从今天起开始记录下自己日常的一些工作。今天的这个样本是在吾爱破解论坛(www.52pojie.cn)中看到的一个帖子,该帖子是分析文档。所以在看分析文档前,先自己尝试破解下。
#0x2:任务要求
在2个输入框中输入某些值,然后点击注册,提示注册成功就挑战成功

0x3:分析过程
-
首先打开AndroidKiller找到关键点进行分析:直接找到button的点击事件看看
事实上,我使用红色细线以及绿色方框标注的地方就是本次程序的第一个分析点了.我们可以看到stringFormJNI是一个native的函数,证明它调用了so库文件.非常明显.它对应的so文件就是 **System.loadLibrary **这段代码里面的东西了.

下面这个就是它的一个so文件.我们用IDA来分析它. (我用的IDA7.0)

-
我们用IDA打开它.然后找到stringFromJNI函数,双击进去,然后F5看C伪代码

我们看到的C代码如下.

这里我自己先修改下它的名称,为了方便我们阅读代码(重命名变量按"N"键)

简单阅读上面代码.我们可以了解到.我们的一个username是经过一个n函数进行了一次加密. code经过了c函数的一次加密.然后把2个结果进行比较.如果结果相等,就成功,否则失败!
4. 进入n函数和c函数进行查看.这里我直接把他们翻译成了Python代码



0x4:代码编写
c函数比较简单,看源码就知道了,后面是字符串转数字后异或0x1256.这里用c把它逆写一下.源码如下
`#include <stdio.h>
#include <string.h>
int __cdecl n(char *a1)
{
int v2; // [esp+4h] [ebp-14h]
char v3; // [esp+Fh] [ebp-9h]
int v4; // [esp+10h] [ebp-8h]
int i; // [esp+14h] [ebp-4h]
v4 = 0;
for (i = 0; a1[i]; ++i)
{
v3 = a1[i];
if (v3 < 65)
break;
if (v3 <= 90)
v2 = v3;
else
v2 = v3 - 32;
v4 += v2;
}
return v4 ^ 0x9988;
}
int __cdecl keygen(char *v4)
{
int v6 = n(v4);
int v7 = v6 ^ 0x1256;
char code[256] = {0};
int v2 = v7;
int i;
for (i = 0; v2 > 10; ++i)
{
code[i] = v2 % 10 + 48;
v2 = v2 / 10;
}
code[i] = v2 + 48;
printf("keygen:%s", code);
return 0;
}
int main()
{
char user[256] = {0};
printf("please input name:");
scanf("%s", user);
keygen(user);
return 0;
}
然后我们就把它干掉啦~

0x5:总结
- 此次遇到了调用so库的APP,难度应该是比简单的java层搞了一点点.但是在强大的工具帮助下.我们依然可以很轻易的分析它.俗话说:工欲善其事,必先利其器
- 编程基础要加强.在代码编写这边弄了很久! 基础不牢,地动山摇!(要系统的学习一遍才行)
具帮助下.我们依然可以很轻易的分析它.俗话说:工欲善其事,必先利其器 - 编程基础要加强.在代码编写这边弄了很久! 基础不牢,地动山摇!(要系统的学习一遍才行)
- 早点睡觉.晚安哟~
本文记录了一个移动安全工程师对Crackerme2应用的逆向分析过程,通过分析so库调用,理解了注册流程中的加密逻辑,并用Python代码实现了破解。

被折叠的 条评论
为什么被折叠?



