事故缘由:
手机游戏有更新,这个脚本之前一直运行良好,所以客户也没有问题反馈,所以一直没有更新,今天那款游戏有比较重要的更新,所以只能更新了。
不然对不起客户的付费。
因为按键精灵手机助手连接不到模拟器,所以卸载重装试试能否连接上。注意了,这里我有备份脚本源码。
但是却忘了备份脚本素材,就是图片素材。
这个脚本的编写花费了十多个小时,其中包含四五十张图片,说实话我真的有点方,和烦,郁闷。
因为没有图片素材,意味着脚本没法识别图片进而做出下一步操作,一整个脚本都废掉了。
我可没有心思重新截取游戏的五六十张图片。。。这样无异于重写。
但是,但是,注意了,方并不能解决问题。
后来想了下,有已经编译好的apk,能不能从这里面找回还原所有图片呢?
于是提取解压apk文件,发现
我为什么能确定是这个文件呢?
思路就是,你添加一张小图片的素材,打包apk,
然后添加一张超大图片的素材,打包apk,你会发现这个文件是增大的。
所以可以肯定我的素材在里面。
但是到这里只能确定素材在里面,万一素材有加密呢。
提取script.atc文件,里面的内容无疑是二进制文件。。。用notepad++打开
发现下面内容:
乱码是肯定的,我有心理准备
下面怎么从这堆乱码中确定是否有素材。关键点来了
同样的截取一张小图片,打包apk,提取上面所述的文件
然后比对图片的二进制代码和script.atc的二进制代码
素材图片的开头是8950 4e47 0d0a
可以发现都是吻合的,一直到图片的结尾。
这样我们可以确定图片素材没有加密。
接下来就是怎么提取图片了?
算法是这样的,中文解释就是假设一段文字是这样的:
文字文字abcdkk567jkdlfg文字文字文字文字
文字文字文字文字他们文字文字文字文字文字文字
他们他们他们abcd520ytjkdlfg文字他们文字文字文
这里abcd是这段图片的开头编码,所有png图片的开头编码是一样的
jkdlfg是这段图片的结尾编码,中间是图片的像素信息。
那么算法就是找出所有abcd开头和jkdlfg结尾的一段文字,这段文字就是图片素材的信息。
接下来就是编码了:
从byte数组中找出开头结尾的byte数组就是图片了。
public static class ByteArray{
byte[]target;
int startIndex;
int endIndex;
}
public List<ByteArray> findBytes(byte []src, byte[]startByte,byte[]endByte){
List<ByteArray> result=new ArrayList<>();
byte [] tempForStart = new byte[startByte.length];
byte [] tempForEnd =new byte[endByte.length];
int startIndex=-1;
for(int i=0;i<src.length;i++){
if(startIndex==-1&&i+startByte.length<=src.length){
System.arraycopy(src,i,tempForStart,0,startByte.length);
if(Arrays.equals(tempForStart,startByte)){
startIndex = i;
}
}
if(startIndex!=-1&&i+endByte.length<=src.length){
System.arraycopy(src,i,tempForEnd,0,endByte.length);
if(Arrays.equals(tempForEnd,endByte)){
byte [] target =new byte[i+endByte.length-startIndex];
System.arraycopy(src,startIndex,target,0,target.length);
ByteArray byteArray =new ByteArray();
byteArray.startIndex = startIndex;
byteArray.endIndex = byteArray.startIndex+target.length;
byteArray.target = target;
result.add(byteArray);
startIndex = -1;
}
}
}
return result;
}
图片找到然后保存到磁盘,大功告成!!
这里有人可能问图片素材的名字怎么确定?
仔细观察script.atc文件里面
可以发现在图片文件前面紧跟着图片的名字
那么同理只要抽取出Attachment开头.png结尾的字符内容即可。
然后匹配最近的图片位置,就能对应上了。