利用winIO3.0进行windows10 64bit端口读取

一、winIO介绍

WinIO程序库允许在32位的Windows应用程序中直接对I/O端口和物理内存进行存取操作。通过使用一种内核模式的设备驱动器和其它几种底层编程技巧,它绕过了Windows系统的保护机制。

WinIo可以到官方网站已经不能用了,以下给出我上传的资源的链接。

其中WINIO.VXD驱动程序用在Win95/98系统上,WinIo.sys驱动程序用在WinNT/2000/XP系统上,WinIo.dll提供了功能函数的调用。

因为需要加载驱动,程序要以管理员权限运行,已经在win10 64验证成功

为了省去动态加载DLL,再动态获取函数地址去调用的麻烦,用官方的DLL源码,编译生成WinIo.lib

现在介绍64bit平台32位应用程序IO操作

二、WinIo64.sys签名

官方有说到:64位版本的Windows只加载设备驱动程序,这些驱动程序由一个公共CA签发的代码签名证书签署,如Verisign、Thawte等。WinIo64 除非获得了代码签名证书,否则系统不能部署在生产机器上。所以呢,你可以通过签名让其正常使用,软件公司都有签名认证,要么就自己去买个签名,要么只能在windows测试模式下用。

1.开启测试模式

Open an elevated command window by right-clicking the icon and clicking “Run as Administrator”.(管理员模式运行CMD)

Type the following command to enable test-signing:(输入以下命令开启测试模式)

bcdedit.exe /set TESTSIGNING ON

Reboot the machine (重启)

对端口的读取可以尝试内联汇编。
开启测试模式的影响:

1.开启测试模式会使系统安全性下降。
2.任何驱动都可加载运行。不管是否有签名。这就给病毒木马可乘之机了。(虽说32位系统驱动有没有签名都无所谓的,但至少不开启测试模式要比开启了安全些)。
3.开启测试模式会使系统稳定性下降。虽说测试模式下可以自定义CPU个数和内存值。但内核运行的稳定性大大降低。

2.安装winIO64.sys
简单点就是开启测试模式,然后安装WinIo64.sys的测试签名
1.打开 WinIO64.sys的属性框,翻到“数字签名”选项卡,点击“详细信息”
2.在新出来的对话框中点击“查看证书”
3.在又新出来的对话框中点击“安装证书”
4.点击“下一步”,然后选择“将所有的证书放入下列存储”
5.点击浏览,选择“受信任的根证书发布机构”

三、编译winIO.lib

1.由于winIO源代码用到了_inp等函数,而这些函数在VS2015后又不支持了,所以用VS2013以下去编译

2.得到WinIo32.dll,WinIo32.lib,WinIo64.dll,WinIo64.lib
如果是64bit平台32应用程序,就用WinIo32.dll,WinIo32.lib,WinIo64.sys

如果是64bit平台64应用程序,就用WinIo64.dll,WinIo64.lib,WinIo64.sys

如果是32bit平台32应用程序,就用WinIo32.dll,WinIo32.lib,WinIo32.sys

如果是32bit平台64应用程序,就用WinIo64.dll,WinIo64.lib,WinIo32.sys

3.提取头文件

#ifndef WINIO_H
#define WINIO_H
 
 
//#include "..\drv\winio_nt.h"//修改如下,然后把winio_nt.h跟winio.h放到一起
 
#include "winio_nt.h"
 
#ifndef WINIO_DLL
#define WINIO_API _declspec(dllimport)
#else
#define WINIO_API 
#endif
 
 
extern "C"
{
  WINIO_API bool _stdcall InitializeWinIo();
  WINIO_API void _stdcall ShutdownWinIo();
  WINIO_API PBYTE _stdcall MapPhysToLin(tagPhysStruct &PhysStruct);
  WINIO_API bool _stdcall UnmapPhysicalMemory(tagPhysStruct &PhysStruct);
  WINIO_API bool _stdcall GetPhysLong(PBYTE pbPhysAddr, PDWORD pdwPhysVal);
  WINIO_API bool _stdcall SetPhysLong(PBYTE pbPhysAddr, DWORD dwPhysVal);
  WINIO_API bool _stdcall GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);
  WINIO_API bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);
  WINIO_API bool _stdcall InstallWinIoDriver(PWSTR pszWinIoDriverPath, bool IsDemandLoaded = false);
  WINIO_API bool _stdcall RemoveWinIoDriver();
}
 
 
extern HANDLE hDriver;
extern bool IsWinIoInitialized;
extern bool g_Is64BitOS;
 
 
bool _stdcall StartWinIoDriver();
bool _stdcall StopWinIoDriver();
 
 
#endif

四、案例

1.源代码,管理员模式

WinIo32.dll,WinIo32.lib,winio.h,winio_nt.h放到编译根目录



#include "stdafx.h"
 
 
#include <windows.h>
 
 
#include "winio.h"               //winio头文件
#pragma comment(lib,"winio32.lib")  //包含winio库
 
 
void main(void)
{
	
 
	
	 
	unsigned short BASE = 0x71;
	int iPort = 2;
	// 初始化WinIo  
	if (!InitializeWinIo())    
	{  
		printf( "Error In InitializeWinIo!\n");
	exit(1);
	}
	int DI_data;
	 DWORD *p=new DWORD;
 
 
	 DI_data = GetPortVal(BASE+iPort,p,4);
	printf("return value= %d\n", DI_data);
	printf("receives the value obtained from the port= %x\n", *p);
	 
	ShutdownWinIo();  //关闭WinIo  
}

2.运行
WinIo32.dll,WinIo64.sys放到程序根目录

现在提供编译好的lib库和案例:https://download.csdn.net/download/jbh_sunshine/11001803

原作者的需要的积分比较多,我的是自己根据作者的方法得到的,所需积分比较少,可以参考一下。

作者:Greless
来源:CSDN
原文:https://blog.csdn.net/greless/article/details/72821876
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值