逆向分析

题目给了一个AliCrackme_1.apk,安装之后打开是一个密码登录界面。输入密码之后点击”登录”会判断密码是否正确。

使用jdax反编译一下,MainActivity是入口。

因为涉及到点击操作后面的逻辑,查看onClick()方法

public void onClick(View v) throws IOException {
String password = edit.getText().toString();
String table = MainActivity.this.getTableFromPic();
String pw = MainActivity.this.getPwdFromPic();
Log.i("lil", "table:" + table);
Log.i("lil", "pw:" + pw);
String enPassword = "";
try {
enPassword = MainActivity.bytesToAliSmsCode(table, password.getBytes("utf-8"));
Log.i("lil", "enPassword:" + enPassword);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if (pw == null || pw.equals("") || !pw.equals(enPassword)) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setMessage(C0127R.string.dialog_error_tips);
builder.setTitle(C0127R.string.dialog_title);
builder.setPositiveButton(C0127R.string.dialog_ok, new DialogInterface.OnClickListener() { // from class: com.example.simpleencryption.MainActivity.1.1
@Override // android.content.DialogInterface.OnClickListener
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.show();
return;
}
MainActivity.this.showDialog();
}

可以看到,将用户输入的文本存储为password参数,而table和pw参数则是调用两个方法直接获取的,并且使用Log方法以”lil”标签打印出了这两个参数的值在日志中。

之后的操作是调用bytesToAliSmsCode方法

public static String bytesToAliSmsCode(String table, byte[] data) {
StringBuilder sb = new StringBuilder();

for (byte b : data) {
sb.append(table.charAt(b & 255));
}

return sb.toString();
}

将用户输入的password参数与table表进行映射加密存储为enPassword参数,并且也在日志中打印出来。如果enPassword与pw相等,那么判断密码正确。

我们能够通过日志,获取到这三个的值,那么只需要把pw通过table表映射回去,就是需要输入的正确密码了。

日志捕获

PS C:\Users\mikannse> adb -s f311840e logcat -s lil:I
--------- beginning of system
--------- beginning of crash
--------- beginning of main

通过adb的logcat,指定捕获lil标签的内容

输入”0123456789”

08-07 15:13:57.049 10579 10579 I lil     : table:一乙二十丁厂七卜人入八九几儿了力乃刀又三于干亏士工土才寸下大丈与万上小口巾山千乞川亿个勺久凡及夕丸么广亡门义之尸弓己已子卫也女飞刃习叉马乡丰王井开夫天无元专云扎艺木五支厅不太犬区历尤友匹车巨牙屯比互切瓦止少日中冈贝内水见午牛手毛气升长仁什片仆化仇币仍仅斤爪反介父从今凶分乏公仓月氏勿欠风丹匀乌凤勾文六方火为斗忆订计户认心尺引丑巴孔队办以允予劝双书幻玉刊示末未击打巧正扑扒功扔去甘世古节本术可丙左厉右石布龙平灭轧东卡北占业旧帅归且旦目叶甲申叮电号田由史只央兄叼叫另叨叹四生失禾丘付仗代仙们仪白仔他斥瓜乎丛令用甩印乐
08-07 15:13:57.049 10579 10579 I lil : pw:义弓么丸广之
08-07 15:13:57.049 10579 10579 I lil : enPassword:丸么广亡门义之尸弓己

根据打印的enPassword值可得知:”0123456789”分别对应的就是”丸么广亡门义之尸弓己”,那么pw,映射回来就是”581026”

故正确密码为581026