linux 导出函数?linux内核函数

老铁们,大家好,相信还有很多朋友对于linux 导出函数和linux内核函数的相关问题不太懂,没关系,今天就由我来为大家分享分享linux 导出函数以及linux内核函数的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

Linux内核-hook系统调用

内核符号表的修改是实现系统调用劫持的关键。系统调用通过触发0x80软中断并跳转到system_call()函数来执行,该函数根据系统调用号跳转到内核函数的入口地址。修改内核符号表,使其跳转到自定义函数,即实现了系统调用劫持。

获取系统调用表是hook系统调用的第一步。以下是几种获取系统调用表地址的方法:

(1)调用内核导出函数kallsyms_lookup_name获取

(2)读取system.map文件获取

(3)从PAGE_OFFSET开始遍历查找__NR_close系统调用首地址

(注:PAGE_OFFSET为内核空间与用户空间的分界地址,不同体系结构有所不同。)

获取系统调用表后,可以将系统调用替换为自定义接口。以下以sys_open为例,展示拦截系统调用的内核模块代码编写过程:

(1)找到sys_open的声明(在内核源代码路径下)

(2)在hook.h文件中声明要hook的系统调用函数指针和自定义的替换系统调用函数

(3)获取系统调用表地址

(4)获取sys_open指针,将其指向自定义的open函数

在修改系统调用表指向时,需先关闭内核写保护机制,修改完毕后重新启用。

x86_64 CPU中,控制寄存器的bit16控制写保护标志。通过内核提供的接口或内联汇编代码修改bit16标志。

(5)实现myhook_open函数

(6)卸载模块时,还原系统调用指向

(7)编写Makefile文件,编译代码

6、加载模块及日志打印

ending!!!

以上是hook系统调用sys_open的讲解,其他系统调用的hook方法类似。

DelphiforLinux中应用共享对象库

1. Delphi for Linux是Borland公司推出的基于Linux平台的面向对象的可视化开发工具,是目前Linux平台上很好的应用开发工具。Delphi for Linux也称Kylix,开发者用Kylix开发Linux应用程序时,可能会使用到Linux操作系统本身带的大量SO文件。

2. SO是一种特殊的运行文件,包含若干方法、对象和资源。它不能直接运行,但可以被Kylix应用程序或其他可执行文件动态调用。SO文件扩展名为so。编译前源文件扩展名为dpr。本文所举例子均在Red Hat Linux及Kylix环境下调试编译通过,并可正常运行。

3. SO库文件的组成和Kylix标准单元文件的内部结构基本相同,也有声明、实现及初始化部分。区别之一在于SO库只是其他程序可以调用的方法(包括函数及过程)集合。区别之二,库程序以library关键字而非project开头启动其项目文件。库程序包含有exports语句,其列出要向外部提供的导出函数及过程。

4.共享对象库的创建,SO库文件的构成,函数重载,特殊编译指令,采用Delphi for Linux创建SO的编程规则,使用前的Linux系统设置,以及在Delphi for Linux中用隐式或显式链接方法装入和使用SO函数的基本方法,经验及技巧,并对应用SO可能出现的问题进行了探讨和分析。

5.共享对象库基本概念:多个Kylix程序或它的多个单元文件可通过接口共用一个SO库文件;某一个Kylix程序可通过多个接口使用多个SO库文件,这样SO变成一种可共用的资源,实现真正的资源共享,大大缩小了Kylix应用程序的执行代码,增强了软件的可重用性。

6.将SO文件作为Kylix应用程序的公共调用模块设计时,由于其独立于应用程序,软件升级时只需修改SO库文件及编译SO,无需更改及重编译Kylix应用主程序。

7.不仅可使用Kylix编写SO库,还可使用C或C++等常用语言来编写,只要遵循特定的接口规范。

8.共享对象库的使用,Kylix应用程序使用SO库时可以采用两种方式,一种是隐式链接(Implicit linking),也称静态装入;另一种是显式链接(Explicit Linking),也称动态装入。

9.使用前的系统设置,自定义SO库建好后,Kylix应用程序调用时会报错,这是因为Kylix找不到新建库。必须对系统进行相关设置,这与在Delphi for Windows中使用DLL库不同。DLL库建好后只需将编译后的DLL文件放到Delphi主程序目录下即可使用。

10.隐式链接,实现隐式链接并不难,只需在应用程序中加入库函数的声明语句及库的external定义从句,则库函数可以和一般局部函数一样使用。

11.显式链接,显式链接是应用程序在执行过程中可根据实际需要随时加载SO库文件,也可以随时卸载SO库文件,还可在运行时进行SO库的切换,而这些是隐式链接无法做到的。与隐式链接相比,显式链接具有更大的灵活性。

12.在Kylix中,要动态装入库和调用导出函数可以用Delphi仿真代码或自然Linux方法,下面分别介绍这两种方法。

13. SO库中窗体对象的使用,除了包含函数和过程的库之外,还可以将Kylix建立的窗体放在共享对象中,这可以是对话框或其他窗体。

那个动态链接库的EXPORT 函数要怎么怎么用

2.1 Windows动态库技术

动态链接库是实现Windows应用程序共享资源、节省内存空间、提高使用效率的一个重要技术手段。常见的动态库包含外部函数和资源,也有一些动态库只包含资源,如Windows字体资源文件,称之为资源动态链接库。通常动态库以.dll,.drv、.fon等作为后缀。

相应的windows静态库通常以.lib结尾,Windows自己就将一些主要的系统功能以动态库模块的形式实现。

Windows动态库在运行时被系统加载到进程的虚拟空间中,使用从调用进程的虚拟地址空间分配的内存,成为调用进程的一部分。DLL也只能被该进程的线程所访问。DLL的句柄可以被调用进程使用;调用进程的句柄可以被DLL使用。

DLL模块中包含各种导出函数,用于向外界提供服务。DLL可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式;一个DLL在内存中只有一个实例;DLL实现了代码封装性;DLL的编制与具体的编程语言及编译器无关,可以通过DLL来实现混合语言编程。DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。

根据调用方式的不同,对动态库的调用可分为静态调用方式和动态调用方式。

(1)静态调用,也称为隐式调用,由编译系统完成对DLL的加载和应用程序结束时DLL卸载的编码(Windows系统负责对DLL调用次数的计数),调用方式简单,能够满足通常的要求。通常采用的调用方式是把产生动态连接库时产生的.LIB文件加入到应用程序的工程中,想使用DLL中的函数时,只须在源文件中声明一下。

LIB文件包含了每一个DLL导出函数的符号名和可选择的标识号以及DLL文件名,不含有实际的代码。Lib文件包含的信息进入到生成的应用程序中,被调用的DLL文件会在应用程序加载时同时加载在到内存中。

(2)动态调用,即显式调用方式,是由编程者用API函数加载和卸载DLL来达到调用DLL的目的,比较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。在Windows系统中,与动态库调用有关的函数包括:

①LoadLibrary(或MFC的AfxLoadLibrary),装载动态库。

②GetProcAddress,获取要引入的函数,将符号名或标识号转换为DLL内部地址。

③FreeLibrary(或MFC的AfxFreeLibrary),释放动态链接库。

在windows中创建动态库也非常方便和简单。在Visual C++中,可以创建不用MFC而直接用C语言写的DLL程序,也可以创建基于MFC类库的DLL程序。每一个DLL必须有一个入口点,在VC++中,DllMain是一个缺省的入口函数。DllMain负责初始化(Initialization)和结束(Termination)工作。

动态库输出函数也有两种约定,分别是基于调用约定和名字修饰约定。DLL程序定义的函数分为内部函数和导出函数,动态库导出的函数供其它程序模块调用。通常可以有下面几种方法导出函数:

①采用模块定义文件的EXPORT部分指定要输入的函数或者变量。

②使用MFC提供的修饰符号_declspec(dllexport)。

③以命令行方式,采用/EXPORT命令行输出有关函数。

在windows动态库中,有时需要编写模块定义文件(.DEF),它是用于描述DLL属性的模块语句组成的文本文件。

见:

[Windows,linux]

举例,请见

有VB,C#,VC++,J#例的链接

阅读剩余
THE END