《教我兄弟学Android逆向02 - 破解第一个Android程序》
运行
目的
AndroidKiller
字符串搜索
注意中文输入后需要转为UniCode后再搜索:
搜索结果为“登录成功”和“登录失败”:
JavaDecompiler
查看源码,在Java代码中找到关键函数和逻辑,可以使用Ctrl+F查找字符串:
package hfdcxy.com.myapplication;
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
{
EditText Name;
EditText Pass;
public void check(String paramString1, String paramString2)
{
if ((paramString1.equals("hfdcxy")) && (paramString2.equals("1234")))
{
Toast.makeText(this, "登录成功", 0).show();
}
for (;;)
{
return;
Toast.makeText(this, "登录失败", 0).show();
}
}
protected void onCreate(Bundle paramBundle)
{
super.onCreate(paramBundle);
setContentView(2130968603);
this.Name = ((EditText)findViewById(2131427419));
this.Pass = ((EditText)findViewById(2131427417));
((Button)findViewById(2131427418)).setOnClickListener(new View.OnClickListener()
{
public void onClick(View paramAnonymousView)
{
MainActivity.this.check(MainActivity.this.Name.getText().toString().trim(), MainActivity.this.Pass.getText().toString().trim());
}
});
}
}
代码逻辑
有3种方式可以让APP最后提示为“登录成功”:
1️⃣通过逆向得到正确的逻辑:适用于能找到正确逻辑,能操控正确逻辑的情况。比如判断返回值是服务器返回,则不建议
2️⃣修改跳转:将错误的流程,改为正确的流程。即错误后执行正确逻辑的代码,在本例中采用的是,将“等于”改为“不等于”,smali代码为“if-nez”“if-eqz”。
3️⃣修改正确逻辑的值:将判断的值,(即用户名和密码)重新自己定义。
1️⃣通过逆向得到正确的逻辑
通过smali代码查看正确的值
获取正确的用户名和密码,本例中已明文显示:
if ((paramString1.equals("hfdcxy")) && (paramString2.equals("1234")))
{
Toast.makeText(this, "登录成功", 0).show();
}
运行结果
2️⃣修改跳转
smali代码的跳转指令
不等于改为等于。注意判断条件是并联(&&),有两次字符串对比,smali有两行“if-eqz”:
#如果v0等于0则跳转到:cond_0
if-eqz v0, :cond_0
#if-eqz改为if-nez
if-nez v0, :cond_0