我的目标是能够运行windows 下的大部分PE格式的程序,这一点通过实验已经证明完全是可行的。
PE格式主要有exe dll sys等文件,这三个文件可以用相同的函数解析,
主要有以下段组成,
1、文件头,包含DOS文件头、PE文件头、段信息等
2、.text区段:包含可执行代码,也称为代码区段。
3、.data区段:包含已初始化的全局和静态变量。
4、.rdata区段:包含只读数据,如常量、字符串等。
5、.bss区段:包含未初始化的全局和静态变量,该区段在文件中不占用空间,只在内存中分配。
6、.idata区段:包含导入表,用于存储程序运行时需要动态链接的外部函数和库的信息。
7、.rsrc区段:包含资源数据,如图标、位图、字符串等。
exe、dll、sys区别主要是入口函数不用,其他基本一样。
因此只需要将文件分段加载至内存,再处理好导入表,还有一些重定位等需要处理,就可以正常运行。
ntoskrnl.exe hal.exe 以及sys加载至内核
ntdll.dll kernel32.dll user32.dll gdi32.dll等加载到用户进程。他们之间做api处理相应调用
用户进程与内核用kiFastSystemCall 调用 ,sysenter_entry 接收内核的调用,并返回用户态。
以上过程均已通过代码实验成功。
现在要处理是驱动程序 sys的加载与调用,主要是内核api的资料比较少,还在试验当中。