
public class MainActivity extends AppCompatActivity {Button bn ;EditText show;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.layout_2);show = (EditText)findViewById(R.id.show);bn = (Button)findViewById(R.id.bn);bn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {show.setText("bn 按钮被点击了!!!");}});}}
第一步:
确定findViewById()这个方法的是哪个类的;由于这些组件当app一打开就被加载好了;我们要找到那个类,可以在terminal里面输入命令Java.enumerateLoadedClassesSync()枚举所有已加载的类
;以—no-pause注入才行;
找到对应的类之后;就应该寻找组件id;这个例子中的登陆按钮id为“btn_login”
//访问内部类的属性var btn_login_id = Java.use("com.dodonew.online.R$id").btn_login.value;//获取组件id

ps:在练习这个注入时,以—no-pause
方式
[Redmi 6A::platexx.boxxoota]-> Process crashed: Illegal instruction
解决方法:
function main() {Java.perform(function () {console.log("--------------start hooking--------------");function showStack() {var log = Java.use("android.util.Log");var Throwable = Java.use("java.lang.Throwable");console.log(log.getStackTraceString(Throwable.$new()))}var btn_login_id = Java.use("com.dodonew.online.R$id").btn_login.value;console.log("btn_login_id", btn_login_id);var appCompatActivity = Java.use("android.support.v7.app.AppCompatActivity");appCompatActivity.findViewById.implementation = function (a) {if(a == btn_login_id){showStack();console.log("appCompatActivity.findViewById: ", a);}return this.findViewById(a);}})}setTimeout(main, 1000);
