首页
社区
课程
招聘
编程查找MTK手机里的图片、铃声,文字资源
发表于: 2009-7-26 21:26 19629

编程查找MTK手机里的图片、铃声,文字资源

2009-7-26 21:26
19629

编程查找MTK手机里的图片、铃声,文字资源

  当初以为可以学习嵌入式的东西,(不过还好了,电路的东西学不会,数学又太高深了)结果刷了一段时间手机,这个程序就是我在刷机的时候写下来的。为了写这个东西,我专门花时间看了MID,WAVE,GIF的格式,主要就是看怎么找出他们的开始位置和大小。

【铃声】
   声音文件的格式有很多种,比如MID,WAVE,MP3等。
  【1】WAVE文件的简略格式:
  ID:   4 BYTES  'RIFF'   --固定RIFF开头的
  size: 4 bytes           --是wave音乐文件的大小,不包括ID和size在内
  TYPE  4 bytes   'WAVE'  --类型

  以下是我自己写的查找WAVE的代码片段:

  if find(addr, filesize, addr, riff, 4) = 0 then break;     //find 是我自己写的查找函数。
        mem.Position := addr + 1; //指向下一个位置
        waveaddr := addr - 3; //记录WAVE开始位置
        mem.Read(wavesize, 4);
        wavesize := wavesize + 8;
        mem.Read(buf, 4);
        if (buf = $45564157) and (wavesize < $100000) then
        begin //比较是不是WAVE
          music[j] := waveaddr;         //保存开始位置和大小
          inc(j);
          music[j] := wavesize;
          inc(j);
        end;
        application.ProcessMessages;
      until addr >= filesize - 10;

   【2】MID文件的简略格式
    "MThd"+00000006+fffff+nnnn+dddd
    固定以"MThd"开头,06 是总是06,描述的是f,n,d所占的字节数,NNNN是轨道数.
    接下来就是轨道了,固定以"MTrk"开头,接下来的四个字节描述了该轨道的大小,不包括"MTrk"和本身的四个字节.
   
  以下是我自己写的查找WAVE的代码片段:
      repeat
        if find(addr, filesize, addr, mthd, 4) = 0 then leave := true;
        mem.Position := addr + 1;
        midaddr := addr - 3; //记录mid文件开始位置
        mem.Read(buf, 4);
        if redword(buf) <> $06 then break;
        mem.Read(temp, 2);
        if reword(temp) > 2 then break;
        mem.Read(temp, 2);
        if reword(temp) > 20 then break;
        i := reword(temp); //记录轨道数
        count := i;
        mem.Read(temp, 2);
        if temp = 0 then break;
        midsize := 0;
        repeat
          mem.Read(buf, 4);
          mtrk := buf;
          ok := false;
          if mtrk <> $6B72544D then ok := true;
          mem.Read(buf, 4); //读取一个轨道的大小
          midsize := midsize + redword(buf); //累加
          mem.Position := mem.Position + redword(buf);
          i := i - 1;
          if ok = true then break;
        until i = 0;
        midsize := midsize + $E + (count * 8);
        if (ok = false) and (midsize < $100000) then
        begin
          music[j] := midaddr;
          inc(j);
          music[j] := midsize;
          inc(j);
        end;
        application.ProcessMessages;
   until (addr >= filesize - 10) or leave = true;
【图片】
   图片我主要看了gif的文件格式,大小还真的是不好确定。
   89a版的GIF文件才支持动画
   固定以 gif89a开头
   接着就是逻辑屏幕描述块,图像描述块,图像压缩数据,图像控制块等,都有相应的开头和结束标记,可以baidu一下
   GIF文件最终以3B结尾。

以下是我的代码片段:
      repeat
      if find(addr, filesize, addr, gif, 6) = 0 then break;
      gifaddr := addr - 5; //gif的地址
      mem.Position := addr + 1;
      mem.Read(temp, 2);
      if temp > $140 then continue;
      mem.Read(temp, 2);
      if temp > $140 then continue;
      mem.Read(n, 1);
      gifsize := 13;
      if (n and $80) > 0 then //判断有没有全局颜色列表
      begin
        m := (n and 15) + 1;
        d := mypower(2, m);
        gifsize := gifsize + d * 3;
      end;
      mem.Position := gifaddr + gifsize;

      while true do
      begin
        mem.Read(n, 1);
        if n = $21 then
        begin
          mem.Position := mem.Position + 1;
          mem.Read(n, 1);
          gifsize := gifsize + n + 4;
          mem.Position := gifaddr + gifsize;
          continue; //继续下一次循环
        end;
        if n = $2C then
        begin
          mem.Position := mem.Position + 4;
          mem.Read(temp, 2);
          if temp > $140 then continue;
          mem.Read(temp, 2);
          if temp > $140 then continue;
          mem.Read(n, 1);
          gifsize := gifsize + 11;
          if (n and $80) > 0 then //判断有没有局部颜色列表
          begin
            m := (n and 15) + 1;
            d := mypower(2, m);
            gifsize := gifsize + d * 3;
          end;
          mem.Position := gifaddr + gifsize;
          continue; //继续下一次循环
        end;

        if (n <> 0) and (n <> $21) and (n <> $2C) and (n <> $3B) then
        begin
          while true do
          begin
            gifsize := gifsize + n + 1;
            mem.Position := gifaddr + gifsize;
            mem.Read(n, 1);
            if n = 0 then
            begin
              gifsize := gifsize + 1;
              break;
            end;
          end;
          mem.Position := gifaddr + gifsize;
          continue; //继续下一次循环
        end;

        if n = $3B then
        begin
          gifsize := gifsize + 1;
          if gifsize < $10000 then
          begin
            giftable[i] := gifaddr;
            inc(i);
            giftable[i] := gifsize;
            inc(i);
            break;
          end;
          if gifsize > $10000 then break;

        end;
      end;

    until addr - 10 > filesize;
【文字】
    MTK手机里的汉字是以UNICODE格式直接保存的。
    可以从Ok开始的位置查找。这个是和手机对比之后发现的。
    附件里的
    function UnicodeToAnsi(SubUnicode: string): string; //是将unicode码转换为汉字的函数
     程序写完后,测试结果和之前猜想的一样,MTK的资源是没有经过变换,直接存储到FLASHE里的。

以上是我以前刷机的时候做的一点小研究,附件里的代码可是我真正刚开始学习DELPHI写下的,可以说是处女show,不过一直没做过修改。
觉得挺好玩的就发上来,可以找出图片,声音,和文字,或许还有其他格式的。。。不过需要仪器把手机里的flash中的内容读到电脑上,没有仪器的可以百度"MTK字库下载"玩一下。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 383
活跃值: (41)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
2
http://bbs.80x86.com/viewthread.php?tid=70&extra=page%3D1发到这里的都没人看,就转过来吧
2009-7-26 21:27
0
雪    币: 177
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
很强大呀
占座学习
2009-7-26 23:02
0
雪    币: 383
活跃值: (41)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
4
http://www.skycn.com/soft/52212.html这里有现成的可以下载,界面和代码做了一些优化,不过没有用多线程,会很卡,去掉了查找文字的功能,不过代码删掉了,没保存
2009-7-27 10:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
怎么用呀?能否修改手机里面自带的铃声?

mtk手机的自带铃声很垃圾,想删除却不知道怎么弄。

自定义铃声只有5首,能替换自带的就好了。

可是不知道楼主的附件怎么用~@@~
2009-7-28 13:30
0
雪    币: 383
活跃值: (41)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
6
修改后要用仪器把它刷进手机了,不过修改后容易导致不开机吧,我改了几个再刷,结果手机开不了拉
2009-7-29 12:56
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
铃声是在二进制文件里可以替换的。
还有就是刷机开不了机是因为以前的系统被加密了
被你读出来后再刷进去后是开不了机的
2009-7-31 09:00
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主你好,对于MTK平台,一般的图片是不会加密或优化的,但对于开机Logo图片那张,有些平台是会做优化的,就是去掉图像文件头,把图像数据直接保存到一个数组中,这些是在编译时期完成的,然后把生成的ROM文件(BIN)烧进手机后,手机开机时只要把ROM中的图片信息直接copy进RAM就可以运行了,不用进FS(文件系统),开机速度也快,不知道LZ对这张图片怎么找?我试过N多MTK资源修改软件了,这张图片始终找不到。
像以上这种情况,就像LZ说的,烧写的ROM文件肯定做过优化,BIN大小才8M多,正常的应该在16M左右。另外,优化过的BIN文件字符串也是找不到的。用直接找".O.k.."的方法是行不通的。
楼主是否在这方面有研究过?是否有好的解决方法。

PS:回复楼上的楼上,刷机后不开机一种原因是你修改后的资源比原始的太大,覆盖掉了有用的代码;另外一种就是楼上所说的你DL的BIN已被加密过了。其实你可以用WinHex打开BIN文件直接替换,按LZ给你的特征字符就可以。
2009-8-1 09:51
0
雪    币: 383
活跃值: (41)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
9
对你说的这些,都没研究过,也不知道该怎么研究...我看你研究的比我还多,我现在都不玩这些了,当初好不容易学会几条arm指令,现在都忘记完了....
2009-8-3 12:00
0
雪    币: 208
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
先看源代码,再反汇编跟进,只要找准了一款,下一款就好办了!
2009-8-14 10:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
下载来看看,受教~~嘿嘿
2009-8-31 17:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
楼上各位大虾,有办法提取文件里的显示屏驱动吗?
2010-1-31 23:33
0
雪    币: 177
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好好学习,写的不错。。。。
2010-5-12 11:39
0
雪    币: 4729
活跃值: (4669)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
很好,学习啦
2010-6-5 21:01
0
雪    币: 274
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
学习···了
2010-6-7 10:07
0
雪    币: 4729
活跃值: (4669)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
看不懂,,不过学习了!
2010-6-9 22:03
0
游客
登录 | 注册 方可回帖
返回
//