《教我兄弟学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 MainActivityextends 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_0if-eqz v0, :cond_0#if-eqz改为if-nezif-nez v0, :cond_0
运行结果
3️⃣修改正确逻辑的值
修改smali代码
运行结果
回编译
保存修改
编译

