显示:‘Your Input is too short or too long!’。
利用dex2jar,得到jar文件,打开后,先看:onCreate()函数:
protected void onCreate(Bundle paramBundle)
{
super.onCreate(paramBundle);
setContentView(2130903040);
setTitle(2131034118);
new AlertDialog.Builder(this).setTitle("Hello").setMessage("Do you like playing in the dirt").setIcon(2130837505).setCancelable(false).setNegativeButton("爱过", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface paramDialogInterface, int paramInt)
{
if (nibadexingfu.a(MainActivity.this.getApplicationContext()).booleanValue())
MainActivity.fuckwanniba(MainActivity.this.getApplicationContext());
if (nibadexingfu.b(MainActivity.this.getApplicationContext()).booleanValue())
MainActivity.fuckwanniba(MainActivity.this.getApplicationContext());
}
}).setPositiveButton("wanniba", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface paramDialogInterface, int paramInt)
{
if (nibadexingfu.a(MainActivity.this.getApplicationContext()).booleanValue())
{
MainActivity.wanniba();
MainActivity.fuckwanniba(MainActivity.this.getApplicationContext());
}
if (nibadexingfu.b(MainActivity.this.getApplicationContext()).booleanValue())
{
MainActivity.wanniba();
MainActivity.fuckwanniba(MainActivity.this.getApplicationContext());
}
}
}).show();
从上面可以看出点击‘爱过’后,会调用nibadexingfu类中的a和b这两个函数,若返回值为TRUE,则调用MainActivity中的本地方法fuckwanniba()。而点击‘wanniba’后也会调用nibadexingfu类中的a和b两个函数,若返回值为True,则调用MainActivity中的本地方法wanniba()和fuckwanniba()。很容易想到,保护机制就存在于这些地方。
首先来看nibadexingfu类中的a和b这两个函数:
public class nibadexingfu
{
private static String[] known_device_ids;
private static String[] known_imsi_ids;
继续分析四个jnicall函数:
看看调用处的反编译代码:
((Button)findViewById(2131230726)).setOnClickListener(new View.OnClickListener()
{
public void onClick(View paramView)
{
String str1 = ((EditText)MainActivity.this.findViewById(2131230724)).getText().toString();
if (str1.length() == 16)
{
String str2 = str1.toUpperCase();
String str3 = MainActivity.jnicall1(str2);
String str4 = MainActivity.jnicall2(str2);
String str5 = MainActivity.jnicall3(str2);
String str6 = MainActivity.jnicall4(str2);
String str7 = str3.concat(str4).concat(str5).concat(str6);
Toast.makeText(MainActivity.this, str7, 1).show();
}
while (true)
{
return;
Toast.makeText(MainActivity.this, "Your Input is too short or too long!", 1).show();
}
}
});
((Button)findViewById(2131230727)).setOnClickListener(new View.OnClickListener()
{
public void onClick(View paramView)
{
System.exit(0);
}
});
if (paramBundle == null)
getFragmentManager().beginTransaction().add(2131230720, new PlaceholderFragment()).commit();
}
可以看出大致过程是:点击‘确认’后,获取到输入的KEY,转化成string,若长度为16,则分别调用四个jincall函数对此str进行处理,再将分别处理的结果连接起来,最后将连接好的string输出;若长度不为16,则会输出‘Your Input is too short or too long!’。
对于那些函数,如_floatsidf开始不知道到底是干什么的,查了相关资料后发现是:
该 ABI 不支持硬件辅助浮点计算。 作为替代,全部的浮点操作是通过来自编译器的 libgcc.a 静态库中的软件帮助程序函数完成。
查阅相关文档后,才找到了这些函数的具体含义,如上面分析。
接下来,我根据wanniba1里头的算法写了个c程序,用来求哪两个字符可以经过wanniba1中的算法得出字符S,如下:
int main()
{
unsigned int a[2];// 存放那两个字符经转化后的对应的两个数,如‘1’对应ox0001
unsigned int R4=0;// 作为计数器
unsigned int R5=0;
double d16=16.0;
double d1;
从这四个函数的具体的过程中可以看出:
字符 相关的byte
S 第1,2 byte
y 第3,4 byte
c 第5,7 byte
L 第6,8 byte
0 第9,12 byte
v 第10,11 byte
3 第14,13 byte
R 第15,14 byte
这样分析后就可以得出最终的key为:
5379643C37603325