一个不使用导入表的程序
2008-05-19 10:57
267 查看
一个不使用导入表的程序
作者:SunLine lisunlin0@yahoo.com.cn
日期:2008年5月
代码下载: http://download.csdn.net/user/lisunlin0 关键字: 重定位代码, 无导入表程序, exe without import table, relocable code
摘要:
让自己的程序既可以当EXE运行, 又可以作为Dll使用.
原理:
win32是平坦内存模式的,此时相对地址的call指令可以寻址4G内存空间的。
实现:
在编写ShowImport工程的时候, 希望ShowImport程序既可以当EXE运行, 又可以作为Dll使用. 为了达到这个要求, 仔细比较了用LoadLibrary()函数加载一个.exe文件时与加载一个.dll的系统的不同动作. 终于完成了不使用导入表程序的模板.
在VC/VS下,关闭“增量链接”选项后,程序内的有源文件的函数调用默认使用 call offset 指令编译。就是说:
这样的代码本身就是相对地址的,可以将(LPBYTE)c - (LPBYTE)a之间的机器码拷贝到栈或堆里运行(栈内存本身具有page_execute属性,而堆不具有,需要指定可执行的属性)。
小结一下,在关闭“增量链接”选项前提下,全局变量,win API必须重定位;库函数,不在同一个源文件中的函数调用可能需要重定位;同一文件中的函数调用,栈变量,函数参数都不需要重定位,而堆变量必须要有指针才能使用(指针本身也是变量),不存在重定位说法。
重定位是汇编的强项,但在不考虑可移植性的前提下,c/c++也可以实现重定位,辅以少量的汇编,可以完成复杂的重定位工作。
本人写的小程序ShowImport就是主要c/c++再辅以少量汇编的重定位程序,有兴趣可以看看。
作者:SunLine lisunlin0@yahoo.com.cn
日期:2008年5月
代码下载: http://download.csdn.net/user/lisunlin0 关键字: 重定位代码, 无导入表程序, exe without import table, relocable code
摘要:
让自己的程序既可以当EXE运行, 又可以作为Dll使用.
原理:
win32是平坦内存模式的,此时相对地址的call指令可以寻址4G内存空间的。
实现:
在编写ShowImport工程的时候, 希望ShowImport程序既可以当EXE运行, 又可以作为Dll使用. 为了达到这个要求, 仔细比较了用LoadLibrary()函数加载一个.exe文件时与加载一个.dll的系统的不同动作. 终于完成了不使用导入表程序的模板.
在VC/VS下,关闭“增量链接”选项后,程序内的有源文件的函数调用默认使用 call offset 指令编译。就是说:
int a(int n) { return ++n; } int b(void) { a(0); a(1); } void c(void){}
这样的代码本身就是相对地址的,可以将(LPBYTE)c - (LPBYTE)a之间的机器码拷贝到栈或堆里运行(栈内存本身具有page_execute属性,而堆不具有,需要指定可执行的属性)。
小结一下,在关闭“增量链接”选项前提下,全局变量,win API必须重定位;库函数,不在同一个源文件中的函数调用可能需要重定位;同一文件中的函数调用,栈变量,函数参数都不需要重定位,而堆变量必须要有指针才能使用(指针本身也是变量),不存在重定位说法。
重定位是汇编的强项,但在不考虑可移植性的前提下,c/c++也可以实现重定位,辅以少量的汇编,可以完成复杂的重定位工作。
本人写的小程序ShowImport就是主要c/c++再辅以少量汇编的重定位程序,有兴趣可以看看。
相关文章推荐
- 使用PyQt5编写一个简单的GUI程序(pyside 有 pyside-uic 把ui文件转成py文件,pyside-rcc 把qrc文件转成 py文件导入就行了)
- Windows下socket.io环境搭建与使用(做一个一对一聊天程序)
- 使用Java编写一个简易的本地文件的检索相关字的程序
- extmail 批量导入用户的程序使用说明
- 完成一个学生管理程序,使用学号作为键添加5个学生对象,并可以将全部信息保存在文件中,可以实现对学生信息的学号查找,输出全部学生信息的功能。
- 使用TCP协议编写一个网络程序,设置服务器端的监听端口是8002,当与客户端建立连接后,服务器端向客户端发送数据“Hello, world”,客户端收到数据后打印输出
- Linux下之使用简单3种创建文件的命令,并实现一个Html和JavaScript小程序
- 使用C#编写的一个定时关机程序
- 如何使用Python为Hadoop编写一个简单的MapReduce程序
- 一个笨鸟在使用Eclipse导入Maven项目遇到的问题及解决方案
- 一个使用JAVA编写的类似按键精灵的程序,支持脚本文件编写(含源代码)
- 使用write函数来编写一个程序,在程序中指定一个文件,用户可以向程序中一次写入不超过80个字符的数
- 练习1-19 编写函数 reverse(s),将字符串s 中的字符顺序颠倒过来。使用该函数编写一个程序,每次颠倒一个输入行中的字符顺序。
- 编写一个程序,使用fork函数来创建一个子进程,并且说明父进程和子进程的随机返回问题
- 以一个投票程序的实例来讲解Python的Django框架使用
- 怎么导入vitamio并能在自己的程序中使用
- 在MFC下使用OpenGL的一个简单的例子(基于单文档程序)
- (Ubantu)使用gcc编译一个程序a.c成a.out,输入a.out运行,提示bash:a.out:command not found,怎么回事
- Linux 下查看某一个程序所使用的内存方法介绍
- excel 2013 如何使用visual studio 2012 创建一个excel 2013的外接程序addin