在android系统的源码有很多工具的源码。存放路径如下
- android/system 底层文件系统库、应用及组件,linux自带的
- android/external android 使用的一些开源的模组
- android/frameworks/base/cmds 一些android重要命令:am、app_proce等
实际上这些工具都是小应用。调试串口接电脑,开启控制台可以使用这些工具。如果USB连电脑,用adb调试工具,输入adb shell指令进入控制台 。
- dumpsys:能dump系统服务的各种状态。
- dumpstatus:android的相关信息,内核,进程,相关信息的主要实现地方
- top:CPU使用
- pm:包管理(package manager)
- am:活动管理activity manager
- tinyalsa:音频调试,有tinycap、tinymix、tinyplay
- settings:更改SettingsProvider数据库的值
- logcat:系统日志
- monkey:测试工具
- svc:控制电源、数据流量、wifi、usb、以太网的开关状态
- wm:查看设置屏幕的分辨率、密度
- screencap:截屏
- screenrecord:录屏
目标设备的system/bin和system/xbin有android添加的一些工具和linux自带的工具,这些工具可能是java、c、c++或shell指令写的。上面提到的几个工具都挺好玩的,具体使用方法可以输入参数--help查看帮助或者网上搜索。
这里介绍如何自己用c或者c++编写一个工具并且在android编译的时候加入到系统当中
一 编写一个测试ioctl接口的小工具
创建文件夹frameworks/base/cmds/dytest
1.创建Android.mk文件
- LOCAL_PATH:= $(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_SRC_FILES:= test.c LOCAL_SHARED_LIBRARIES := libcutils liblog LOCAL_LDLIBS :=-llog
- LOCAL_MODULE:= dytest
- LOCAL_MODULE_TAGS := optional
- include $(BUILD_EXECUTABLE)
2.创建test.h
- #include <linux/types.h>
- #include <linux/stddef.h>
- #include <asm/ioctl.h>
- #ifndef IO_BASIC_H_
- #define IO_BASIC_H_
- #define RD_UNIT_SIZE 1024
- #define WR_UNIT_SIZE 1024
- #define RDWR_UNIT_SIZE 1024
- #define S_IRWXU 00700
- #define S_IRUSR 00400
- #define S_IWUSR 00200
- #define S_IXUSR 00100
- #define S_IRWXG 00070
- #define S_IRGRP 00040
- #define S_IWGRP 00020
- #define S_IXGRP 00010
- #define S_IRWXO 00007
- #define S_IROTH 00004
- #define S_IWOTH 00002
- #define S_IXOTH 00001
- #define SI4754_CMDMAGIC 0X81
- #define usrdatatype unsigned long
- enum FM_CMD_TYPE{
- FM_START = _IOWR(SI4754_CMDMAGIC, 1, unsigned long),
- FM_STOP,
- FM_SEEKUP,
- FM_SEEKDOWN,
- FM_SETFREQ,
- FM_SETVOL,
- FM_GETFREQ,
- FM_GETVOL,
- FM_TEST
- };
- /*
- ============================================================================
- Name : IO_Operation.c
- Author : DongYi
- Version :
- ============================================================================
- */
- //以O_RDWR | O_CREAT | O_TRUNC,S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP | S_IROTH权限打开文件
- int open_file(const char* filename);
- //以O_RDWR | O_CREAT | O_TRUNC,S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP | S_IROTH权限打开文件
- int open_file_create(const char* filename) ;
- //以O_RDONLY,S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP | S_IROTH权限打开文件
3.创建test.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <asm/io.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <linux/delay.h>
- #include "test.h"
- unsigned long qndData;
- const char* filename = "/dev/fmsi4754";
- int open_file(const char* filename) {
- return open_file_create(filename);
- }
- int open_file_create(const char* filename) {
- int fd; //文件描述符
- fd = open(filename, O_RDWR | O_CREAT | O_TRUNC,
- S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP | S_IROTH);
- if (fd == -1) {
- printf("\nopen_file:文件操作失败");
- return -1;
- }
- printf("\nopen_file:文件操作成功");
- return fd;
- }
- int main(void) {
- int fp;
- int ret;
- char buf[1024]={0};
- long len;
- puts("~~~~~~~~~~test.c测试程序 Linux I/O操作~~~~~~~~~~~~\n\n"); /* prints Linux I/O操作 */
- // for(len=64000;len>0;len--);
- sleep(1);
- fp = open_file_create(filename);
- if (fp < 0) {
- printf("open_file:faild!\n");
- return -1;
- }else{
- printf("open_file:success!\n");
- }
- qndData=0x12345678;
- do{
- ret=ioctl(fp, FM_START, &qndData);
- printf("ioctl_file:qndData:0x%x\n ",qndData);
- if (ret < 0) {
- printf("ioctl_file:faild!\n");
- close(fp);
- return -1;
- }else{
- printf("ioctl_file:success\n");
- }
- }while(qndData==0x12345678); //开机
- return 1;
- }
代码和编译规则文件准备好了,输入mmm frameworks/base/cmds/dytest/编译。烧录就可使用。
这个工具还可以使用arm-linux-androideabi-gcc工具编译
- arm-linux-androideabi-gcc -o dytest --sysroot=/home/android/SambShare/dyT3-v1.0/android/prebuilts/ndk/current/platforms/android-18/arch-arm/ test.c
用这个方式编译的话就要把dytest工具push到android系统,然后修改权限。当然你也可以用android.mk文件拷贝dytest到system/bin目录下。
二添加android权限后门工具seustub
这个工具是在网上下载的,不方便公布代码,实际使用socket实现在控制台输入指令。
获取seustub压缩包后解压seustub放置在external/文件夹
1.external/seustub/下创建Android.mk
- include external/seustub/seustub/Android.mk
- include external/seustub/seustubtest/Android.mk
2.创建external/seustub/seustub/Android.mk
- LOCAL_PATH:= $(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_SRC_FILES:= seustub.cpp util.cpp LOCAL_SHARED_LIBRARIES := libcutils liblog LOCAL_LDLIBS :=-llog
- LOCAL_MODULE:= seustub
- LOCAL_MODULE_TAGS := optional
- include $(BUILD_EXECUTABLE)
3.创建external/seustub/seustubtest/Android.mk
- LOCAL_PATH:= $(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_SRC_FILES:= seustubtest.cpp ../seustub/util.cpp LOCAL_SHARED_LIBRARIES := libcutils liblog LOCAL_LDLIBS :=-llog
- LOCAL_MODULE:= seustubtest
- LOCAL_MODULE_TAGS := optional
- include $(BUILD_EXECUTABLE)
4.init.rc中添加启动服务
- service seustub /system/bin/seustub
- class main
最后输入mmm android/external/seustub编译
使用方法是seustubtest +指令+参数,例seustubtest chmod 777 /dev/si4754
公司的JAVA应用需要临时的root权限,还需要获取返回值判断指令的成功。因此删除seustubtest部分,为seustub添加了供上层调用的JNI接口,并且指令的返回结果输出到文件中。不做详细介绍。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对w3xue的支持。如果你想了解更多相关内容请查看下面相关链接