上一篇博文中我们讲解了smali语法,今天就带大家如何进行动态调试smali代码。你可能要问,为什么要学会动态调试smali代码?那就是为了减轻我们逆向分析的负担!
在上篇的博文中我们已经了解到,一个smali文件中代码量是庞大的,而且smali语法也是并不那么容易就会明白的,当我们想要去逆向分析一个app,试图找到它的漏洞,那么面对大篇幅的smali文件和里面那生涩难懂的代码,你说你如何下手?况且,现如今,基本上一款商业级的App为了安全都会采用混淆和加壳策略,就算你把它反编译了,生成的smali代码还是一堆a,b,c,d.....完全不知道它里面的类和方法名到底是什么!
所以采用动态调试,使用打断点的方式来逐步调试smali代码是势在必行的一个技能。作为一个软件逆向工程师,动态调试也是其需要掌握的基本技能!那么下面就来让我们开始今天学习,如何进行动态调试smali代码。
首先我们需要准备工作:
使用的调试工具:Android Studio
使用到一个smali的支持插件:Smalidea
不同于其他的大众化插件,直接可以在Android Studio中搜索并安装,这里Smalidea无法在Android Studio中搜索到,只能去他的官网下载,这里给出下载地址:Smalidea下载
点进去之后如图所示:
选择下载最新版的Smalidea的压缩包:smalidea-0.05.zip
下载完成后不需要进行解压处理,打开你的Android Studio,点击File>Settings>Plugins:
点击Install plugin from disk..., 在弹出来的框中选择你刚才下载的Smalidea压缩包路径,点击确定即可。添加完后记得需要重启Android Studio,使插件生效。
下面我们就需要导入Smali文件。在Android Studio点击File>new>import project:在弹出的选择框中选择你需要调试的整个项目。这里我需要调试的是百度手机助手。这里的项目是已经反编译过的文件,里面都是smali文件,我默认你已经会把一个Apk反编译成Smali。
选择完成后点击OK,在弹出来的选择框中一直点Next,最后点finish,这样就把项目导入完成了。这里还需要说明一下,导入的是完整的项目,而不是某一处的smali文件!
导入完成后如图所示:
下面我们就开始进行配置调试器,这里是重要的一块! 在Android Studio中点击Run>Run...,在弹出来的选择框中选择编辑Edit Configurations...:
进入到编辑操作:
点击“+”号, 在弹出来的选择中点击Remote:
进入到配置界面:
上图中,Name是设置该调试器的名字,你可以随便取名,下面Port后面是配置端口号,这个是最重要的地方,不能随便填。你可能在此之前也搜索过相关的配置,网上一大堆什么8700,什么6500,,,这些统统不对!!这里是大坑!不要听网上的那些随便写出的数字。
那么这里端口号到底要填什么?我告诉你,这里的端口是实质上是要填写你需要调试的那个App在你手机上的端口号,顺便再说一句,由于手机每时每刻的运行状态也不一样,所以这个端口号还是随时变化的,并不是一成不变的!每当我们需要调试的时候,就要改成这个App这个时候最新的端口号!
你可能没有听太明白,就比如说,这里博主本人调试的是百度手机助手这款App,那么这里的端口号我就需要填写的是百度手机助手App在我手机上的端口号。这样说你是不是就明白了?
下面你还会有疑问,到底该怎么获取到App在手机上的端口号呢?下面我就告诉你:
首先确保你的手机已经连接上你的电脑,然后在Android Studio中点击:Tools>Android>Android Device Monitor,启动设备监视器:
你可能会遇见一个报错:
不用管它,点击OK就好。设备监控器打开后如下:
上面第一列一大堆应用包名就是此时你手机中运行的程序,看到第三列的数字了吗,这就是此时这个App在手机中的端口号!你可以找你需要调试的App,找它包名所对应的端口号,例如这里我需要调试的是百度手机助手App,那么我就先找它的包名:com.baidu,appsearch,发现它对应的端口号是8624,然后我就在配置调试器中端口号填入8624!这就是正确获取端口号的方法,网上那些都是大坑。
填入端口号,然后就可以点击apply,调试器就创建成功了,下面还有一个步骤,就是要配置项目的SDK,因为我们导进来的项目此时还没有一个SDK,我们需要亲手去设置一下:
在Android Studio中点击:File>Project Structure:
在Projrct SDK 中,点击下拉列表,选择1.8版本即可,然后点击OK完成。博主这里已经配置好了。
下面基本工作就差不多了,可以开始进行相应的调试:首先执行命令,以调式状态启动App:
在Android Studio中点击下方的Terminal:
在这里输入命令:
adb shell am start -D -n com.xxx.xxx/.xxxx
斜杆/前面的是主活动所在的包路径,斜杠后面的是App的主活动,也就是程序入口。
这里我调试的是百度手机助手App,所以这里命令就这样写:
adb shell am start -D -n com.baidu.appsearch/.LauncherActivity
前面的 com.baidu.appsearch是主活动LauncherActivity的包路径,后面LauncherActivity就是主活动。百度手机助手App的主活动就是LauncherActivity。
接下来就使用我们刚才配置好的调试器进行调试:点击Run>Debug,在弹出的选择框中选择刚才我们配置的调试器:
下面就可以直接进行调试了!在代码中打上断点,程序就会停留在断电处等待:
调试成功。这里你想看看程序跑到了什么地方,就可以打上相应的断点进行判断。
如果你发现启动调试器失败报错了,多半是App的端口号又变了,你可以去看看此时App的端口号是多少,然后在调试器中修改端口号即可。修改调试器配置:点击Run>Debug,在弹出的选择框中,找到我们配置的调试器,点击最后面的倒三角,点击Edit:
就会进入到该调试器的配置界面:
在这里修改端口号Port,完成后点击Debug即可!
本篇博文到此就结束了。上面提到的查看App端口号的设备监控器后面我们还会重点说到,它也是逆向工程中的一大利器,使用好了就会事半功倍。
到此结束,如果还有什么不明白的地方欢迎评论留言,我会一一解答。使用请标明本文出处,谢谢!