大的《对 Native API NtSystemDebugControl 的分析 这篇文章》 在这里我们手动跟一下 NtSystemDebugControl 这个函数,测试环境是 XP SP3 键入 u NtSystemDebugControl 如图 6 注意这两个函数 KdpSysReadIoSpace KdpSysWriteIoSpace 原来 NtSystemDebugControl 是调用这两个函数来进行端口读写的 我们再跟一下这两个函数 先跟一下 KdpSysReadIoSpace 这个函数吧 看一下他调用哪 个函数进行端口读写。 u KdpSysReadIoSpace 如图 7 注意图 7 的三个 call 很熟悉的函数吧 nt!_imp READ_PORT_ULONG nt!_imp READ_PORT_USHORT nt!_imp READ_PORT_UCHAR 你再跟一下 KdpSysWriteIoSpace 会发现它其实也是调用三个宏定义来的 WRITE_PORT_UCHAR WRITE_PORT_USHORT WRITE_PORT_ULONG ![]() ![]()
我们总结一下吧 NtSystemDebugControl--->KdpSysReadIoSpace--->三个宏定义 NtSystemDebugControl--->KdpSysWriteIoSpace--->三个宏定义 第四种方法 Ke386QueryAccessMap Ke386SetIoAccessMap Ke386IoSetAccessProcess 由于这个方法看雪的 combojiang 大侠有详细的介绍,再这里不再浪费篇幅详细介绍了大家可以参考这个帖子,介绍的很详细。 http://bbs.pediy.com/showthread.php?p=434124#post434124 第五种方法 WinIo 的使用 最新WinIO3.0 可以从这里下载,http://www.internals.com/ WinIo3.0 里面不自带 lib 文件,可以自己用 VS2008 编译,可能会编译出错,这里我提 供一下我编译后的 lib 文件,见附件。 WinIo 调用的也是六个宏定义,这里为什么拿出篇幅来说这个呢,因为 WinIo 对于各个 版本的 windows 都支持的很好。WIN2000-WIN7 版本都支持,当然 X64 上 WinIo 没有签名, 调用的方法帮助文档里面也说的很清楚,我给出两个示例来说明 WinIo 的使用。 方法 1 使用.lib 文件的时候加载 DLL 代码如下 此方法需要用 VS2008 编译下 winio 得 到 lib 文件 #include "stdio.h" #include "windows.h" #include ".\WinIo\Source\Dll\winio.h" #pragma comment(lib,"WinIo32")//tell the compiler where the file is w WCHAR *str=L".\\WinIo\\Binaries\\WinIo32.sys"; int main() { // HMODULE hlib = LoadLibrary("WinIo32.dll"); //PVOID p = GetProcAddress(hlib , "InitializeWinIo"); bool _stdcall a= InitializeWinIo(); if (a==0) { printf("WinIo 初始化失败"); } else { bool bReta=SetPortVal(0x70,12224344,4); bool bRetb=SetPortVal(0x71,34543534,4); if(bReta&&bRetb) printf("successful"); //关闭 WinIO 驱动 ShutdownWinIo(); } return 0; }; 方法 2 不使用.lib 文件 使用 LoadLibrary 和 GetProcAddress 动态加载 我第一次编译 WinIo 获取 lib 文件的时候失败了,后来把 VS2008 重新修复了一遍编译 成功,鉴于这种情况我给一个动态加载的方法。 #include "stdio.h" #include "windows.h" #include ".\WinIo\Source\Dll\winio.h" //#pragma comment(lib,"WinIo32")//tell the compiler where the file is w //WCHAR *str=L".\\WinIo\\Binaries\\WinIo32.sys"; //bool SetPortVal(WORD wPortAddr,DWORD dwPortVal,BYTE bSize); //void ShutdownWinIo(); typedef bool (_stdcall *bRet1)(); typedef bool (_stdcall *bRet2)(WORD wPortAddr,DWORD dwPortVal,BYTE bSize); typedef void (_stdcall *bVoid)(); int main() { HMODULE h1=::LoadLibrary("WinIo32.dll"); if (h1 !=NULL) { //bool _stdcall InitializeWinIo(); //2 地址 代理函数=(地址)::GetProcAddress(h,"原函数") bRet1 iz=(bRet1)::GetProcAddress(h1,"InitializeWinIo"); if(!iz) { printf("fale in InitializeWinIo GetProcAddress"); } else { bRet2 SPV=(bRet2)::GetProcAddress(h1,"SetPortVal"); if (!SPV) {printf("fale in SetPortVal GetProcAddress");} else { bVoid SD=(bVoid)::GetProcAddress(h1,"ShutdownWinIo"); |