上一篇 《教我兄弟学Android逆向04 动态调试smali代码 》 我带你动态调试了smali代码 课后作业你也做了三遍 基本上是对动态调试有所了解了 课下自己再找几个小例子多练习几遍 知识学到手了 以后面试官面试你的时候问你 你会动态调试smali代码吗?那个时候你就可以用这个表情看着面试官了(无奈 找QQ表情斜眼笑没找到 只能用这个相似但很贱贱的小表情替代了 但是不是我想要的效果 这里建议吾爱破解论坛可以添加个斜眼笑的表情 为什么?因为/xyx) 那么今天给你带来的这堂课是在smali代码中插入Log的教程 那么你问了以前经常听别人提及到Log那么别人口中的Log到底是什么 ?
给你个眼神 下面开始上课 好好听课啊
要么学!要么不学!学和不学之间没有中间值 不学就放弃,学就要去认真的学! --致选择
一 编写JAVA程序并在smali代码中插入Log
1 打开自己的AndroidStudio 在MainActivity里面写一段switch case语句
<ignore_js_op>
2.编译并安装程序到手机 打开Android Monitor 运行程序 就把自己添加的Log打印出来了
<ignore_js_op>
3.把程序用AndroidKiller反编译 switch case语句的smali代码分析我这里就不讲了 自己可以对照着自己写的java代码去分析 或者参考《 教我兄弟学Android逆向03 破解第一个Android游戏》 里面对switch case的分析
<ignore_js_op>
<ignore_js_op>
4 把复制出来的那三句代码中的会飞的丑小鸭 改成: 我是添加的smali代码并添加到smali中 Ctrl+S保存好后 卸载 编译 安装 打开打开Android Monitor看Log
const-string v0, "Hello"
const-string v1, "\u6211\u662f\u6dfb\u52a0\u7684smali\u4ee3\u7801"
invoke-static {v0, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
5.这里就成功的把自己在smali中添加的Log打印出来了
<ignore_js_op>
6.通过上面的练习你学会了在smali代码中插入Log 但是通常在实战中只会插入一句话Log是远远不够的 很多情况下插入Log是为了打印出程序中某个变量的值 听完我这句话后 你不耐烦的说道 兄弟你别卖关子了 赶快讲怎么通过在smali代码中插入Log打印出变量的值 我还等着吃饭呢 好吧 为了兄弟的肚子不受饿 下面我加快点进度
二 打印变量的值
1 这里我编写了一个Demo 从下面的代码中可以出我在onCreate方法中执行了三个函数 函数名分别是fun1 fun2和fun3 并且在下面加入一条Log 目的是为了打印出函数fun1的返回值 因为Log.i的两个参数都必须是String类型 所以这里把int类型的fun1这个函数通过String.valueOf函数转换成String类型
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fun1();
fun2();
fun3();
Log.i( "这个值是" ,String.valueOf(fun1()));
}
public int fun1()
{
int value = Test.value;
return value;
}
public int fun2()
{
int value2 = Test.value2;
return value2;
}
public String fun3()
{
String str = Test.str;
String str2 = Test.str2;
int value3 = Test.value3;
return str2;
}
}
|
2 下面我给本节课定三个要完成的任务 我将会带着你从从第一个任务开始做 由于下面的内容很重要 所以你可要认真听课了
任务一
添加Log打印出fun2,fun3的值 (其实就是函数的返回值)
任务二
添加Log打印出fun3里面String类型str的值
任务三
添加Log打印出fun3里面int类型value3的值
任务一 添加Log打印出fun2,fun3的值
1. 这里分析一下程序 你看下上面贴的代码中onCreate方法中有一句Log是打印fun1的值的 如果在java代码中如果要打印出fun2的值 是不是只要把String.valueOf(fun1)中的fun1改成fun2 是不是就可以打印出来fun2的值 那么smali代码也一样 我只要找到打印fun1的这条log反编译成的smali代码 把里面的fun1改成fun2 是不是任务一就完成一半了?
这里我把打印fun1的这条log的smali代码复制了下来 然后在这条Log下面粘贴了一遍 把粘贴后smali代码中的fun1改成了fun2 修改完成后 保存->编译->卸载->安装->运行 查看Android Monitor 可以看到这里已经把fun2的值打印出来了
<ignore_js_op>
<ignore_js_op>
2 把fun2的值打印了出来 那么fun3的值怎么打印呢 可以看到fun2和fun3函数都是int类型 然后通过String.valueOf这个函数转换成的String类型 但是fun3这个函数本身就是String类型 这里如果还通过String.valueOf函数转换的话程序会报错的 那么既然上面那种在smali代码中换函数名字打印Log的方法在函数fun3中行不通了 我如何打印出fun3的值呢 ? 如果在JAVA代码中你会怎么做 是不是重新插一条Log去打印fun3函数的返回值 打开smali代码 按照这个思路去做 这样就把任务一给完成了
<ignore_js_op>
<ignore_js_op>
任务二 添加Log打印出fun3里面String类型str的值
首先从smali代码中找到fun3方法所在的位置 然后在方法里面找到str的值 一般来说程序都会把这个值储存到寄存器中 可以找到这个寄存器 然后把寄存器作为变量给打印出来 那么任务二是不是也完成了
<ignore_js_op>
任务三 添加Log打印出fun3里面int类型value3的值 这里上面也提到了 Log.i这个函数的两个参数必须都为String类型,而这里想把int类型value3的值通过Log打印出来 那么得把它转换为String类型 用到函数String.valueOf 这里可以把上面打印出fun1那段Log的Smali代码复制过来 稍作修改
<ignore_js_op>
<ignore_js_op>
三. 总结 本节课从简单的插入Log到从smali代码中打印变量的值 然后从中牵扯到了类型转换 最后通过完成三条任务为主线 结束了本节课的教程 这堂课中的每一个例子 每一个点都很精致并且实用 这节课的内容你可以留着当做Log方面参考文档 虽然本节课的篇幅比较长 但是本节课的所讲的所有东西 你都要跟着做一遍 最好自己能写一些心得 有时候你看着这些东西可能会比较烦 因为学习是痛苦的 痛并快乐着 当你看代码累的时候就休息一会吧 给你推荐一首音乐Summer Poem 我经常在敲代码的时候单曲循环这首歌 当你在听这堂课的时候 要记住逆向的道路上不只你一个人在奋斗!有我们 他们 以及看见这篇文章的所有人都在做这件事,所以你不孤独!
本节课所用到的AndroidStudio项目和生成的Apk:
链接:https://pan.baidu.com/s/1mjiAYe8 密码:yhfy
课后作业:
(1) 参考本节课第一个例子自己用AndroidStudio编写Switch case语句 要求Switc case的是支付成功 支付取消和支付失败 并且打印出相应的Log
(2)在 https://www.52pojie.cn/thread-632178-1-2.html 滚动的天空 这个游戏支付成功 失败 取消方法 的smali代码中分别插入三条自己的Log 点击购买时查看程序打印出的Log
下一篇:《教我兄弟学Android逆向06 用AndroidStudio编写第一个so》