条件接收系统攻防杂谈连载(3)

时间:2022-08-15 03:13:57

条件接收系统攻防杂谈连载(3)

编者按:正版卡与D版卡的斗争,几乎成了条件接收系统大舞台上一场热闹的“大戏”。但是,对于普通用户而言,这场戏却似乎有些深奥得高不可攀,即使就发生在自己身边,也仍旧令人感觉云里雾里。那么,是否有一个途径,能让广大并非编程高手的读者了解条件接收系统攻防大战中的奥秘呢?热心的HammerRed老师针对朋友们的要求,以自身的研究实践为例,无私地撰写了一系列教学文章,为渴望探求真理的读者提供了一条循序渐进的学习之路。本刊将在今后的几期杂志中连续刊载该系列文章,与读者们共同分享探索的喜悦。

杂谈之十七

为了研究正版卡的反制,特别是某地有线类型的高级反制,不仅要研究带Key的EMM,还要关注和跟踪修改EEPROM的EMM。一直关注这些EMM动向的朋友会得到正版卡修改后的EEPROM代码,它们一般以*.BIN的形式给出。朋友们打开装有PC仿真卡的微机程序目录,可以在MyTheatre\Plugins\Nagra\目录下看到不少的这类*.BIN文件。

如果得到了ROM卡的*.BIN文件,就可以了解到正版卡在EEPROM中加入了哪些新的补丁程序或采取了什么反制方法。

研究和了解的第一步是反汇编。反汇编是将机器指令或数据代码转为源程序的一种操作,它是汇编过程的反向操作,是反向工程的一种手段。

一般开发产品,自主编写源程序后,主要的工作是汇编,很少反汇编。但在我国卫视界破解的朋友中,却常常进行反汇编。

原因之一,是因为水平不够,无法自编源程序,只好用国外或国内高手赠送的目标代码通过反汇编来转为源程序,再进行学习和修改,这成了必要的步骤。

原因之二,是研究正版卡的反制方法与原理的需要,必须通过反汇编将EMM或EEPROM中的机器码转为易读的源程序,再进行分析和研究。

汇编是将源程序转换为目标代码的过程,它比较简单,指令或数据转为机器码时都是唯一的,没有二义性;而反汇编就复杂得多!由于二进制代码的多义性,即,同一个字节,可以代表多种信息,它即可以代表CPU的操作指令,又可以代表各种字符、无符号数、带符号数、浮点数和其它种种信息,因此,一般情况下反汇编是不可能返回汇编前的源程序的,如果反汇编能将指令或数据正确区别开来,就是很不错的了。

朋友们可能有疑问:要反汇编的是程序,只要转为助记符指令就可以了,怎么还会有转为数据的问题呢?为什么难以区别程序与数据呢?

原来,程序是指令与数据的集合,程序存储区中即可以存放CPU的指令,又可以存放程序使用的数据,它们都是二进制代码。在源程序中,不仅有CPU执行的指令,也还有程序用到的数据,这些数据是用数据定义伪指令来描述的。指令与数据汇编后产生的目标代码都是二进制数,它们可能是指令也可能是数据,单从二进制代码本身并不能区别出它们是指令还是数据。

以ROM10卡的EEPROM中的部分机器码反汇编为例:

在ROM10.BIN文件中,取从地址$CE18开始的机器码:CD CB 21 00 96 02 70 08 A6 01。

用反汇编软件,如EMMStudio中的Disassembler,反汇编得到的源程序(是错误的)见图17,正确的反汇编应当得到如图18的源程序。

对比以上两个反汇编的源程序,就可以看出,反汇编后的源程序差别有多大!

前面的反汇编没有正确区别指令与数据,得到的源程序将误导阅读者,使之无法了解正确的程序思路。

而后面的反汇编正确区别了数据与指令,阅读者就可以明白程序的思路。

像这样的情形大量发生在某地有线的超级反制程序中,正如Kid朋友给我代码时的附言所讲:“cb 与ce code内,有很多都是特别的subroutine,用emmstudio disassem 时要小心一点,否则会看得不明所以……尤其是‘cd’等字眼,多是地址位置而不是opcode。早一页我post 出的就是例子,自己用emmstudio 时会出现不同结果。而keychange 的bytedump 部分全是random parameters for MAP CALL,再多例子也没分别。”

反汇编是有志研究破解的人必须掌握的技能,它是一个再创造的过程,需要的能力绝不比编程低,不要小看了反汇编的技巧,不信?可以自己试一试将我的程序代码反汇编看看!

杂谈之十八

真正的源程序的价值是非常高的,而简单反汇编得到的所谓源程序就没有什么价值,因为这样的源程序难以阅读,难以修改。

如何能将目标代码转换成为真正的源程序呢?

以下是正确反汇编的基本步骤:

1、反汇编首先要选对反汇编的工具程序DisAssembler,反汇编工具应当针对目标代码适用的CPU。乱抓一个来用,也可以反汇编,但产生出来的是莫名其妙的东西。一般的汇编程序都顺便带有反汇编的功能,也有专门的反汇编工具可以使用。大型的反汇编工具使用起来比较复杂,初学者可以先试试简单的。

2、其次,反汇编得到的源程序要能再汇编成为目标代码,这个目标代码必须与原先用于反汇编的目标代码完全相同,这可以检验反汇编是否基本正确。

3、再次,反汇编得到的源程序必须经过人工的阅读、分析和判断,确定哪些是指令代码,哪些是数据,确定之后,再告诉反汇编工具程序,让它做相应的处理,产生更合理的源程序。这个步骤要反复进行,直到数据和指令正确分离为止。判断哪些是数据,哪些是指令,要有敏锐的观察力。通常,如果出现“Unknown”字样,或不合逻辑的指令(如对同一个变量重复赋值等),或程序没有入口标号等,就可以认为这部分是数据;如果程序中出现了不合理的标号,说明其它地方还存在数据被当成指令的错误。

4、最后,对这种反汇编得到的原始源程序进行人工修改,使用有意义的变量名、常数名和子程序名替换原来没有意义的标号,加上详细的注释,最终才形成真正的源程序。这一步是一个再创造的过程,是反汇编中最难和最关键的工作。不会编程的人,一般无法完成这一步,因此我说:“反汇编是一个再创造的过程,需要的能力绝不比编程低!”是否真正能得到可以供修改和继续开发的源程序,关键都在这一步。可以说,反汇编的工作,工具软件仅仅帮了我们反汇编工作的其中一小部分,仅处理了那些死板的固定套路的事,而关键的智力活动都必需要人来完成。

许多朋友过分相信和依赖工具软件,这是不正确的。好的工具软件可以帮助我们,减轻不少繁琐的劳动。但工具是死的,而人是活的,是创造性的源泉。反汇编这种需要高智力的劳动,更是单纯依靠工具软件不可能完成的。

以下例子是取自146 D卡中的部分Flash程序,用于说明上述反汇编过程:

A. *.HEX格式的Flash程序代码(部分)如图19。

B. 用DISAVR2.EXE来反汇编,得到如图20的代码。

C. 经过人工分析,正确分离出数据和指令,在修改变量名,程序入口名,加上注释,得到最后的源程序见图21(前面这部分是这段程序的理论依据,来自StuntGuy的FAQ,作为注释,放在源程序中,帮助理解和阅读)。

在人介入之前,反汇编得到的源程序没有什么价值;而通过人的智力劳动所得到的源程序,十分便于阅读,可以任意修改、搬移到任意地方、增加或删除指令等等,成为闪亮发光的珍宝!

杂谈之十九

要了解正版卡的反制原理,首先要反汇编ROM卡中EEPROM的程序。ROM卡使用的CPU是ST7,它是STMicroelectronix 8位处理器家族的成员,指令系统与硬件结构向下兼容Motorola的6805计算机,可以直接执行EMM中携带的6805指令集。

通过下行的信号对ROM卡更新后,产生了新的程序。这些新的EEPROM的信息往往以*.BIN文件的形式出现在网站上。我们得到后,可以选择文件中我们有兴趣的一部分信息,交给EMMStudio进行反汇编。之所以选择EMMStudio,是因为EMMStudio专门针对ROM卡,它的反汇编具有一定的智能,可以自动处理变量名、ROM卡中已知的子程序名和特定子程序夹带的数据等,还可以加上注释;之所以只对一部分代码反汇编,是因为EMMStudio对反汇编调入的代码长度有限制,不允许超过4kB即$1000。

下面以某地有线反制的EEPROM程序的反汇编为例,介绍ROM卡的*.BIN文件中部分代码进行反汇编的基本方法:

根据EMMStudio解开的EMM,我们可以看到某地有线下行的EMM中夹带了这样的一段程序(见图22)。

从中我们知道,一切的关键都在$CE02这个子程序中,必须要反汇编存在ROM卡的EEPROM中的地址为$CE02开始的程序。

1、将含有$CE02程序的*.BIN文件读入某种编程器的缓冲区,缓冲区地址从$0000开始。记住ROM10/ROM11文件的*.BIN文件是从$C000地址开始的(见图23)。

2、计算保存文件的开始地址=需要反汇编的程序地址的开始地址-$C090。如,希望反汇编$CE02开始的子程序,则计算出的保存文件开始地址=$CE02-$C090=$0D72。

3、用编程器保存文件的功能,保存一份文件,文件类型为*.BIN,保存的缓冲区地址为计算得到的开始地址,文件长度为$1000。注意:EMMStudio的DisAssembler只接受长度为$1000的文件。例,保存文件名定为:CE02.BIN,开始地址为$0D72,长度为$1000(见图24)。

4、进入EMMStudio,点击DisAssembler功能,点击“Extract BSs Code From EEPROM Image...”,选择在第3步中保存的文件名,将Initial Addresses 和 Code Base都改为程序的真实地址,如在上例中,地址都改为$CE02,选择ROM卡的类型,如ROM10,最后点击“DISASSEMB-

LER!”,完成反汇编(见图25)。

5、当然,特殊的子程序,如后面跟随数据的,反汇编可能不正确,需要人工判读,并采取特殊的处理(处理方法从略)。

杂谈之廿

前几篇“杂谈”谈了不少反汇编的方法,通过反汇编可以阅读程序,了解不少程序的原理,这种方法对于可以得到目标代码的情形,是十分直接和有用的方法,但对于MAP功能,却无能为力,因为MAP程序的代码无法得到!

对于MAP功能的分析,只有通过不断调用MAP的某个功能,用不同的输入数据“喂”给它,观察它的输出从而判断出MAP完成的是何种操作。

由于MAP协处理器在ROM卡的内部,因此要实现不断测试MAP功能的操作,需要特殊的方法:

1、需要编写一段特殊的类似“Trojan 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的方法是Cracker们研究的常用手段。

对于ROM卡而言,需要的工具与软件有:

1、Phoenix写卡器,写卡器的晶振频率应当为3.68MHz(见图26)。

2、NagraEdit软件(见图27)。

3、XNCS软件(见图28)。

写卡器的作用是配合NagraEdit和XNCS软件,完成以下任务:

1、往ROM10卡中写入*.BIN文件。

2、发送EMM或其它信息。

3、从ROM10卡的EEPROM中读出记录到的信息。

MAPLogger程序由某个高手编写成功,我反汇编后加上注释,列出如下,供参考(见图29)。

MAPLogger的嵌入与使用方法如图30。

这个工作要直接针对*.BIN文件修改,最好要有编程器,调入原来的*.BIN文件,查找定位到要修改的地方,直接将十六进制数改到缓冲区中,存盘后就得到了嵌入MAPLogger的*.BIN文件。

(未完待续,感谢www.省略对本文所作的贡献)

上一篇:卫星数字接收机启用密码大全 下一篇:为偏置天线与偏馈天线正名