回 帖 发 新 帖 刷新版面

主题:C中有没得可以控制程序写入某地址的方法哦?

如题,就像汇编中org指令类似功能的?

回复列表 (共7个回复)

沙发

这个很简单,memset函数,或者知道要写入数据的长度的话定义相应类型的指针然后对其取值进行赋值操作
但是这么做比较危险!!!不要随便尝试

板凳

可是写的要是程序呢   不是一些相同的数据....

3 楼

……直接破坏性的攻击的话一般是透过脚本渗透到内存里,也有类似于缓冲区溢出等等传统攻击手段。具体的攻击行为请前往黑客论坛讨论。

4 楼

雪光风剑兄,貌似没有理解楼主的意思。
汇编的ORG指令其实不是真的让机器执行一条指令,它只是说明,“接下来的代码,帮我丢到内存中的某某位置”。这是因为很多机器在启动的时候,会从固定的位置读取数据,然后作为指令去执行的缘故。
标准的C语言没有这样的功能。不过,如果是专门用于嵌入式系统的C语言(比如51单片机用的C语言),很可能就有这样的功能了。如果您正在对一个嵌入式的设备编写C语言程序,您可能需要阅读这种设备的开发者文档。

在PC机上,这样的功能作用并不大。在现代的操作系统中,一个普通程序已经无法控制所有的物理内存了,所以也无法把程序加载到某个特定的内存位置。(如果真的允许这样的功能,那这样的程序同时运行两份的话,会如何呢?)当然,无法控制物理地址,还是可以控制逻辑地址的。我们知道代码编译完还要进行连接,在连接的时候会为每一个函数、每一个全局变量分配地址,这就是逻辑地址。在VC中,逻辑地址可以看成两部分,一部分是基地址,一部分是偏移地址。一个程序中的所有函数、全局变量,基地址都是统一的,它可以在linker选项里面设置(也就是“Base Address”那一项)。而每个函数和全局变量则有各自的偏移地址。如果编译的不是exe,而是dll的话,虽然也可以设置一个基地址,但在一个exe加载一个dll的时候,如果发现这个基地址已经被其它dll占用了(准确的说,是基地址和偏移地址所确定的那一段地址都被占用了),则会在程序运行的时候,重新自动选择一个新的基地址。综合起来说,偏移地址是不能设置的,基地址虽然可以设置,但也可能被改变,所以即使设置作用也不大。

5 楼

[quote]它只是说明,“接下来的代码,帮我丢到内存中的某某位置”。[/quote]
对这句话有点不同看法,程序没有权力决定自己被丢到哪个地方,ORG只是告诉程序"你"将被丢到哪个地方,ORG只是告诉编译器在编译程序的时候把程序编译成适合放在某个偏移地址的程序

6 楼

[quote]雪光风剑兄,貌似没有理解楼主的意思。
汇编的ORG指令其实不是真的让机器执行一条指令,它只是说明,“接下来的代码,帮我丢到内存中的某某位置”。这是因为很多机器在启动的时候,会从固定的位置读取数据,然后作为指令去执行的缘故。
标准的C语言没有这样的功能。不过,如果是专门用于嵌入式系统的C语言(比如51单片机用的C语言),很可能就有这样的功能了。如果您正在对一个嵌入式的设备编写C语言程序,您可能需要阅读这种设备的开发者文档。

在PC机上,这样的功能作用并不大。在现代的操作系统中,一个普通程序已经无法控制所有的物理内存了,所以也无法把程序加载到某个特定的内存位置。(如果真的允许这样的功能,那这样的程序同时运行两份的话,会如何呢?)当然,无法控制物理地址,还是可以控制逻辑地址的。我们知道代码编译完还要进行连接,在连接的时候会为每一个函数、每一个全局变量分配地址,这就是逻辑地址。在VC中,逻辑地址可以看成两部分,一部分是基地址,一部分是偏移地址。一个程序中的所有函数、全局变量,基地址都是统一的,它可以在linker选项里面设置(也就是“Base Address”那一项)。而每个函数和全局变量则有各自的偏移地址。如果编译的不是exe,而是dll的话,虽然也可以设置一个基地址,但在一个exe加载一个dll的时候,如果发现这个基地址已经被其它dll占用了(准确的说,是基地址和偏移地址所确定的那一段地址都被占用了),则会在程序运行的时候,重新自动选择一个新的基地址。综合起来说,偏移地址是不能设置的,基地址虽然可以设置,但也可能被改变,所以即使设置作用也不大。[/quote]
就牛仔兄的回复,我认为我1楼的回复提供的两种行为的行为方式从特征上看与lz的需求是比较一致的没问题吧。至于脚本代码的内存渗透和缓冲区溢出攻击,更多的也不是让系统“立即执行某代码”,而是把代码“压向有足够权限的区域并且具备执行的可能”。我认为这和lz提供的需求大致描述也是基本一致的:)个人观点~

7 楼

谢谢各位的回答...牛仔兄的回答很好了    我只是还有很多不懂的地方   剩下的自己看书了..

我来回复

您尚未登录,请登录后再回复。点此登录或注册