分享一下学习过程中的心得,主要献给和我一样起步晚又对安卓产生浓烈兴趣的童鞋们!
一、代码跟踪的介绍&使用工具
代码跟踪常用于调试程序中,跟踪并了解程序的执行轨迹和执行逻辑。这样来说,对Java这样的高级语言来说,我们容易理解也容易调试。但是像一些低级语言,例如ASM、Smali来说难度就很大了,因为反汇编这样的语言,我们需要一次性记住很多乱七八糟的关键词才能成功,因而代码跟踪的技术就诞生了,并且在一些大程序中的运用更为广泛,同时也是现在逆向一些大而复杂的Android -app极为重要的一种手段。
相信很多人都玩过PC端,对OD的动态调试也应该特别熟悉。OD很强大,其中的F2(断点),F8(单步走)使得调试程序事半功倍,我相信用过得没有说不好的吧。而Android-app与PC software的性质是不同的。在Android-app里是把Apk文件Dump成字节码,分析,修改,再重新编译。有一个很大的不同点就是Android-app但是正是由于开源,使得Dump出来的字节码是“死”的,这是Java的一个特性。幸运的是,Apktool很好的解决了这个问题,它的出现使得Android-app的调试得到了转机,受益的是大家。
既然不能进行完全的调试,想到的办法是用系统的log函数来呈现程序运行到关键时候的关键信息来达到相应的效果。比如说,你想知道程序运行到某个时候某个变量里装的是什么,就可以用log的方式显示。
获取Android程序的log信息一共有几种方式。最好的选择当时是用DDMS,因为它和Android SDK是一伙的!它可以显示很多系统的log信息以及一些其他的乱七八糟的信息。同时,可以设置过滤器来进行标签过滤、log等级(error,warning,info,debug,verbose)过滤、进程过滤,也能结束进程。相当强大。如图:
二、跟踪方法
1.Logging大法
因为Apps没有控制台所以它们只能通过Android 的API中的log函数来进行输出。
关于android/util/Log的介绍如下:
Log extends Object
一共有5个方法:Log.v() Log.d() Log.i() Log.w() and Log.e(),它们分别对应:
int ASSERT Priority constant for the println method.
int DEBUG Priority constant for the println method; use Log.d.
int ERROR Priority constant for the println method; use Log.e.
int INFO Priority constant for the println method; use Log.i.
int VERBOSE Priority constant for the println method; use Log.v.
int WARN Priority constant for the println method; use Log.w
Log.d一般来说是用的最多的。(本来log.v是最多的,但是log.v并不参加编译)
写一个测试类来分析Java代码如下:
public class Log {
public Log() {}
public static void Log(String msg)
{
Log(msg, "Log");
}
public static void Log(Object XX)
{
Log("Log", XX.toString());
}
public static void Log(Object XX, String tag)
{
Log(tag, XX.toString());
}
public static void Log(String tag, String msg)
{
Log.d(tag, msg);
}
public static void ToastLog(Context contx, String msg, int duration)
{
Toast.makeText(contx, msg, duration).show();
}
}
# direct methods
.method public constructor <init>()V
.registers 1
.prologue
.line 8
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method public static Log(Ljava/lang/Object;)V
.registers 3
.parameter "XX"
.prologue
.line 17
const-string v0, "Log"
invoke-virtual {p0}, Ljava/lang/Object;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Lcom/Ericky/Log;->Log(Ljava/lang/String;Ljava/lang/String;)V
.line 18
return-void
.end method
.method public static Log(Ljava/lang/Object;Ljava/lang/String;)V
.registers 3
.parameter "XX"
.parameter "tag"
.prologue
.line 22
invoke-virtual {p0}, Ljava/lang/Object;->toString()Ljava/lang/String;
move-result-object v0
invoke-static {p1, v0}, Lcom/Ericky/Log;->Log(Ljava/lang/String;Ljava/lang/String;)V
.line 23
return-void
.end method
.method public static Log(Ljava/lang/String;)V
.registers 2
.parameter "msg"
.prologue
.line 12
const-string v0, "Log"
invoke-static {v0, p0}, Lcom/Ericky/Log;->Log(Ljava/lang/String;Ljava/lang/String;)V
.line 13
return-void
.end method
.method public static Log(Ljava/lang/String;Ljava/lang/String;)V
.registers 2
.parameter "tag"
.parameter "msg"
.prologue
.line 28
invoke-static {p0, p1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
.line 29
return-void
.end method
.method public static ToastLog(Landroid/content/Context;Ljava/lang/String;)V
.registers 3
.parameter "contx"
.parameter "msg"
.prologue
.line 33
const/4 v0, 0x5
invoke-static {p0, p1, v0}, Lcom/Ericky/Log;->ToastLog(Landroid/content/Context;Ljava/lang/String;I)V
.line 34
return-void
.end method
.method public static ToastLog(Landroid/content/Context;Ljava/lang/String;I)V
.registers 4
.parameter "contx"
.parameter "msg"
.parameter "duration"
.prologue
.line 40
invoke-virtual {p0}, Landroid/content/Context;->getApplicationContext()Landroid/content/Context;
.line 41
invoke-static {p0, p1, p2}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v0
invoke-virtual {v0}, Landroid/widget/Toast;->show()V
.line 42
return-void
.end method
.method public static Log(Ljava/lang/Object;)V
.registers 3
.parameter "XX"
.prologue
.line 17
const-string v0, "Log"
invoke-virtual {p0}, Ljava/lang/Object;->toString()Ljava/lang/String;
move-result-object v1
invoke-static {v0, v1}, Lcom/Ericky/Log;->Log(Ljava/lang/String;Ljava/lang/String;)V
.line 18
return-void
.end method
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
上传的附件: