下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、转从单片机指针说到黑客程序 转从单片机指针说到黑客程序2004年7月的一天,在电子BBS讨论区上溜达,看到一个有趣的帖子,整个帖子内容如下:纯C51复位功能函数:一个大三学生,让人又爱又怕现单列复位部分如下:main() unsigned char code rst=0xe4,0xc0,0xe0,0xc0,0xe0,0x32; / 复位代码 (*(void (*)()(rst)(); / 执行上一行代码,将rst数组当函数调用本来我告诉他嵌入如下代码:clr apush accpush accreti
2、结果他却玩了前面哪一段,而数组rst中的内容恰恰是上面的汇编机器码,他的做法是将rst数组的数据当作代码保存,然后采用绝对地址方式指向该数组,将该数组中的代码当作函数来运行。居然通过了!我觉得有问题,我说即使如此,那绝对地址调用也应该写成(*(void (*)()(&rst)() 才对呀,结果他反驳说,那样的话,rst的地址就会当成参数传递给这个绝对地址函数,而实际LJMP调用的地址并非rst的地址,而是一个不确定的地址。于是我按照自己的说法尝试了一下,看看汇编结果,还真的是将rst的地址传递给了R1 R2,而绝对函数最终LJMP到了一个莫名其妙的地址上去了,死翘!看来C真是一匹不容易
3、驾驭的野马,这个大三学生理解力在我之上,我30多岁的人了,干了这么多年还没他的境界呢,唉,人家才学了几天啊,翻了几天书就这么厉害了,服了! l 首先分析帖子的C语言代码第一句定义一个数组rst,数组内数据就是完成复位功能的汇编机器码,具体对应关系为:clr a = 0xe4、push acc = 0xc0,0xe0、reti =0x32第二句是一个函数指针的用法,函数指针用法稍微有点复杂,可参看本人著的书,:),以下为快速入门讲解。定义一个返回值是空函数指针的定义形式如下:void (*p) ( )当把函数指针赋值后,就能通过函数指针调用函数,调用形式如下, (*p) ( );或等价的简化形式
4、:p ( );假设rst就是函数指针,则如下调用形式就可以令单片机复位再起。(*rst ) ( ); 但可惜,rst不是函数指针,而是数组名,虽然两者都是地址,但不可直接调用数组名。如同把char型变量a赋值给int型变量b,(int) 表示强制类型转换:b = (int) a函数指针的强制类型转换公式如下(C语言的哲学是定义形式和使用一致):( (void (*)() ) rst 这样经过转换后的rst就可以当作函数指针使用了,简单的调用形式如下:#define K ( (void (*)( ) ) rst(*K) ( )或:( * ( void (*)( ) )rst ) ( );这样的语
5、句就完成复位再启功能了。类型转换符()的优先级跟指针运算符*的优先级相同,二者的结合方向是自右至左,所以上述语句就能完成复位功能了。保险起见有些程序员常常喜欢再加个括号:#define K ( ( (void (*)( ) ) rst )(*K) ( )或( *( ( void (*)( ) )rst ) ) ( ); 由于没有输入参数,上述复位代码更严谨的写法是: #define K ( ( (void (*)(void ) ) rst )(*K) ( )或( *( ( void (*)(void ) )rst ) ) ( ); l 关于帖子作者的解释千万不要犯“&rst”形式的错误
6、,对于一维数组而言,数组名rst就代表地址。以下二者等价,更常用的是等式左边的形式:rst = &rst0整个函数指针无所谓参数传递,只是把rst当作程序执行地址调用而已,那个学生的解释也有问题。还有一点必须提及,不是说能通过编译,甚至生成正确代码,就表示某语句一定是对的。对很复杂的语句,要考虑到编译器不严格甚至出错的可能性。 l 哈佛结构和一个蠕虫病毒请注意,定义数组rst时用了关键字code,这是C51特有的关键字,意味着把数组定义到程序空间。标准C是没有关键字code的。哈佛结构和普林斯顿结构:哈佛结构程序空间和存储空间分开的。C51算是不太严格的哈佛结构虽地址线分开,但数据线没
7、有分开。DSP是增强的哈佛结构。PC电脑上奔腾CPU是普林斯顿结构数据空间和程序空间统一编址。 如果数组rst数据的汇编机器码是删除文件的机器码,这算不算是病毒?曾经流行过一种蠕虫病毒,其发作机理采取的就是将恶意代码保存成文本文件,然后通过指针调用执行这个文本,很多杀毒程序也不会查询文本文件。程序也罢,数据也罢都是二进制形式,如果数据空间和程序空间是统一编码的, 数据当然可以当作程序运行。在这一点上,相对而言,哈佛结构的CPU安全性会好一点点。但嵌入式应用少有病毒,一般不用关心。 l 单片机复位的更好方法帖子中汇编语言解释如下:clr a /清除ACC=0push acc /压0到堆栈8位pu
8、sh acc /再压0到堆栈再8位reti /返回到0地址,从而执行。帖子作者的这种复位方法比较麻烦,更加简单的复位写法是(摘自C缺陷与陷阱):( * ( void (*)( ) )0 ) ( );本句的分析方法同上,但更加精炼,没有多余的汇编语句。 上述复位的方法可称为软件复位。软件复位跟真正上电复位有很大差别:上电复位时大部分寄存器都有确定的复位值;软件复位则只相当于从0地址开始执行而已,寄存器不会变为确定的复位值。如果用户要编程实现上电复位这种情况,在程序中不要踢看门狗即可。大部分单片机都有看门狗吧。附录笔者精于DSP C24xx,但不太懂C51;读者应能从函数指针的定义和引用中看出来,C语言的设计哲学是使用形式和定义形式一致,虽然这一点饱受质疑。2004年7月看到这个有意思的帖子,也干了一件蠢事买了飞利浦的一款拍照手
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 贵州城市职业学院《医用治疗仪器》2023-2024学年第一学期期末试卷
- 2025安徽省安全员-C证考试(专职安全员)题库及答案
- 2025江苏省建筑安全员B证考试题库及答案
- 贵阳人文科技学院《中国古代文学一》2023-2024学年第一学期期末试卷
- 2025辽宁省建筑安全员《B证》考试题库
- 2025湖南省安全员知识题库及答案
- 2025四川建筑安全员B证考试题库
- 2025重庆市建筑安全员C证(专职安全员)考试题库
- 2025甘肃省建筑安全员知识题库
- 2025年海南建筑安全员C证(专职安全员)考试题库
- 2024伊利在线测评题
- 安徽省A10联盟2025届高二上数学期末考试试题含解析
- 人民日报出版社有限责任公司招聘笔试题库2024
- 燃烧仿真.燃烧数值模拟方法:化学反应动力学模型:燃烧仿真前沿技术与研究
- 线性代数考试练习题带答案大全(二)
- 重症超声与休克-课件
- 电梯工程师在电梯设计中的工作内容
- 二年级数学上册口算天天练
- 2024国家开放大学电大本科《液压气动技术》期末试题及答案
- GB/T 30306-2024家用和类似用途饮用水处理滤芯
- 08D800-5 民用建筑电气设计与施工 常用电气设备安装与控制
评论
0/150
提交评论