主要内容:
ida server集成到手机系统
adbd进程中添加启动、停止ida server的逻辑代码
开发ida server控制app实现控制ida server停止、启动、端口修改
1.ida server内置
1.1 ida下载
1.2 内置ida中的android_server到手机系统
将下载好的ida工具包解压之后,在目录dbgsrv下面存放了android_server程序。目前高版本的ida提供了arm和arm64平台的android_server。需要根据手机平台选择对应的版本。由于个人手机arm64的版本,所以选择arm64的程序android_server64。
1.2.1 源码中构建myandroidserverarm64模块
在源码中创建目录frameworks/base/cmds/mycmds/idaandroidserver用来存放ida server模块。在idaandroidserver目录中,将android_server64可执行程序拷贝到该目录下面,并重命名为myandroidserverarm64,然后在该目录下面创建android.mk文件配置myandroidserverarm64模块的编译规则。android.mk文件内容如下:
1.2.2 将myandroidserverarm64模块加入源码编译链中
在源码路径buildmake argetproductase_system.mk中将模块myandroidserverarm64添加到模块编译链中。如下参考:
2.adbd进程中编写控制myandroidserverarm64逻辑代码
由于ida server启动和frida server相似。所以可以将frida server控制的代码拷贝一份修改一下就可以使用。以下是参考代码:
//判断ida server是否正在运行
static int is_ida_server_running() {
int ret=-1;
char buf[256]={0};
file * fp=null;
if((fp=popen(ps -a,r))==null)
{
mylogd(popen error in is_ida_server_running);
return ret;
}
while(fgets (buf,255, fp)!=null) {
if(strstr(buf,myandroidserverarm64)!=null)
{
ret=0;
break;
}
}
pclose(fp);
return ret;
}
//发送ida server运行状态通知app
static void broadcast_ida_server_status(int status,const char * portstr)
{
//am broadcast -a com.android.myaction.ida_server_status --es isrunning 0
char cmd_buf[128]={0};
sprintf(cmd_buf,am broadcast -a com.android.myaction.ida_server_status --es isrunning %d --es port %s,status,portstr);
system(cmd_buf);
mylogd(broadcast_ida_server_status success,status:%d current_port:%s,status,portstr);
}
//控制ida server运行、停止的工作线程
void *ida_server_work_thread(void *m)
{
mylogd(ida_server_work_thread start);
while(1>0)
{
std::string prop = android::base::getproperty(sys.boot_completed, );
std::string myfrd=android::base::getproperty(xro.start.myidaserver,);
std::string port_str=android::base::getproperty(xro.start.myidaserver.port,23946);
bool boot_ok = (prop == 1);
mylogd(ida_server_work_thread sys.boot_completed:%s,prop.c_str());
if(boot_ok)
{
int ida_server_status=is_ida_server_running();
broadcast_ida_server_status(ida_server_status,port_str.c_str());
mylogd(ida_server_work_thread==>%d,ida_server_status);
if(myfrd == 1)
{
mylogd(ida_server_work_threadstart to launch myandroidserverarm64);
char cmd_buf[128]={0};
sprintf(cmd_buf,killall myandroidserverarm64\r\nsleep 1\r\nmyandroidserverarm64 -p %s &,port_str.c_str());
system(cmd_buf);
mylogd(ida_server_work_thread start myandroidserverarm64 finish );
android::base::setproperty(xro.start.myidaserver,3);
}else if(myfrd==0){
mylogd(ida_server_work_thread start to stop myandroidserverarm64);
char cmd_buf[128]={0};
sprintf(cmd_buf,killall myandroidserverarm64);
if(ida_server_status>=0)
{
system(cmd_buf);
}
mylogd(ida_server_work_thread stop myandroidserverarm64 finish );
}else if(myfrd==3){
if(ida_server_status<0)
{
//说明adbd 第一次启动,并且状态属性为3说明adbd被重启了,需要重新启动ida server
//测试过程中发现adbd挂了 ida server也会被杀掉
mylogd(adbd restart,start to launch myfridaserverarm64);
char cmd_buf[128]={0};
sprintf(cmd_buf,killall myandroidserverarm64\r\nsleep 1\r\nmyandroidserverarm64 -p %s &,port_str.c_str());
system(cmd_buf);
mylogd(ida_server_work_thread adbd restart,start myandroidserverarm64 finish );
//android::base::setproperty(xro.start.myfrd,3);
}
mylogd(ida_server_work_thread myandroidserverarm64 is running);
}else{
}
}else{
//log(debug) << sys.boot_completed:<
}
sleep(1);
}
return null;
}
//启动ida server
static void start_ida_server()
{
mylogd(start_ida_server start );
pthread_t thread_id;
int i = 9;
pthread_create(&thread_id, null, &ida_server_work_thread, (void*)&i);
mylogd(start_ida_server thread is created!);
}
3.开发app控制ida server启动、停止和配置端口
由于ida server配置和frida server配置很相似,可以参考控制frida server的配置页面写一个ida server配置的页面。以下是部分核心参考关键代码:
/广播监听状态
broadcastreceiver mbroadcastreceiver = new broadcastreceiver() {
@override
public void onreceive(context context, intent intent) {
string isrunning = intent.getstringextra(isrunning);
string port = intent.getstringextra(port);
if (isrunning.equals(0)) {
textviewshowrunningstatus.settext(正在运行);
} else {
textviewshowrunningstatus.settext(未运行);
}
textviewidaserverport.settext(port);
}
};
//各种功能按钮点击事件
class myclick implements view.onclicklistener {
@override
public void onclick(view view) {
switch (view.getid()) {
case r.id.buttonstartidaserver: {
//启动 ida server
string port = edittextinputidaserverport.gettext() + ;
port = port.trim();
if (port.equals()) {
toast.maketext(mcontext, 当前未配置端口, toast.length_long).show();
return;
}
try {
int myport = integer.parseint(port);
if (myport 65535) {
toast.maketext(mcontext, 配置端口错误,端口范围1024~65535, toast.length_long).show();
return;
}
} catch (exception eeee) {
toast.maketext(mcontext, 配置端口错误: + eeee.tostring(), toast.length_long).show();
return;
}
string getval = get(xro.start.myidaserver, );
d(currentval before: + getval);
systemproperties.set(xro.start.myidaserver.port, port.trim());
systemproperties.set(xro.start.myidaserver, 1);
getval = get(xro.start.myidaserver, );
d(currentval after: + getval);
break;
}
case r.id.buttonstopidaserver: {
//停止ida server
string getval = get(xro.start.myidaserver, );
d(currentval before: + getval);
systemproperties.set(xro.start.myidaserver, 0);
getval = systemproperties.get(xro.start.myidaserver, );
d(currentval after: + getval);
break;
}
case r.id.buttonrestartadbd: {
//重启adbd
string getval = get(xro.start.myadbd, );
d(currentval before: + getval);
systemproperties.set(xro.start.myadbd, 0);
systemproperties.set(xro.start.myadbd, 1);
getval = systemproperties.get(xro.start.myadbd, );
d(currentval after: + getval);
break;
}
}
}
}
以上修改配置好之后就可以编译刷机测试验证效果。
接触电阻是什么,接触电阻过大的原因是什么
新型混合动力汽车检测技术的研究及应用
新款iPad Pro渲染图曝光 包含11寸和12.9寸
宏展仪器|冷热冲击试验箱可用于半导体芯片的测试
明纬电源——三相电380V输入480W导轨电源(TDR-480系列)
IDA server集成以及App控制启动、停止和配置端口介绍
对于新手来说,该如何选择合适的云服务器
电源控制系统中通信的设计与实现
智能手机的屏幕触控原理是什么
10.1.4 自旋场效应晶体管∈《集成电路产业全书》
监控摄像头的详细安装方法
UPS的分类有哪些?
2020年上半年中国电解液出货量8万吨,同比小幅下降3%
企业们期待通过机器学习基础架构平台,以推动人工智能在业务中的利用
英格兰什罗普郡计划替换16523盏尚未采用LED的路灯
科研教育|清锋科技LCD/DLP光固化3D打印解决方案,满足功能件需求
动环监控系统应用智慧机房
温度传感器MAX6613设计的温度采集系统原理解析
控温仪表的概述、工作原理、功能、使用范围及接线原理解析
如何处理扫描双面印刷的文档时,背面的文字会透射到正面?