按键精灵手机助手找回素材

事故缘由:

手机游戏有更新,这个脚本之前一直运行良好,所以客户也没有问题反馈,所以一直没有更新,今天那款游戏有比较重要的更新,所以只能更新了。

不然对不起客户的付费。

因为按键精灵手机助手连接不到模拟器,所以卸载重装试试能否连接上。注意了,这里我有备份脚本源码。

但是却忘了备份脚本素材,就是图片素材。

这个脚本的编写花费了十多个小时,其中包含四五十张图片,说实话我真的有点方,和烦,郁闷。

因为没有图片素材,意味着脚本没法识别图片进而做出下一步操作,一整个脚本都废掉了。

我可没有心思重新截取游戏的五六十张图片。。。这样无异于重写。

但是,但是,注意了,方并不能解决问题。

后来想了下,有已经编译好的apk,能不能从这里面找回还原所有图片呢?

于是提取解压apk文件,发现

0b1707733064cb9f41ab75fbe85bde38be4.jpg

a021599da45aefe3d29a18ecbee41f49ffa.jpg

我为什么能确定是这个文件呢?

思路就是,你添加一张小图片的素材,打包apk,

然后添加一张超大图片的素材,打包apk,你会发现这个文件是增大的。

所以可以肯定我的素材在里面。

 

但是到这里只能确定素材在里面,万一素材有加密呢。

 

提取script.atc文件,里面的内容无疑是二进制文件。。。用notepad++打开

发现下面内容:

 

0f6c31448e7a20f9b96aa0775598080b1cf.jpg

 

乱码是肯定的,我有心理准备

 

下面怎么从这堆乱码中确定是否有素材。关键点来了

同样的截取一张小图片,打包apk,提取上面所述的文件

然后比对图片的二进制代码和script.atc的二进制代码

 

9a2711c888132e758d542d58eafb1934ecc.jpg

素材图片的开头是8950 4e47 0d0a

d2b8afa7ac2345dcfd89bf71681364bd104.jpg

 

可以发现都是吻合的,一直到图片的结尾。

这样我们可以确定图片素材没有加密。

 

接下来就是怎么提取图片了?

 

算法是这样的,中文解释就是假设一段文字是这样的:

 

文字文字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;
    }

 

图片找到然后保存到磁盘,大功告成!!

8ab5eeb8efec8b785dab5f8c75e9d4a06fc.jpg

 

这里有人可能问图片素材的名字怎么确定?

仔细观察script.atc文件里面

6cd4b2fdd6fa8107aea1b852d21dd1304c3.jpg

可以发现在图片文件前面紧跟着图片的名字

那么同理只要抽取出Attachment开头.png结尾的字符内容即可。

然后匹配最近的图片位置,就能对应上了。

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/zxcholmes/blog/1846002

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值