专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 汇编语言

为什么程序执行的时候代码不同?解决方案

发布时间:2010-06-14 15:42:44 文章来源:www.iduyao.cn 采编人员:星星草
为什么程序执行的时候代码不同?
在反汇编一个程序,发现程序在不同的机器上执行的时候代码总是有些不同,有时是一个函数的起始地址有些不同,有时是一个函数内某条语句使用的寄存器有些不同。有时在自己机器上运行的时候函数地址也不同,但是每个函数的间距似乎都是相同的,请问这是怎么回事啊?

------解决方案--------------------
发现程序在不同的机器上执行的时候代码总是有些不同:
两种原因:
1.程序使用了动态生成技术,就是程序加载时,将程序动态的以某种方式加入内存,如加壳软件就是这样的,这基本上极少使用。
2.程序加入内存的起始地址是不固定的,如WINDOWS下的PE文件就是这样的,但也有的程序不是这样的,如LINUX下的ELF文件,它的起始地址就是固定的。
------解决方案--------------------
up
------解决方案--------------------
2楼的有道理。
补充褵一下:可观察lea与offset的区别。
------解决方案--------------------
如果是Win32可执行文件的话,那么极有可能已经被加过壳,且加壳软件(例如ASProtect)采用了代码多态变形技术。具体可以使用PEiD这款工具查看一下可执行文件的详细信息。
------解决方案--------------------
你的程序使用的是逻辑地址,而不是固定的内存地址,因此在程序加载的时候需要加载器执行一个地址重定位过程,而重定位的地址是根据内存使用情况确定的,所以每次运行程序都可能被加载到不同的内存地址,寄存器的使用也同此理,有些时候是根据寄存器的使用情况动态分配的。
------解决方案--------------------
但是每个函数的间距似乎都是相同的

通常所说的重定位,是针对整个程序的,不能改变程序内部的相对地址,所以所有符号之间的间距是不变的。
如果针对每一个符号进行重定位,加载速度会变得很慢,重定位表也会比较大
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: