第一天
入门核心源码
页面自己随便设计个form表单登录即可
反编译后smali代码(部分截图)
- invoke-static 是类静态方法的调用,编译时,静态确定的;
- invoke-virtual 虚方法调用,调用的方法运行时确认实际调用,和实例引用的实际对象有关,动态确认的,一般是带有修饰符protected或public的方法;
- invoke-direct 没有被覆盖方法的调用,即不用动态根据实例所引用的调用,编译时,静态确认的,一般是private或方法;
- invoke-super 直接调用父类的虚方法,编译时,静态确认的。
- invokeinterface 调用接口方法,调用的方法运行时确认实际调用,即会在运行时才确定一个实现此接口的对象。
- 这里要补充两个smali指令 一个是if-eqz 另一个是if-nez 这两条指令是相对的
if-eqz vA, vB, :cond_" 如果vA等于vB则跳转到:cond_
if-nez vA, vB, :cond_" 如果vA不等于vB则跳转到:cond_
分析部分代码
小总结
- 首先程序把我们输入的用户名和密码给了p1和p2 然后把真正的用户名给了v0 再拿p1和v0对比 对比的结果放在v0中 如果这两个值不相等v0就等于0
- 然后用if-eqz v0, :cond_0这条指令去判断v0是不是0 如果v0等于0 也就是用户名和密码不相等 就跳转到:cond_0位置 执行登录失败 否则继续往下面执行
- 这里假设用户名输入正确了 程序往下继续执行 后面会进行同样的判断密码是不是相等 只有用户名和密码都是正确的 程序才不会跳转到:cond_0位置执行登录失败
破解思路
结合着上面的总结那么思路来了 我如果不让程序跳转到:cond_0位置 让程序每次在if-eqz v0, :cond_0这条关键指令上继续往下执行 是不是就可以执行登录成功代码了? 那怎么能让它不跳转呢?
我现在有三种思路:
第一种 程序有两个if-eqz 分别是用来判断用户名和密码是否正确的 我把这两个if-eqz都改成if-nez
第二种 我直接把这两条指令删除掉
第三种也是最省事最懒的一种 我直接用goto语句直接一条指令让程序执行跳转登录成的代码 也是可以达到程序破解的目的 这里强调一个问题 修改完smali代码后一定要ctrl+s保存 不然程序还是拿原来的smali代码编译。
破解操作记录
闪退思路
有概率闪退看是否是没有加签名,以及APK壳之类得问题