爱技术

 找回密码
 注册会员

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 9189|回复: 85
收起左侧

【专题文章】西门子6688Flash修改入门的入门

[复制链接]
发表于 2005-8-10 00:00:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册会员 微信登录

x
西门子6688Flash修改入门的入门
Jewes
看到很多机友都想为小8的DIY贡献一点自己的力量,可是苦于文科出身,狼大的《Flash修改入门》又有点深奥,现在我就在放假回家之前把我的理解写出来和大家一起分享(因为回家后只能拨号上,当然不能经常来论坛)希望能给大家一点帮助,能有更多的朋友加入到小8的修改中,让小8精神发扬光大!
一、小8的内存情况
以前经常都听说要在6M的FullFlash前填充10M的内容,可能很多机友还不明白是怎么一回事。请看下面的图:
[upload=jpg]UploadFile/2003123113385467581.jpg[/upload]
首先,小8的CPU能访问的地址空间是16M,大家知道计算机的内存分为RAM和ROM,RAM就是可以随时读取的写入的,ROM通常情况下只能读出,在一定条件下才能写入(这就是为什么要关机刷补丁的原因)。小8RAM包括了CPU内部的寄存器,内部RAM, 特殊功能寄存器SFR等,这些全部排在低位地址空间。小8的ROM包括了FlashROM和EEPROM总共6M,放在高位空间,就是16M地址空间的最后6M空间里面,这样有什么好处呢?比如现在我想为小8升内存(增加RAM),把它升级成X6688,如果我们把以前ROM直接放在了RAM的后面,增加RAM必然要影响到后面的ROM,因此就采用了占用两头,中间不用的办法。但是在程序设计的时候,仍然是按照16M的地址来使用的,比如访问ROM的第一个单元里面的数据的时候,仍然是按照用A00000地址来访问的,因此我们在反汇编6M的FullFLash的时候,要先把16M的地址空间添满,这样程序在执行跳转指令的时候才不会出错。
二、IDA反汇编的步骤和设置
现在我们就来把6M的FullFlash反汇编来看看。首先打开IDA如下:
[upload=jpg]UploadFile/2003123113393780849.jpg[/upload]
点击File->OpenFile,选择一个FullFlash文件,如下图:在Processor Type选择C166,这里没有什么好说的,点击OK进入下一步
[upload=jpg]UploadFile/2003123113402916958.jpg[/upload]
重要的一步:填充10M的空间,如图设置,在这里我们把前面的10M空间都作为小8的RAM,这样,16M地址空间就满了,点击OK,等上一段较长的时间,喝杯茶,上个厕所,就差不多了!在这个过程当中,要出现两个提示,不用理会它,直接点OK跳过就行。大家仔细分析一下下图的设置,在理解一下小8内存的情况,想想其中的道理。在InputFile的那个地方,Loading Address,就是把文件放到从A00000开始的地方,Fileoffser:文件的偏移量就是从文件的哪个地方开始读取,size当然就是读多少了。
[upload=jpg]UploadFile/2003123113412772834.jpg[/upload]
大家可以分析一下,如果是3618的8MFlash,改怎么设置,这就作为一个练习题目吧:)大家接下来就可以看看狼大的Flash修改入门了。看了以后再接着看后面的内容!

三、汇编程序的执行过程
当我们打开IDA后,可以看到很多指令,小8的运行就是不断执行这些指令的过程,小8是顺序、依次执行的,除非遇到跳转指令,但是小8是不可能无限执行这些指令的,因为指令是有限的(不知道能否理解,懂的人不要笑哈:)。因此在执行到一定时候会形成一个死循环,在这个循环中等待用户的输入或者外部事件的发生来打破这种死循环的局面,这就是所谓的中断。在小8中,这种死循环就是待机时候所处的状态(不完全正确),当你按了一个键或者有人Call你,或者定时时间到,这些就会打断这种循环的局面,从而转到相应的地方去处理,这些地方是预先定义好的中断入口地址,在那里去处理这些中断。(没有中断概念的可以去找点相关书来看看,我这里只是给点初步的印象,因此有些地方不是很严谨!)
四、一个简单例子
刚才我们讲到了死循环,现在我们来看看整点报时的例子。首先找到IDLE_ICON_PROCESS这个函数,地址:D637C8(至于如何找到这个函数的,那是因为我们站在巨人的肩上),根据名字就可以知道是待机时的图标处理,在待机状态是一直要执行的,同时在通话时也要执行的。在D637C开始的地方可以看到以下代码(为什么我看到的是88908880这些数字呢,你在那里按一下C,再看看出现什么了?不要笑哈:)
mov     [-r0], r9
mov     [-r0], r8                //保存寄存器
sub     r0, #0Ch                //因为我们这里是一直要执行的,所以我们就把代码添加到这里来,但是这里空间已经被占用了,怎么办?当然是先跳转到一个没有用的空间,然后我们在那里写了一个子函数,来处理。我们找了一个没有用的空间,写了以下代码
注:我反汇编的是最原始的整点报时的版本,用的情景模式3来控制使用与否的
ROM:BF0BC0        extp    #0Dh, #2
ROM:BF0BC4        movb    rl4, byte_364A4//得到情景模式3的数据
ROM:BF0BC8        mov     r2, word_365DC//取得系统时间的分钟
ROM:BF0BCC        jb      r4.4, loc_BF0BF4//如果没有选择
ROM:BF0BD0        cmp     r2, #0//如果是分钟数是0,表示到了整点
ROM:BF0BD2        jmpr    cc_NZ, loc_BF0BEA
ROM:BF0BD4        extp    #11h, #1
ROM:BF0BD8        movb    rl4, byte_47840//用来判断是不是已经响过了,防止不停地响
ROM:BF0BDC        cmpb    rl4, #1
ROM:BF0BDE        jmpr    cc_NZ, loc_BF0BF4
ROM:BF0BE0        mov     r12, #1// PlayWarningToneWhenOpen的参数,可以改成其他的来试试
ROM:BF0BE2         calls   0B5h, PlayWarningToneWhenOpen
ROM:BF0BE6         mov     r4, #0
ROM:BF0BE8         jmpr    cc_UC, loc_BF0BEC
ROM:BF0BEA ;
ROM:BF0BEA
ROM:BF0BEA loc_BF0BEA:                           
ROM:BF0BEA                 mov     r4, #1
ROM:BF0BEC loc_BF0BEC:                             
ROM:BF0BEC                 extp    #11h, #1
ROM:BF0BF0                 movb    byte_47840, rl4
ROM:BF0BF4 loc_BF0BF4:                             
ROM:BF0BF4                 sub     r0, #0Ch//因为我们占用了刚才那条指令,所以要补回来
ROM:BF0BF8                 rets
由上可以很清楚地知道补丁的写法了,在IDLE_ICON_PROCESS的sub r0,#0ch处,改成calls BF0BC0,就这样,简单吧,如果对其中的一些指令不是很明白,先看看软件下载中的指令集。其实常用的就 Mov ,call ,ret,rets,jb,jnb,extp,jmp。这里讲一下extp,因为小8是段页是存储,简单地讲就是这个意思,比如我当前是在31f 这个页,我要去访问37页里面的数据,直接访问是不行的,就要用extp #37h,#1先切换到37页,其中的1表示extp指令后的一条指令是在37页内执行,最多可以取4。也许你要问当前在31f页是什么意思,就是说,你当前的程序是在31F*4000=C7C000这个地址以及以后的64k范围内。看了上面的程序,也许大家可以看到现在所要执行更多的指令,也许耗电量会增加(还有待考证)。
大家一定要多看看狼大的Flash修改入门,可以说我们很多人都是从那里走上小8的修改之路的,是我们修改的教材。

Redbean注:相关链接
@. 【专题文章】西门子Flash修改入门
@. 【程序修改】修改IDA程序以适合中文C166
@. 【专题文章】如何用UltraEdit构建Patch开发环境
@.Coollang—西门子手机修改进阶
























【专题文章】西门子6688Flash修改入门的入门

【专题文章】西门子6688Flash修改入门的入门

【专题文章】西门子6688Flash修改入门的入门

【专题文章】西门子6688Flash修改入门的入门

【专题文章】西门子6688Flash修改入门的入门

【专题文章】西门子6688Flash修改入门的入门

【专题文章】西门子6688Flash修改入门的入门

【专题文章】西门子6688Flash修改入门的入门
 楼主| 发表于 2005-8-10 00:01:00 | 显示全部楼层
五、关于DramImagebyIndex的使用
在狼大的教程中已提到了这个函数,我再说说坐标是怎么确定的,主要是为了照顾文科出身的机友,小8的屏幕是101*80,单位是像素,如图:
[upload=jpg]UploadFile/20041921335598854.jpg[/upload]
(图中红色的部分表示要显示的图片)
屏幕的左上角是坐标原点(0,0),小8显示图片时,坐标是图片的左上角和屏幕的左上角的相对位置,比如我要把一张47*14的图片分别显示在四个角时,坐标该怎么确定呢?
左上角:当然是(0,0),右上角是(101-47,0)
左下角:(0,80-17),右下角(101-47,80-17),看看图就知道了!
六、常用汇编指令的讲解
    这篇文章是写给一些以前没有汇编经验的机友,所以我这里还是简单讲一下汇编语言。我们知道CPU只能执行0、1这中机器代码,CPU先在ROM中取得0,1代码(取指),然后对它译码(比如某个顺序排列的01是什么含义),然后在执行。在计算机发展的初期,程序员写程序都是用这种代码来写,可以想象用01来写程序的难度和查错的难度,于是汇编语言就在这种情况下诞生了,它用一些很熟悉的英文单词来代替01代码,比如用add r1,#1来代替0811(16进制数)表示把r1加上1。这样在程序的编写和查错上就比以前方便了。当程序写好后,在用汇编程序把我们写的代码汇编成01代码。掌握一门汇编语言关键是有两点:1、寻址方式,2.指令系统。在我们的小8修改中,寻址方式和指令有很多,但是常用的不多。
1.寻址方式
小8中的常用的寻址方式用以下几种:
a.立即数寻址
比如mov r1,#1h 中的#1h就表示立即数寻址,表示把1这个数放到r1当中去,就是在前面加一个#就表示立即数。
b.间接寻址
什么叫间接寻址呢?比如,先把一个地址放在了一个寄存器中或一个存储器单元中,举个例子来说吧
mov r1,#420h  //把420h送到r1中去
mov r3,[r1]   //再把当前页420h中的内容送给r3
以上两句和下面等价
mov r3,420h//注意这里没有#号
类似的mov r2,[r1+]//先把r1对应的内存单元的数据送到r2中,自己在加2(为什么是2呢?因为r1是16位的)
严格地讲这个应该分开成两种寻址方式的,我这里为了理解上方便就和在一起了。大家注意上面我为什么要说是把当前页420h送到r1中,因为C166是段页式存储,象mov指令只能在当前页中工作,要用到其他页里面的数据,就要用extp指令切换到需要的页中去。在小8的程序研究中主要就是这两种寻址方式。
2.关于指令系统
我想常用的mov add sub我就不说了,我重点讲一下跳转指令,在c166中,我们常用到的跳转指令用两种,一种是无条件跳转jmps,一种是有条件跳转。无条件跳转,顾名思义就是程序执行到这个地方就转到另外的地方去了,该跳转指令后面的程序就不执行了,而条件跳转就是说,在条件满足的情况下,才跳转。因此在这种指令的前面一般都有一些判断或者mov指令。比如
cmp r4,#1 //这里就是说先判断r4和1的关系
jmp cc_z,out//如果r4=1,则跳转到out这个地方去。
其实实际上跳转指令的判断调件是判断CPU中的状态寄存器(PSW)中的相关位,如果相应的位满足条件就跳转,但是在实际的应用中,我们通常是用一些指令的执行来改变PSW的位,比如上面的cmp r4,#1h,它的含义是用r4减1,结果不存入r4中,只把相应的情况反映到PSW中,其中就有r4-1是不是为0,有没有借位,有没有溢出等。因此应当注意影响PSW的指令,看到cmp,mov add,sub就要注意后面的跳转指令了。
常用的条件判断有cc_z,cc_SGT, cc_nz,cc_ULT等
更多请查阅汇编手册。注意cc_uc是无条件,它和jmps的区别在于跳转的距离,jmps可以在16M的空间内到处跳,而前者的范围要小一些。
七、我结合背景灯和锁定键盘图标2in1来做个总结
    先说一下思路,以前狼大有个补丁是增加待机时的背景灯显示,现在我们的要求是:
                 开灯         关灯
锁定键盘   显示159h    显示15eh
没有锁定   显示158h    什么都不显示
159h,158h,15eh分别表示三张图片的ID,158h表示单独的背景等图标,159h是整合了锁定键盘图标和背景灯的图标,15eh是单独的锁定键盘的图标。
因此我们要在狼大以前的补丁基础上,增加以下内容,在以前显示的背景灯的时候,先判断是不是锁了键盘,如果锁定就不显示158h号图片。在处理锁定键盘的地方,先判断是不是开了灯,如果开了灯就显示159h号图片,如果没有开灯则显示原来的15eh号图片。结合狼大的Flash修改入门和用UltraEdit搭建小8开发环境,看以下的就没有什么问题了。
$Segmented
$Mod167

;Some Function
DramImagebyIndex EQU 0xB3DF04
GetLightState    EQU 0xD9EB4E
isLockA                 EQU 0xA37780   
isLockB                 EQU 0xD1BAA4
;SOme Address
PatchBegin  EQU 0x27e090

patch section code word AT PatchBegin

  fun1 proc far
  ;Add your Code Here
   calls   seg(isLockA),sof(isLockA)
   cmp r4,#0
   jmp cc_Z,lock
   calls  seg(isLockB),sof(isLockB)
   cmp r4,#0
   jmp cc_z ,unlock
   lock:mov r4,#0
   jmp cc_uc,return
   unlock:
   calls seg(GetLightState),sof(GetLightState)
   return:rets
  fun1 endp
  
  fun2 proc far
   calls seg(GetLightState),sof(GetLightState)
   cmp r4,#1
   jmp cc_z,lighton
   mov r9, #15Eh
   jmp cc_uc,out
   lighton:
   mov  r9,#159h
   out:rets
   fun2 endp

patch ends
End

以下是Falsh修改的最基本原理图,一般就是在原来程序的某个地方加上一个跳转指令,增加一些新的代码来实现新的功能,然后在返回,当然也可以在原来的基础上修改,但这要看实际情况而定。
[upload=jpg]UploadFile/20041921343061127.jpg[/upload]
关于怎么找到一个函数的地址,这个是我们修改的一个重点和难点,当我们知道了函数地址后,谁都可以做补丁,可以多看看现有的补丁,可以从中得到一些信息,哪怕是一个很不起眼的补丁都可能隐藏有信息,在现有的基础上多分析和猜测试验,研究小8最大的乐趣就是看懂里面的某段代码的含义。
最后,感谢你能看到这里,其中有些东西表述不是很严谨,我们可以继续讨论,希望对大家有所帮助,祝大家春节快乐,可不能因为小8而影响和家人,朋友,爱人的团聚哦:)
(全文完)
Jewes 2004/1/9




[此贴子已经被作者于2004-1-9 21:53:33编辑过]

发表于 2005-8-10 00:02:00 | 显示全部楼层
顶,等考完试好好看看~~~
发表于 2005-8-10 00:03:00 | 显示全部楼层
我靠。。。这个不顶怎么行。。。。。
最好能举一个简单的补丁例子。把做补丁的过程写一下
我就是不太懂地址中的那些字母和数字代表什么
用软件打开了Flash,全是数字和字母,我从哪下手!。。谢谢
发表于 2005-8-10 00:04:00 | 显示全部楼层
我也要学!
发表于 2005-8-10 00:05:00 | 显示全部楼层
好文章!
记住在写补丁时,地址要转换回来.
看一个3618的实例(摘自整点报时),给新手看的
0x704168: E6F9FFFF DAFDB01A
0x7D1AB0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D7404200F3FCFC3ED7404000F2F98C2F

回答顶楼的问题,F-7=8
X618的设置:
[upload=jpg]UploadFile/20041178494420600.jpg[/upload]
恭喜你,回答正确!



















[此贴子已经被作者于2004-1-17 8:50:33编辑过]

发表于 2005-8-10 00:06:00 | 显示全部楼层
没有你说的芯片类型
发表于 2005-8-10 00:07:00 | 显示全部楼层
以下是引用长公子威在2003-12-31 13:57:31的发言:
好文章!
记住在写补丁时,地址要转换回来.
看一个3618的实例(摘自整点报时),给新手看的
0x704168: E6F9FFFF DAFDB01A
0x7D1AB0: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF D7404200F3FCFC3ED7404000F2F98C2F

回答顶楼的问题,F-7=8

恭喜你,回答正确!
我实在是不知如何下手。。我不懂你这个正点报时补丁,这一串的字母和数字。怎么看出来时正点报时呢??



发表于 2005-8-10 00:08:00 | 显示全部楼层
好,爱小8的就要学
发表于 2005-8-10 00:09:00 | 显示全部楼层
没看源程序,但可以大致解释一下(如果不对,还请高手们指正),第一句的意思是在整点时转移执行该地址(FDB01A)的子程序(或函数),0x7D1AB0及其后面的代码(后面还有几行),是转换为HEX的程序行,大致的意思是,在整点时选择某一个声音,通过扬声器发出来。
发表于 2005-8-10 00:10:00 | 显示全部楼层
以下是引用长公子威在2003-12-31 14:19:23的发言:
没看源程序,但可以大致解释一下(如果不对,还请高手们指正),第一句的意思是在整点时转移执行该地址(FDB01A)的子程序(或函数),0x7D1AB0及其后面的代码(后面还有几行),是转换为HEX的程序行,大致的意思是,在整点时选择某一个声音,通过扬声器发出来。

我用HEX软件打开了Flash。太多了。。滚动条都拉了半天
要改一个补丁怎么下手?
用HEX打开Flash以后,就以整点报时为例,我应该第一步怎么做?
谢谢
发表于 2005-8-10 00:11:00 | 显示全部楼层
早着呢,还没到我这一步呢,第一步应该看顶楼的贴子,然后把FULLFLASH反汇编了,然后看COOLLANG的文章,找出你需要的可能调用的函数的入口。
发表于 2005-8-10 00:12:00 | 显示全部楼层
这是个好贴啊`!一定要顶~!

发表于 2005-8-10 00:13:00 | 显示全部楼层
再有问题我就不回答了,再回答我也不会了:)让他们(那些补丁高手)来回答吧!
现在没有太多的精力和能力做更深的研究。
现在在论坛的工作就是尽量给大家提供一个稳定的,高容量和高质量的交流空间。

要是早几年,*^_^*(脸红的说),也许还可以,也许也会成为一代大侠。





[此贴子已经被作者于2003-12-31 14:44:55编辑过]

发表于 2005-8-10 00:14:00 | 显示全部楼层
移植补丁理论上相对容易一些,简单的说(可能做起来不会象说的这么容易),反汇编大侠们编好的代码,把函数地址换成我们所用手机FLASH中的对应函数地址,然后再转为HEX。

coollang和SL456688I及一些高手受人尊敬的原因是,他们都有许多自己的原创。

在这个贴子后跟这么多贴,并且设为总置顶的原因,就是希望更多有这方面爱好,而且又有能力的人加入到开发我们手机的行列!


[此贴子已经被作者于2004-1-5 16:20:48编辑过]

发表于 2005-8-10 00:15:00 | 显示全部楼层
如此好帖,占个位子先!
发表于 2005-8-10 00:16:00 | 显示全部楼层
以下是引用GRIT-B在2003-12-31 13:51:11的发言:
**。。。这个不顶怎么行。。。。。
最好能举一个简单的补丁例子。把做补丁的过程写一下
我就是不太懂地址中的那些字母和数字代表什么
用软件打开了Flash,全是数字和字母,我从哪下手!。。谢谢

用“unicode”工具软件自己转换就是了
发表于 2005-8-10 00:17:00 | 显示全部楼层
精华啊
PF
发表于 2005-8-10 00:18:00 | 显示全部楼层
以下是引用sleepyman在2003-12-31 15:20:54的发言:
[quote]以下是引用GRIT-B在2003-12-31 13:51:11的发言:
**。。。这个不顶怎么行。。。。。
  最好能举一个简单的补丁例子。把做补丁的过程写一下
  我就是不太懂地址中的那些字母和数字代表什么
  用软件打开了Flash,全是数字和字母,我从哪下手!。。谢谢

用“unicode”工具软件自己转换就是了
[/quote]
你是说反汇编么?我用IDA可以么?
反汇编以后就变成C语言了。。。是这样么?
 楼主| 发表于 2005-8-10 00:19:00 | 显示全部楼层
你是说反汇编么?我用IDA可以么?
反汇编以后就变成C语言了。。。是这样么?


首先,西门子在开发小8的时候肯定用的是C语言,他们把C语言汇编成HEX代码然后刷到小8里面去,我们就只有这些HEX代码。我们说的反汇编就是把这些HEX代码变成小8CPU的汇编代码(我们要分析的就是这个),不是C代码。
您需要登录后才可以回帖 登录 | 注册会员 微信登录

本版积分规则

小黑屋|Archiver|手机版|爱技术 ( 沪ICP备08115260号-3 )

GMT+8, 2025-6-7 21:11

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表