- UID
- 60682
- 阅读权限
- 30
- 推广
-
- 幽默
-
- 注册时间
- 2010-1-11
- 最后登录
- 1970-1-1
|

楼主 |
发表于 2010-3-18 14:10:57
|
显示全部楼层
回复 2# capf8643
某种EMM携带的6805的源程序:
Org $0081 ; 指定以下程序或数据开始地址
StartAddr81H: Lda $CE01 ; A:=EEPROM单元[$CE01]
Cmp #$01 ; 该单元内容是否等于$01
Bne $A7 ; 如果不是,则EEPROM未装入适当的程序,退到$00A7
Jmp $CE02 ; 否则EEPROM有适当的程序,转去执行该程序
#N9=i7 @3
汇编后的地址、机器码与源程序为:(该部分是*.LST即列表文件,它包含了源程序和汇编后机器指令或数据,地址
等)
Org $0081 ; 指定以下程序或数据开始地址
0081: C6 CE 01 StartAddr81H: lda $CE01 ; A:=EEPROM单元[$CE01]
0084: A1 01 cmp #$01 ; 该单元内容是否等于$01
0086: 26 A7 bne $A7 ; 如果不是,则EEPROM未装入适当的程序,退到$00A7
0088: CC CE 02 jmp $CE02 ; 否则EEPROM有适当的程序,转去执行该程序
。。。。。。。
以上部分略。
从以上范例中我们可以看到一些普遍规律(这几点请认真记录):
0. 计算机识别的信息都是二进制数,或简洁标示的十六进制形式。
如十六进制与二进制的不同形式:$C6=0xC6=0C6H = 0B11000110=%11000110=11000110B 等
1. 相同程序功能,但CPU不同,则机器指令码不同,不能互换。
2. 汇编语言源程序由4部分组成:
标号 操作码
操作数
注释
StartAddr81H: Lds r16,$CE01 ; A:=EEPROM单元[$CE01]
3. Org或.Org是伪指令,它不产生对应的机器指令,但仍起了一定的作用。
4. 多数指令是助记符指令,它们都产生了一一对应的机器指令,它们都要占据一定的存储单元,都有对应的地
址。
5. CPU按照指令的地址,逐条取出机器指令并执行,如果没有转移操作,就按照顺序执行。
6. 汇编语言源程序很难看懂和记忆,因此需要认真写注释,一般注释是用英文写,也可以用中文。
7. HEX文件有特定的格式,它包含地址,数据和效验和,十分严谨和灵活。
第七节
为了研究正版卡的反制,特别是XG有线类型的高级反制,不仅要研究带Key的EMM,还要关注和跟踪修改EEPROM的EMM
。一直关注这些EMM动向的黑客会从相关论坛得到正版卡修改后的EEPROM代码,它们一般以*.BIN的形式给出。
如果得到了ROM卡的*.BIN文件,就可以了解到正版卡在EEPROM中加入了哪些新的补丁程序或采取了什么反制方
法。
研究和了解的第一步是反汇编。反汇编是将机器指令或数据代码转为源程序的一种操作,它是汇编过程的反向
操作,是反向工程的一种手段。
一般开发产品,自主编写源程序后,主要的工作是汇编,很少反汇编。但黑客在破解我国卫视界的过程中,却
常常进行反汇编。
原因之一,是因为水平不够,无法自编源程序,只好用国外或国内高手赠送的目标代码通过反汇编来转为源程
序,再进行学习和修改,这成了必要的步骤。
原因之二,是研究正版卡的反制方法与原理的需要,必须通过反汇编将EMM或EEPROM中的机器码转为易读的源程
序,再进行分析和研究。
汇编是将源程序转换为目标代码的过程,它比较简单,指令或数据转为机器码时都是唯一的,没有二义性;而
反汇编就复杂得多!由于二进制代码的多义性,即,同一个字节,可以代表多种信息,它即可以代表CPU的操作指令
,又可以代表各种字符、无符号数、带符号数、浮点数和其他种种信息,因此,一般情况下反汇编是不可能返回汇
编前的源程序的,如果反汇编能将指令或数据正确区别开来,就是很不错的了。
大家可能有疑问:要反汇编的是程序,只要转为助记符指令就可以了,怎么还会有转为数据的问题呢?为什么
难以区别程序与数据呢?
原来,程序是指令与数据的集合,程序存储区中即可以存放CPU的指令,又可以存放程序使用的数据,它们都是
二进制代码。在源程序中,不仅有CPU执行的指令,也还有程序用到的数据,这些数据是用数据定义伪指令来描述的
。指令与数据汇编后产生的目标代码都是二进制数,它们可能是指令也可能是数据,单从二进制代码本身并不能区
别出它们是指令还是数据。
以**卡的EEPROM中的部分机器码反汇编为例:
在**.BIN文件中,取从地址$CE18开始的机器码:CD CB 21 00 96 02 70 08 A6 01
用反汇编软件,如XX软件中的XX功能,反汇编得到的源程序:(是错误的)
CE18: CD CB 21 jsr $CB21 ; 调用子程序$CB21
CE1B: 00 96 02 brset0 $96, $CE20 ; 如果$96单元的位0=1则转到$CE20
CE1E: 70 neg $X ; 对X寻址的单元进行求负操作
CE1F: 08 A6 01 brset4 $A6, $CE23 ; 如果$A6单元的位4=1则转到$CE23
正确的反汇编应当得到以下源程序:
CE18 CD CB 21 jsr $CB21 ; 调用子程序$CB21,将$0096开始的$08个字节数据复制到$0270开始
的单元中
CE1B 00 96 02 dc.b $00,$96,$02,$70,$08; 这六个字节是传给子程序$CB21的数据,用伪指令“dc.b”来
描述
CE1E 70 08
CE20 A6 01 ld a, #$01 ; a 取值$01
对比以上两个反汇编的源程序,就可以看出,反汇编后的源程序差别有多大!
前面的反汇编没有正确区别指令与数据,得到的源程序将误导阅读者,使之无法了解正确的程序思路。
而后面的反汇编正确区别了数据与指令,阅读者就可以明白程序的思路。
像这样的情形大量发生在XG有线的超级反制程序中,正如某黑客所讲:“cb 與ce code內,有很多都是特別的
subroutine,用Xx功能時要小心一點,否則會看到不明所以…尤其是"cd" 等字眼,多是地址位置而不是opcode。早
一頁post 出的就是例子,自己用XX软件時會出現不同結果。而keychange 的bytedump 部分全是random parameters
for MAP CALL,再多例子也沒分別。再有不明可以大家研究一下,反正結果都會是『謎』一個!
第八节
反汇编2
真正的源程序的价值是非常高的,而简单反汇编得到的所谓源程序就没有什么价值,因为这样的源程序难以阅
读,难以修改。
如何能将目标代码转换成为真正的源程序呢?
以下是正确反汇编的基本步骤:
1. 反汇编首先要选对反汇编的工具程序XX,反汇编工具应当针对目标代码适用的CPU。乱抓一个来,也可以反
汇编,但产生出来的是莫名其妙的东西。一般的汇编程序都顺便带有反汇编的功能,也有专门的反汇编工具可以使
用。大型的反汇编工具使用起来比较复杂,初学者可以先试试简单的。
2. 其次,反汇编得到的源程序要能再汇编成为目标代码,这个目标代码必须与原先用于反汇编的目标代码完全
相同,这可以检验反汇编是否基本正确。
3. 再次,反汇编得到的源程序必须经过人工的阅读、分析和判断,确定哪些是指令代码,哪些是数据,确定之
后,再告诉反汇编工具程序,让它做相应的处理,产生更合理的源程序。这个步骤要反复进行,直到数据和指令正
确分离为止。判断哪些是数据,哪些是指令,要有敏锐的观察力。通常,如果出现“Unknown”字样,或不合逻辑的
指令(如对同一个变量重复赋值等),或程序没有入口标号等,就可以认为这部分是数据;如果程序中出现了不合
理的标号,说明其它地方还存在数据被当成指令的错误。
4. 最后,对这种反汇编得到的原始源程序进行人工修改,使用有意义的变量名、常数名和子程序名替换原来没
有意义的标号,加上详细的注释,最终才形成真正的源程序。这一步是一个再创造的过程,是反汇编中最难和最关
键的工作。不会编程的人,一般无法完成这一步,因此说“反汇编是一个再创造的过程,需要的能力绝不比编程低
!”,是否真正能得到可以供修改和继续开发的源程序,关键都在这一步。可以说,反汇编的工作,工具软件仅仅
帮了我们反汇编工作的其中一小部分,仅处理了那些死板的固定套路的事,而关键的智力活动都必需要人来完成。
许多初学者可能过分相信和依赖工具软件,这是不正确的。好的工具软件可以帮助我们,减轻不少繁琐的劳动
。但工具是死的,而人是活的,是创造性的源泉。反汇编这种需要高智力的劳动,更是单纯依靠工具软件不可能完
成的。
第九节
反汇编3
要了解正版卡的反制原理,首先要反汇编ROM卡中EEPROM的程序。仍以XXCA使用的ROM卡为例:
该ROM卡使用的CPU是ST7,它是STMicroelectronix8位处理器家族的成员,指令系统与硬件结构向下兼容Motorola的
6805计算机,可以直接执行EMM中携带的6805指令集。
通过下行的信号对ROM卡更新后,产生了新的程序。这些新的EEPROM的信息往往以*.BIN文件的形式出现在一些黑客
网站上。我们得到后,可以选择文件中我们有兴趣的一部分信息,交给Xx软件进行反汇编。之所以选择Xx软件,是
因为Xx软件专门针对ROM卡,它的反汇编具有一定智能,可以自动处理变量名、ROM卡中已知的子程序和特定子程序
夹带的数据等,还可以加上注释;之所以只对一部分代码反汇编,是因为Xx软件对反汇编调入的代码长度有限制,
不允许超过4KB即$1000。
下面以XG有线反制的EEPROM程序的反汇编为例,介绍ROM卡的*.BIN文件中部分代码进行反汇编的基本方法:
根据Xx软件解开的EMM,我们可以看到XG有线下行的EMM中夹带了这样的一段程序:
。。。。。。。(略)
从中我们知道,一切的关键都在$CE03这个子程序中,必须要反汇编存在ROM卡的EEPROM中的地址为$CE02开始的程序
。
1. 将含有$CE02程序的*.BIN文件读入某种编程器的缓冲区,缓冲区地址从$0000开始。记住ROM10/ROM11文件的
*.BIN文件是从$C000地址开始的。
2. 计算保存文件的开始地址=需要反汇编的程序地址的开始地址-$C090。如,希望反汇编$CE02开始的子程序,则
计算出的保存文件开始地址=$ CE02-$C090=$0D72。
3. 用编程器保存文件的功能,保存一份文件,文件类型为*.BIN,保存的缓冲区地址为计算得到的开始地址,文
件长度为$1000。注意:Xx软件的Xx只接受长度为$1000的文件。例,保存文件名定为:CE02.BIN,开始地址为$0D72
,长度为$1000。
4. 进入Xx软件,点击Xx功能,点击“Extract Bss Code From EEPROM Image…”,选择在3.中保存的文件名,将
Initial Addresses和Code Base 都改为程序的真实地址,如在上例中,地址都改为$CE02,选择ROM卡的类型,如
ROM10,最后点击“XX!”,完成反汇编。
5. 当然,特殊的子程序,如后面跟随数据的,反汇编可能不正确,需要人工判读,并采取特殊处理(处理方法略
)。 第十节介绍MAP与反制原理,第十一节介绍如何用程序来仿真。
不过看现在的情形,大家对算法的讨论感兴趣的比
较多,因此觉得有必要停下来讨论讨论算法的问题。可能有人说,一提算法可能又会把问题搞的非常发散,最终又
会偏离我们的主题太远,但谈CA破解又不可能不提算法,所以我们暂且转贴一篇网络上流行的基础帖子,从这里插
叙开始谈起:
转贴:CA算法的破解方法
理论上说,CA算法的破解方法有两种:一种是解析法,另一种是穷举法。
解析法是根据CA的算法,找到其中的要素,推断出未知因素从而破解算法,这是一种相对比较有把握的方法。对于
一种固定的算法,从算法理论上说,它由四个要素构成:第一是被加密的对象(明文);第二是加密完成的结果(密文
);第三是实现加密的数学模式;第四是采用的密码。在电视广播应用中,一般来说,明文和密文是可以获取的,算
法是不能保密的(易泄露),密钥是大家攻击的对象,一旦密钥被攻破,加密的方法也就随之告破。虽然科学家们设
计了很多种巧妙的算法,但是却没有人敢保证自己的算法是不可破解的。但是通过系统实现可以增加算法破解的难
度:把两重算法结合在一起,将第一重加密算法的密文作为第二重加密算法的明文,这样用户只能看到原始的明文
和两次加密以后的密文,如此就无法找到每个算法三大要素的对应关系,从而无法用解析法来推断密码。
目前绝大
多数CA被破解都使用了穷举法。由于明文和密文形成了一定的对应关系,只要拿到足够多的明文和密文对,通过数
学的试探方法可以找出中间的对应关系。对穷举法的防御一方面要加大密钥的长度,使明文和密文的位数大大加长
,另一种方法是让破解者无法在一定的时间段内拿到足够多的对应关系,典型的做法是将时间因子作为加密内容加
进去。只要时间不重复,明文和密文就很难找到对应的关系。
但有了一个好的算法并不表示系统就是安全的,如果
在实施过程中留下了漏洞,还是有机会被破密。如果CA的算法很严密,但全是由外部计算机软件实现的,只要有一
个手段高明的黑客,就可以比较容易地将程序下载下来,经过反汇编,读取原始代码,从而破解密码。在欧洲某国
就发生过这样的事,有个系统工程师下载了某CA的程序,成功地进行了破译。现在,为了提高系统的安全性,人们
普遍采用了软硬结合的方法,把核心的算法和密钥都放在保密性相对较好的专用IC卡里,使破密者无法打开IC卡里
的内部程序,从而保护核心机密。所以考察安全性的另一个要素,就是要判断厂商提供的IC卡是否足够安全,是否
有国际国内的相应标准能够认证其安全等级。如果IC卡本身不够安全,那么CA再强大也无济于事。另外,IC卡必须
是专用卡,绝不能将在其他领域通用的卡用作数字电视IC卡,以免破密者因可以轻易获得所需的卡而大大增加破密
的机会。
MAP
前几节谈了不少反汇编的方法,通过反汇编可以阅读程序,了解不少程序的原理,这种方法对于得到目标代码的情
形,是十分直接和有用的方法,但对于MAP功能,却无能为力,因为MAP程序的代码无法得到!
对于MAP功能的分析,只有通过不断调用MAP的某个功能,用不同的输入数据喂给它,观察它的输出从而判读出MAP完
成的是何种操作。
由于MAP协处理器在ROM卡的内部,因此要实现不断测试MAP功能的操作,需要特殊的方法:
1. 需要编写一段特殊的类似“Trojon Horse(木马)”的程序(行内称为“MAPLogger”),该程序的功能是在
EEPROM中纪录MAP执行前ROM卡有关内存的数据,然后调用MAP功能,执行后在EEPROM中纪录MAP调用后ROM卡有关内存
的数据;
2. 修改ROM卡EEPROM中的部分程序,用MAPLogger的调用取代原先MAP的调用,让MAPLogger程序起作用;
3. 将特定的EMM发送给ROM卡,让它执行EMM中的程序,触发引起调用特定的MAP Call,这时,我们埋伏在其中的
MAPLogger会起作用,纪录下我们希望看到的数据;
4. 将ROM卡的EEPROM区读出,取出MAPLogger 纪录的数据,供分析和研究。
这种嵌入-logging的方法是hanker们研究的常用手段。
对于ROM卡,需要的工具与软件有:
1.XX 写卡器,写卡器的晶振频率应当为3.38MHZ。
图解:
写卡器的作用是配合XX和XX软件,完成:往ROM10卡中写入*.BIN文件,发送
或其他信息;从ROM10卡的
EEPROM中读出纪录的信息。
MAPLogger程序由某个高手编写成功,又经其他高手反汇编后加上注释,列出如下,供参考:(对特定读者,略)
MAPLogger的嵌入与使用方法如下:
例如,我们想了解EMM 解Key中用到的MAP-$28功能,我们可以先找到有关的程序:
然后,将:jsr $90E3 机器码为:CD90 E3
改为: jsr $c702 机器码为:CD C7 02
即,将CE4A地址处的CD 90 E3改为:CD 07 02就可以了。
这个工作要直接针对*.BIN文件修改,最好要有编程器,调入原来的*.BIN文件,查找定位到要修改的地方,直接将
十六进制数改到缓冲区中,存盘后就得到了嵌入MAPLogger的*.bin文件。
汇编指令与机器码的相互转换--中原教程网2006-11-28 lxjtc
51汇编指令集_中国嵌入式联盟_新浪博客2009-04-17 liukai007
RAM与ROM的区分2007-09-21 Alan
程序执行时写闪存的应用实例2006-02-09 Taylor
手机常用指令2009-11-10 琪琦
彩信吧-三星软件专区-[分享]三星手机秘籍2005-08-16 anry2000
智慧卡/晶片卡技術發展(2)2007-02-02 Taylor |
|