运行
- 是一个输入验证的一个程序,当验证失败的时候会弹出提示
- 因此该题需要我们逆程序拿到正确的验证码
apk逆向
MainActivity
- 利用AndroidKiller逆apk
- 找到MainActivity
- 发现当cyberpeace返回1时,验证通过
package com.testjava.jack.pingan2;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity
extends AppCompatActivity
{
protected void onCreate(Bundle paramBundle)
{
super.onCreate(paramBundle);
setContentView(2131296283);
((Button)findViewById(2131165218)).setOnClickListener(new View.OnClickListener()
{
public void onClick(View paramAnonymousView)
{
if (cyberpeace.CheckString(((EditText)MainActivity.this.findViewById(2131165233)).getText().toString()) == 1)
{
Toast.makeText(MainActivity.this, "验证通过!", 1).show();
return;
}
Toast.makeText(MainActivity.this, "验证失败!", 1).show();
}
});
}
}
cyberpeace
- 发现加载了
cyberpeace
这个库,因此找到这个库观察代码
package com.testjava.jack.pingan2;
public class cyberpeace
{
static
{
System.loadLibrary("cyberpeace");
}
public static native int CheckString(String paramString);
}
so文件逆向
找到关键返回
return strcmp(v9, "f72c5a36569418a20907b55be5bf95ad") == 0;
加密操作1
if ( *v9 )
{
*v9 = v9[1];
v9[1] = v14;
if ( strlen(v9) >= 3 )
{
v15 = 2LL;
do
{
v16 = v9[v15];
v9[v15] = v9[v15 + 1];
v9[v15 + 1] = v16;
v15 += 2LL;
}
while ( strlen(v9) > v15 );
}
}
加密操作2
if ( strlen(v9) >= 2 )
{
v12 = 0LL;
do
{
v13 = v9[v12];
v9[v12] = v9[v12 + 16];
v9[v12++ + 16] = v13;
}
while ( strlen(v9) >> 1 > v12 );
}
解密脚本
crpty = 'f72c5a36569418a20907b55be5bf95ad'
crpty = list(crpty)
print crpty
for i in range(0,len(crpty),2):
temp=''
temp = crpty[i]
crpty[i]=crpty[i+1]
crpty[i+1]=temp
print crpty
for i in range(16):
temp=''
temp = crpty[i]
crpty[i] = crpty[i+16]
crpty[i+16]=temp
print crpty
decrpty=''.join(crpty)
print decrpty