本发明属于数据恢复领域,具体涉及一种安卓设备不介入SD卡还原系统及数据的方法。
背景技术:
随着信息化技术的不断发展与进步,众所周知,安卓(Android)设备已经成为人们生活中不可替代、不可或缺的一个工具。Android设备也因此得到飞速发展,现已不仅仅是通话工具那么简单,它俨然成为生活的一部分,Android设备的各种各样的功能也层出不穷,覆盖了生活中的方方面面。但Android设备在获取丰富资源、处理大量数据的同时面临着被破坏的风险也越来越大,例如恢复出厂设置,误刷机、中病毒等情况均会造成手机数据丢失,因此还原Android设备的数据显得尤为重要。
目前现有的Android设备的系统还原方法有以下两种:单独还原某个或者某些用户应用数据;利用设备的外置SD卡进行数据还原。
单独还原某个或者某些应用数据会显得十分繁琐,给公检法取证或者个人设备损坏需要进行系统还原带来诸多不便,显得效率低下,并且不能保证还原数据的有效性和匹配性。
另外,随着Android设备的更新换代,市场上现有的很多手机都无法接入外置SD卡,现有的方法和装置在处理这部分手机时就显示出了局限性,所以亟需将现有方法进行完善和创新,以更加适合市场需要。
关于本文中的专业术语说明:
Recovery模式:是Android设备系统的一种特殊的工程模式,在该模式下可以对Android设备内部的数据或系统进行修改。
技术实现要素:
本发明针对现有技术的不足,提供了一种安卓设备不介入SD卡还原系统及数据的方法,能够有效解决现有技术不能接入外置SD卡的设备数据进行还原操作,而且不能检验并保证待还原数据的有效性、匹配性等问题。
为解决以上问题,本发明采用的技术方案如下:一种安卓设备不介入SD卡还原系统及数据的方法,包括以下步骤:
S1.将Android设备通过USB数据线正确连接至电脑;
S2.检测Android设备是否处于root状态,若Android设备已经获取了root权限,则跳至S4进入正常模式,否则跳至S3;
S3.启动Android设备至recovery模式;
S4.在电脑端选择待还原的数据文件;
S5.获取Android设备的所有分区信息,并在Android设备端选择需要被还原的分区;
S6.根据S5获取的分区信息筛选出需被还原的分区的文件系统、分区的大小、分区文件结构信息,并与在电脑端选择的待还原的数据进行对比,验证电脑端的数据文件与Android设备端的分区文件系统是否相同、分区大小是否一致、分区文件结构是否匹配,若匹配成功则跳至S7,否则跳至S4;
S7.开启Android设备端socket服务,并将socket设置成监听模式;
S8.电脑端连接Android设备端开启的socket服务端口,通过该端口将电脑端选择的数据文件写入Android设备端所选择的需要被还原的分区。
作为优选,S7具体方法如下:
S71.创建自定义结构体AndroidRecoveryThreadPrameter的实例对象,在该对象中设置待还原的数据文件路径、Android设备的ID、建立连接的端口号 和还原数据时开始地址的信息;
S72.使用AndroidRecoveryThreadPrameter的参数设置开启Android设备
端服务的命令集;
S73.通过在windows操作系统的dos下执行设置的命令集完成开启Android设备端服务,且开启监听模式,等待响应连接请求;
S74.返回执行结果并验证是否成功开启socket服务,若其返回值为0则表示成功,立即转入S8,否则转入S71。
作为优选,所述的S8电脑端连接socket服务的具体方法如下:
S81.创建一个socket对象clientSocket作为客户端,并初始化;
S82.创建SOCKADDR_IN对象,绑定clientSocket的IP地址和端口号;
S83.使用socket中的connect函数来建立电脑端和Android设备端的连接,并检验连接是否成功,若其返回值为0则表示成功。
作为优选,还包括以下步骤:
S84.当电脑端与设备端的的socket服务连接成功,将电脑端待还原的文件读入缓存区;
S85.将读取的数据写入Android设备端所选择的分区;
S86.使用socket服务的send函数发送数据至已连接的端口,将数据写入在Android设备端所选择的分区地址。
作为优选,还包括以下步骤:
S87.当数据写入完成时,关闭socket连接,并返回还原镜像数据结束的信号。
作为优选,还包括以下步骤:
S9.数据写入完成后重新启动Android设备。
本发明的有益效果如下:
1.可直接将电脑端的镜像文件写入Android设备分区;
2.支持Android设备recovery模式下和正常模式下写入分区数据;
3.由于将Android设备和电脑端的待还原数据进行了比对,能确保待还原数据的有效性、匹配性。
综上所述:由于本发明是将镜像后的文件直接写入Android设备分区,可保证原始数据不会被破坏,因此可用于公检法部门避免在模拟分析嫌疑人手机数据过程中对原数据的破坏;也可用于个人在更换安卓设备(比如手机、平板)的数据移植,即先通过镜像将数据备份到其它的设备,比如电脑,再将镜像后的数据通过本发明的方法还原到新的安卓设备(手机、平板)。
附图说明
图1为本发明的总流程示意图。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明做进一步详细说明。
本文中的Android设备包括一切使用Android系统的电子产品。
一种安卓设备不介入SD卡还原系统及数据的方法,包括以下步骤:
S1.将Android设备通过USB数据线正确连接至电脑;
S2.检测Android设备是否处于root状态,若Android设备已经获取了root权限,则跳至S4进入正常模式,否则跳至S3;
S3.启动Android设备至recovery模式;
S4.在电脑端选择待还原的数据文件;
S5.进入Android设备的adb shell模式,使用cat、df、mount等指令集 来获取Android设备的所有分区信息,并在Android设备端选择需要被还原的分区;
S6.根据S5获取的分区信息筛选出需被还原的分区的文件系统、分区的大小、分区文件结构信息,并与在电脑端选择的待还原的数据进行对比,验证电脑端的数据文件与Android设备端的分区文件系统是否相同、分区大小是否一致、分区文件结构是否匹配,若验证成功则跳至S7,否则跳至S4;
S7.开启Android设备端socket服务,并将socket设置成监听模式以便其它设备连接;
S8.电脑端连接Android设备端开启的socket服务端口,通过该端口将电脑端选择的数据文件写入Android设备端所选择的需要被还原的分区;
S9.数据写入完成后重新启动Android设备。
其中,S7开启Android设备端socket服务具体过程是:
S71.创建自定义结构体AndroidRecoveryThreadPrameter的实例对象:
创建一个AndroidRecoveryThreadPrameter实例对象,在该对象中设置待还原的数据文件路径、Android设备的ID、建立连接的端口号、还原数据时开始地址等信息;
通过该结构体来实现Android设备端和电脑端通信通道的建立、数据传输的监听、数据传输过程的管控等操作,该结构体核心代码定义如下:
typedef struct AndroidRecovery hreadPrameter
{
string imgPhonePath;
string deviceid;
bool phoneCmdExit;//手机命令退出,退出后PC镜像读取线程也退出
HANDLE PCFinishedlMutex;//PC端镜像结束的信号量,用于返回
P_DATACallback callback;//回调函数
int tcpipPort;//Tcp_ip端口
INT64 startSector;
}AndroidRecoveryThreadPrameter。
S72.输入开启Android设备端服务的命令集:
使用AndroidRecoveryThreadPrameter的参数设置开启Android设备端服务的命令集;
S73.执行开启Android设备端服务的命令集:
通过在windows操作系统的dos下执行设置的命令集完成开启Android设备端服务,且开启监听模式,等待响应连接请求;
S74.返回执行结果并验证是否成功开启socket服务,若其返回值为0则表示成功,立即转入S8,否则转入S71。
其中核心代码如下所示:
AndroidRecoveryThreadPrameter*pThreadP=(Android Recovery Thread Prameter*)parameter;//创建结构体实例
sprintf(bufferCmd,"adb forward tcpip:%d tcpip:%d ",pThreadP->tcpipPort,pThreadP->tcpipPort);
sprintf(buffCmd,"/system/xbin/busy box nc-l-p%d-e dd of=%s ibs=512skip=%d",pThreadP->tcpipPort,pThreadP->imgPhonePath.c_st r(),pThreadP->startSector);//设置绑定端口,开启监听模式命令集 ret=excuteCommnadToBuffer(bufferCmd,pThreadP->m_hanle,buffer, buffersize);
ret=excuteCommnadToBuffer(buffCmd,pThreadP->m_hanle,buffer, buffersize);//开启Android设备端服务,等待连接
其中上述代码中的buffer和buffer size是用于接收数据的缓存区地址及其大小。
S8电脑端连接设备端开启的socket服务端口并写入数据的过程是:
电脑端连接socket服务的过程:
S81.创建一个socket对象clientSocket作为客户端,并初始化;
S82.创建SOCKADDR_IN对象,绑定clientSocket的IP地址和端口号;
S83.使用socket中的connect函数来建立电脑端和Android设备端的连接,并检验连接是否成功,若其返回值为0则表示成功。
具体的核心代码如下:
SOCKET clientSocket=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN clientsock_in;
clientsock_in.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//目标ip;
clientsock_in.sin_family=AF_INET;
clientsock_in.sin_port=htons(pThreadP->tcpipPort);//连接的端口
ret=connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR));//开始连接
上述代码中“127.0.0.0”为本机的IP地址,pThreadP->tcpipPort为S7中创建的Android Recovery Thread Prameter的实例中设置的socket端口号。
读取电脑端待还原的文件:
S84.当电脑端与设备端的的socket服务连接成功,将电脑端待还原的文 件读入缓存区;
S85.将读取的数据写入Android设备端所选择的分区;
S86.使用socket服务的send函数发送数据至已连接的端口,将数据写入在Android设备端所选择的分区地址。
该过程的核心代码如下:
ret=fread(pThreadP->fileHandle,buffer,buffersize);//读取镜像文件内容
if(ret<=0){break;}
ret=send(clientSocket,(char*)buffer,buffersize,0);//写入数据
上述代码中buffer和buffer size为存储读取电脑端待还原文件的数据内容的缓存区及其大小。
S87.当数据写入完成时,关闭socket连接,并返回还原镜像数据结束的
信号,其核心代码如下:
closesocket(clientSocket);
WSACleanup();
ReleaseMutex(pThreadP->PCFinishedlMutex);//释放信号量
实施例:
下面以将电脑端的c:\data.img文件还原至Android设备的data分区为例,具体介绍本发明描述的实现方案。
S1.正确安装与Android设备型号相对应的ADB驱动文件,将Android设备通过USB数据线正确连接至电脑;
S2.检测Android设备是否处于root状态,若Android设备已经获取了 root权限,跳至S4进入正常模式;否则跳至S3;
S3.启动Android设备至recovery模式,启动Android设备进入recovery模式可以通过ADB指令和Android设备上特殊按键组合这两种方式来完成;
S4.在电脑端选择待还原的数据文件,该数据文件是对Android设备进行镜像时产生的备份文件,在此例中电脑端选择文件c:\data.img做为待还原的数据文件;
S5.获取Android设备分区信息,在Android设备端选择需要被还原的分区,被选中的分区必须是与S4中所选择的数据文件高度完整匹配的分区,此例中选择的分区为Android设备的data分区;
S6.通过ADB指令来获取Android设备端需被还原的分区data分区的文件系统、分区的大小、分区文件结构等信息,并与在电脑端选择的待还原的数据c:\data.img进行对比,验证电脑端的数据文件c:\data.img中的文件系统、大小、文件结构是否与Android设备端的分区文件系统是否相同、分区大小是否一致、分区文件结构是否匹配,此例中在Android设备端所选择的分区是data分区,该分区是文件系统是ext4、分区大小为2375169kb、文件结构符合正常的Android设备的userdata分区的文件目录链结构,在电脑端选择的待还原的文件c:\data.img,解析该文件后得出该文件所包含的文件系统是ext4、文件大小为2375169kb、文件所包含的文件目录结构也符合正常的Android设备的userdata分区的文件目录链结构,在该例中验证Android设备端的分区和电脑端的文件是高度一致的;
S7.开启Android设备端socket服务;
创建自定义结构体AndroidRecoveryThreadPrameter的实例,通过该结构体来进行开启设备端的socket服务,该结构体定义如下:
typedef struct AndroidRecoveryThreadPrameter
{
string imgPhonePath;
string deviceid;
bool phoneCmdExit;//手机命令退出,退出后PC镜像读取线程也退出
HANDLE PCFinishedlMutex;//PC端镜像结束的信号量,用于返回
P_DATACallback callback;//回调函数
int tcpipPort;//Tcp_ip端口
INT64startSector;
}AndroidRecoveryThreadPrameter;
开启手机端socket服务的具体流程:创建自定义结构体
AndroidRecoveryThreadPrameter的实例对象;输入开启socket服务的命令集;执行开启socket服务的命令集;返回执行结果。其中核心代码如下所示:
AndroidRecoveryThreadPrameter*pThreadP=
(AndroidRecoveryThreadPrameter*)parameter;
sprintf(buffCmd,"/system/xbin/busybox nc-l-p%d dd of=%s
ibs=1024
skip=%d",pThreadP->tcpipPort,pThreadP->imgPhonePath.c_str(),pTh r eadP->startSector);
ret=excuteCommnadToBuffer(buffCmd,pThreadP->m_hanle,buffer, buffersize);
其中上述代码中的buffer和buffersize是用于接收数据的缓存区地址及 其大小。
S8.电脑端连接设备端开启的socket服务端口,通过该端口将电脑端选择的数据文件c:\data.img写入Android设备端所选择的data分区。
电脑端连接socket服务的过程:创建客户端socket对象clientSocket,服务端地址clientsock_in为请求连接做准备;设置请求连接的ip地址;设置电脑端请求连接连接设备端socket服务的端口;通过connect函数完成电脑端和Android设备端的socket连接。
具体的核心代码如下:
SOCKET clientSocket=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN clientsock_in;
clientsock_in.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//目标ip;
clientsock_in.sin_family=AF_INET;
clientsock_in.sin_port=htons(pThreadP->tcpipPort);//连接的端口
ret=connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR));//开始连接
上述代码中“127.0.0.0”为本机的IP地址,pThreadP->tcpipPort为S7中创建的Android Recovery Thread Prameter的实例中定义的socket端口号。
当电脑端与设备端的的socket服务连接成功,则通过socket建立的端口进行数据的写入,写入数据的过程:将电脑端待还原的文件读入缓存区;使用socket服务的send函数发送数据至已连接的端口。
该过程的核心代码如下:
ret=fread(pThreadP->fileHandle,buffer,buffersize);//读取镜像文 件内容
if(ret<=0){break;}
ret=send(clientSocket,(char*)buffer,buffersize,0);//写入数据
上述代码中buffer和buffer size为存储读取电脑端待还原文件的数据内容的缓存区及其大小。
当数据写入完成时,关闭socket连接,并返回还原镜像数据结束的信号,
其核心代码如下:
closesocket(clientSocket);
ReleaseMutex(pThreadP->PCFinishedlMutex);//释放信号量
S9.数据写入完成后重新启动Android设备。
本领域的普通技术人员将会意识到,这里所述的实施例是为了帮助读者理解本发明的实施方法,应被理解为本发明的保护范围并不局限于这样的特别陈述和实施例。本领域的普通技术人员可以根据本发明公开的这些技术启示做出各种不脱离本发明实质的其它各种具体变形和组合,这些变形和组合仍然在本发明的保护范围内。