从用户层高地址往下找
高地址:7ffe0000h (用户层可读的最高地址,之后的地址拒绝访问)
一直扫描到最后一块64k起始页面为止, 因此结束地址9999h
每个pe模块都会加载在64k边界的地址上, 因此每次减64k(10000h)
代码中增加了自己修复的重定位信息, 和异常处理;
***** 不要运行在调试环境中 , 否则异常首先被送到debug中
流程:
1.每次在64k的边界上查看是否是一个pe
2.如果是,则找到导出表,如果有导出表,根据名字LoadLibraryA / GetProcAddress 来匹配,
如果有此函数则确定为kernel32.dll
* 这种方式比较傻瓜式 , 只根据一个特征函数名(LoadLibraryA)来搜索
你也可以改成其他在kernel32.dll 中的函数
.386
.model flat, stdcall
option casemap:none
include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include msvcrt.inc
includelib msvcrt.lib
.data
buffer db 256 dup(0)
kernerl32_module dd 0
.const
ADDR_BEGIN equ 7ffe0000h
ADDR_END EQU 9999h
szGetProcAddress db