adb 工具源码修改

1、修改客户端输入后的判断逻辑,使带密码的命令 可以通过命令检查

修改 system/core/adb/client/commandline.cpp

在最前面 新增一个函数 用来处理 自定义带密码的命令

//add by dk start
std::string get_command(const char* c){   std::string s= c;if(s.find("-") != std::string::npos){char buf[20];strcpy(buf,s.c_str());char* str1= strtok(buf, " -");fprintf(stderr, "adb:strock----\"%s\"\n", str1);return str1;}char * p=(char*)s.c_str();fprintf(stderr, "adb:buf****----\"%s\"\n", p);return s;}
//add by dk end

对 adb_commandline(int argc, const char** argv) 函数内容进行修改 此函数 是对adb 命令进行校验 和处理

argv 是输入的命令和参数 数组 argv[0] 表示的是 命令字段

 //add by dk start  //获取处理后的命令fprintf(stderr, "adb:--command--\"%s\"\n", argv[0]);std::string str1=get_command(argv[0]);fprintf(stderr, "adb:get_command----\"%s\"\n", str1.c_str());//add by dk end
     //add by dk//修改root 命令判断,用处理后的命令匹配else if (!strcmp(str1.c_str(), "root") || !strcmp(argv[0], "unroot")){return adb_root(argv[0]) ? 0 : 1;}
  //修改shell 命令判断,用处理后的命令匹配else if (!strcmp(str1.c_str(), "shell")) {return adb_shell(argc, argv);}
//修改push pull  命令判断,用处理后的命令匹配else if (!strcmp(str1.c_str(), "push")) {bool copy_attrs = false;bool sync = false;bool compressed = true;std::vector<const char*> srcs;const char* dst = nullptr;parse_push_pull_args(&argv[1], argc - 1, &srcs, &dst, &copy_attrs, &sync, &compressed);if (srcs.empty() || !dst) error_exit("push requires an argument");//return do_sync_push(srcs, dst, sync, compressed) ? 0 : 1;//add by dakunstd::string pass_s=argv[0];auto sub = pass_s+":";fprintf(stderr, "adb:push----\"%s\"\n", sub.c_str());return do_sync_push(srcs, dst, sync, compressed,sub.c_str()) ? 0 : 1;//add end} else if (!strcmp(str1.c_str(), "pull")) {bool copy_attrs = false;bool compressed = true;std::vector<const char*> srcs;const char* dst = ".";parse_push_pull_args(&argv[1], argc - 1, &srcs, &dst, &copy_attrs, nullptr, &compressed);if (srcs.empty()) error_exit("pull requires an argument");//return do_sync_pull(srcs, dst, copy_attrs, compressed) ? 0 : 1;//add by dakunstd::string pass_s=argv[0];auto sub = pass_s+":";return do_sync_pull(srcs, dst, copy_attrs,compressed, sub.c_str(),nullptr) ? 0 : 1;//add end}

在命令后都会调用 adb_connect()方法去进行与服务端通信,但是 shell 和push pull 命令 会进行进一步处理。

对 shell 命令进行追踪处理

修改adb_shell(int argc, const char** argv) 方法

在方法的最后 通过调用 RemoteShell 来进一步调用 adb_connect ,发现 在进行 adb_connect 时所传递的service_string 是 ShellServiceString 方法生成的

//std::string service_string = ShellServiceString(use_shell_protocol, shell_type_arg, command);
//add by dakunstd::string service_string = ShellServiceString(use_shell_protocol, shell_type_arg, command,sp.c_str());return RemoteShell(use_shell_protocol, shell_type_arg, escape_char, command.empty(),service_string);

在 ShellServiceString 方法中可以看到 service_string 方是通过StringPrintf 进行拼接 ,

在这里需要重载一个 ShellServiceString 方法将 带密码的shell 传入 拼接到一起。

//add by dakun
static std::string ShellServiceString(bool use_shell_protocol,const std::string& type_arg,const std::string& command,const std::string& pass) {std::vector<std::string> args;if (use_shell_protocol) {args.push_back(kShellServiceArgShellProtocol);const char* terminal_type = getenv("TERM");if (terminal_type != nullptr) {args.push_back(std::string("TERM=") + terminal_type);}}if (!type_arg.empty()) {args.push_back(type_arg);}// Shell service string can look like: shell[,arg1,arg2,...]:[command].return android::base::StringPrintf("%s%s%s:%s",pass.c_str(),args.empty() ? "" : ",",android::base::Join(args, ',').c_str(),command.c_str());
}

在 adb_shell(int argc, const char** argv) 中 会对argv[0] 重新赋值,所以在最开始要先获取传入的密码

//add by dakun
std::string sp=argv[0];
fprintf(stderr, "adb:strcat----\"%s\"\n", sp.c_str());// Parse shell-specific command-line options.
argv[0] = "adb shell"; // So getopt(3) error messages start "adb shell".

对push 和 pull 命令进行追踪处理

push 和 pull 命令都是通过 sync 命令同步实现的

在匹配命令之后最终会调用 do_sync_push和 do_sync_pull 这两个方法来执行上传

通过追踪 发现这是在file_sync_client.cpp 中的方法

在这两个方法中能找到 SyncConnection 类 ,追踪这个类的构造可以发现 在这个构造方法中进行了

adb_connect(“sync-”, &error) ,所以想要将密码传入需要 新增一个带参数的构造用来传密码

//add by dakun public:SyncConnection(std::string_view s) : acknowledgement_buffer_(sizeof(sync_status) + SYNC_DATA_MAX) {acknowledgement_buffer_.resize(0);max = SYNC_DATA_MAX; // TODO: decide at runtime.std::string error;if (!adb_get_feature_set(&features_, &error)) {Error("failed to get feature set: %s", error.c_str());} else {have_stat_v2_ = CanUseFeature(features_, kFeatureStat2);have_ls_v2_ = CanUseFeature(features_, kFeatureLs2);have_sendrecv_v2_ = CanUseFeature(features_, kFeatureSendRecv2);have_sendrecv_v2_brotli_ = CanUseFeature(features_, kFeatureSendRecv2Brotli);fd.reset(adb_connect(s, &error));if (fd < 0) {Error("connect failed: %s", error.c_str());}}}
//add end

同样也新增一个带密码参数的 do_sync_push 或 do_sync_pull 方法 ,在这个方法中调用 带参数的

SyncConnection(std::string_view s) 构造方法

//add by dakun
bool do_sync_push(const std::vector<const char*>& srcs, const char* dst, bool sync, bool compressed,const char* pass) {SyncConnection sc(pass);if (!sc.IsValid()) return false;bool success = true;bool dst_exists;bool dst_isdir;struct stat st;if (sync_stat_fallback(sc, dst, &st)) {dst_exists = true;dst_isdir = S_ISDIR(st.st_mode);} else {if (errno == ENOENT || errno == ENOPROTOOPT) {dst_exists = false;dst_isdir = false;} else {sc.Error("stat failed when trying to push to %s: %s", dst, strerror(errno));return false;}}if (!dst_isdir) {if (srcs.size() > 1) {sc.Error("target '%s' is not a directory", dst);return false;} else {size_t dst_len = strlen(dst);// A path that ends with a slash doesn't have to be a directory if// it doesn't exist yet.if (dst[dst_len - 1] == '/' && dst_exists) {sc.Error("failed to access '%s': Not a directory", dst);return false;}}}for (const char* src_path : srcs) {const char* dst_path = dst;struct stat st;if (stat(src_path, &st) == -1) {sc.Error("cannot stat '%s': %s", src_path, strerror(errno));success = false;continue;}if (S_ISDIR(st.st_mode)) {std::string dst_dir = dst;// If the destination path existed originally, the source directory// should be copied as a child of the destination.if (dst_exists) {if (!dst_isdir) {sc.Error("target '%s' is not a directory", dst);return false;}// dst is a POSIX path, so we don't want to use the sysdeps// helpers here.if (dst_dir.back() != '/') {dst_dir.push_back('/');}dst_dir.append(android::base::Basename(src_path));}success &= copy_local_dir_remote(sc, src_path, dst_dir, sync, false, compressed);continue;} else if (!should_push_file(st.st_mode)) {sc.Warning("skipping special file '%s' (mode = 0o%o)", src_path, st.st_mode);continue;}std::string path_holder;if (dst_isdir) {// If we're copying a local file to a remote directory,// we really want to copy to remote_dir + "/" + local_filename.path_holder = dst_path;if (path_holder.back() != '/') {path_holder.push_back('/');}path_holder += android::base::Basename(src_path);dst_path = path_holder.c_str();}sc.NewTransfer();sc.SetExpectedTotalBytes(st.st_size);success &= sync_send(sc, src_path, dst_path, st.st_mtime, st.st_mode, sync, compressed);sc.ReportTransferRate(src_path, TransferDirection::push);}success &= sc.ReadAcknowledgements(true);sc.ReportOverallTransferRate(TransferDirection::push);return success;
}
//add end

ps:这里传的是 push 和 pull 而不是之前的sync 所以在服务端也要进行处理 ,并且需要同步修改

file_sync_client.h 文件

//add by dakun
bool do_sync_push(const std::vector<const char*>& srcs, const char* dst, bool sync, bool compressed,const char* pass);
bool do_sync_pull(const std::vector<const char*>& srcs, const char* dst, bool copy_attrs, bool compressed, const char* pass, const char* name = nullptr);
//add by end

adb 工具源码修改相关推荐

  1. Android Dialer,Mms,Contacts源码修改笔记,移动端混合开发经验

    ②在AndroidManifest.xml中修改相应Activity的theme <activity android:name=".HomeActivity" android ...

  2. 安卓系统AOSP源码修改入门

    先整理 后学习 再总结 编译 版本查询 设备代号 驱动下载 精简编译教程 索尼编译巨详细教程 源码阅读 anroid studio 导入aosp 源码 源码结构 源码修改 内置证书抓包 默认打开ADB ...

  3. gh-ost大表DDL工具源码阅读

    gh-ost大表DDL工具源码阅读 最终目的 开发环境与测试数据库准备 一个简单的ddl案例 debug分析程序执行过程 vscode debug配置 变量介绍 核心处理逻辑 分析我的需求 最终目的 ...

  4. android打开volte代码,Android8.1 源码修改之插入SIM卡默认启用Volte功能

    前言 公用电话产品,插入SIM卡后要求自动打开Volte功能,即插即用,用完拔卡就走 实现 第一步 开关对应的代码 通过打印日志和全局查找,源码位置 vendor/mediatek/proprieta ...

  5. android 4.0模拟器启动不了,Android 4.0 framework源码修改编译,模拟器运行不起来,求助...

    当前位置:编程学习 > wap >> Android 4.0 framework源码修改编译,模拟器运行不起来,求助 我下载编译了android 4.0 ICS的源码,然后能利用编译 ...

  6. Android TV 源码修改默认输入法

    前一阵子,应泰国客户需求,需要在Android TV系统定制一个多语言输入法,至少支持中.英.泰三种语言.拿到这个任务,对于至今还是小白的我来说,当然先去google一下有没有大神专门做过符合要求的输 ...

  7. Python与Seo工具源码,全网搜录查询助手exe

    Python与Seo工具源码,全网搜录查询助手exe 很多人都说,seo是一个玄学,诚然,一方面是排名,另一方面是收录,尤其是对于渣渣而言,当然收录和排名都需要去验证,去查询,乃至去监控,大批量的话, ...

  8. Ureport2源码修改:增加自定义功能

    Ureport2源码修改:单元格超链接增加弹出窗口显示功能 需求来源 功能实现 ureport2-js项目: ureport2-console项目: ureport2-core项目: 最终效果 新人第 ...

  9. Deep Compression阅读理解及Caffe源码修改

    Deep Compression阅读理解及Caffe源码修改 作者:may0324 更新:  没想到这篇文章写出后有这么多人关注和索要源码,有点受宠若惊.说来惭愧,这个工作当时做的很粗糙,源码修改的比 ...

最新文章

  1. centos7ftp服务器的搭建
  2. less.js插件监听
  3. Xamarin iOS开发实战上册-----2.2.2 使用代码添加视图
  4. iOS 7 二维码的生成
  5. 推荐系统笔记(模型融合)
  6. 关于页面布局的一些注意点
  7. 哥斯拉Webshell
  8. 腾达fh307没有显示服务器名,腾达(Tenda)FH307路由器上网设置 | 192路由网
  9. 笨办法学python3 pdf 脚本之家_解决python3输入的坑——input()
  10. eclipse中对于Java虚拟机参数的设置与思考
  11. mysql5.7版本windows的安装
  12. bzoj5118: Fib数列2(费马小定理+矩阵快速幂)
  13. html canvas 简单体验
  14. excel计算机一级知识点,计算机一级考试考点:Excel电子表格
  15. 4python小项目---# 体脂率计算
  16. 在页眉插入横线或下划线
  17. css实现径向和线性渐变,CSS3的渐变属性 线性渐变 径向渐变 重复线性渐变和径向渐变...
  18. 9、电话区号信息API接口,免费好用
  19. linux下容器find函数,你知道Linux系统中find命令的使用方法吗?
  20. 【ElectronJs】基于Electron Forge打包的一些问题汇总

热门文章

  1. syslog配置及测试
  2. wps excel批量获取网址标题(Title)
  3. python矩阵求和, numpy.sum()
  4. 【Xshell免费版,不用去找破解(ftp也一样)】
  5. 11G新特性 -- archival(long-term)backups
  6. 国外计算机科学的 lab,真滴牛逼!
  7. 计算幻术之路(二):增强现实的现实
  8. onbeforeunload, 浏览器关闭和刷新提示
  9. 鸿蒙王者荣耀想要转区吗,王者荣耀开放转区 转区转角色服务要求条件汇总
  10. 时间加减计算器_初级会计职称考试不让带计算器?!手把手教你使用机考系统计算器,再不看就晚了!...