轻松审计代码安全性,Windows 10有妙招

本文讲的是轻松审计代码安全性,Windows 10有妙招,如果你是软件开发人员,又希望自己开发的软件安全性高一点,那么当前的Windows 10企业内部预览版(10.0.16253)中就有一个功能可以做到, 当然我无法保证未来版本中它是否还会存在,但我想这可能对你非常有用。

它的位置在“设置 – > Windows Defender – > Windows Defender安全中心 – >应用程序和浏览器控制 – >漏洞保护设置”中,你可以为整个系统或特定程序启用自定义漏洞利用设置。其中有很多不同的保护特性并且许多都可以在审计模式下打开。在审计模式下,它不是在出现情况时终止进程,而是将事件写入事件日志。对于管理员,这就意味着其会允许软件继续运行,同时能够使我们意识到这一情况是何时发生的。对于希望通过了解这些情况以此来改进产品的人来说,它其实是提供了一个启用安全功能的附加好处,即无需重新编译(在某些情况下),就能告诉你确切的程序代码在当它在运行时遇到问题的位置。在版本10.0.16253中,可以进行审计的保护特性包括:

任意代码保护 - 防止非图像支持的执行代码和代码页修改(例如VirtualAlloc / VirtualProtect创建/修改的代码)
阻止低完整性图像
阻止远程图像
阻止不受信任的字体
代码完整性守护者
禁用Win32k系统调用
不允许子进程
导出地址过滤 - 将功能修补到另一个功能的一个常见方法中的一个步骤
导入地址过滤 - 将功能修补到另一个功能的一个常见方法中的一个步骤
模拟执行
验证API调用(CallerCheck)
验证图像依赖完整性
验证堆栈完整性

要充分利用此功能,我们需要安装Windows Performance Toolkit。它是Windows SDK安装程序的安装选项之一。当您启用了您感兴趣的设置后,打开管理命令提示符并浏览到Windows Performance Toolkit目录(通常为Program Files(x86) Windows Kits  {Version}  Windows Performance Toolkit)。您可以通过运行以下两个命令(在替换文件名所需的任何路径之后)启动并开始收集上述漏洞保护设置的跟踪以及解析堆栈跟踪所需的数据:

xperf - “PROC_THREAD + LOADER”-f“wdeg_klogger.etl”
 
xperf -start“WDEG” - “Microsoft-Windows-Security-Mitigations:0xFFFFFFFFFFFFFF:0xFF:'stack'”-f“wdeg_unmerged.etl”

在您运行任何想要收集的方案之后,您可以停止跟踪并将数据与以下内容合并(再次替换文件名所需的任何路径):

xperf -stop -stop“WDEG”-d“wdeg_merged.etl”

然后,您可以删除创建的前两个文件,因为此时您将拥有第三个所需的所有数据。您可以在Windows Performance Analyzer(WPA)中打开生成的etl文件,并查看数据。如果你不熟悉这个,这里有一个示例预设文件来查看这种数据:

<?xml version="1.0" encoding="utf-8"?>
<WpaProfileContainer xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="2" xmlns="http://tempuri.org/SerializableElement.xsd">
  <Content xsi:type="WpaProfile2">
    <Sessions />
    <Views />
    <ModifiedGraphs>
      <GraphSchema Guid="04f69f98-176e-4d1c-b44e-97f734996ab8">
        <ModifiedPresets>
          <Preset Name="EG Stacks" BarGraphIntervalCount="50" IsThreadActivityTable="false" LeftFrozenColumnCount="5" RightFrozenColumnCount="9" KeyColumnCount="4" GraphColumnCount="10" InitialFilterQuery="[Event Name]:~=&quot;Microsoft-Windows-Security-Miti&quot;" InitialFilterShouldKeep="true" GraphFilterTopValue="0" GraphFilterThresholdValue="0" HelpText="{}{rtf1ansiansicpg1252uc1htmautspdeff2{fonttbl{f0fcharset0 Times New Roman;}{f2fcharset0 Segoe UI;}}{colortblred0green0blue0;red255green255blue255;}lochhichdbchpardplainltrparitap0{lang1033fs18f2cf0 cf0ql{f2 {ltrch Groups all the events by provider, task, and opcode.}li0ri0sa0sb0fi0qlpar}
}
}">
            <Columns>
              <Column Name="Provider Name" Guid="8b4c40f8-0d99-437d-86ab-56ec200137dc" Width="200" IsVisible="true" SortPriority="18" />
              <Column Name="Task Name" Guid="511777f7-30ef-4e86-bd0b-0facaf23a0d3" Width="80" IsVisible="true" SortPriority="19" />
              <Column Name="Event Name" Guid="90fe0b49-e3bb-440f-b829-5813c42108a1" Width="100" IsVisible="false" SortPriority="0" />
              <Column Name="Stack" Guid="26eed6bf-f07d-4bb0-a36f-43a7d3a68828" Width="247" IsVisible="true" SortPriority="0">
                <StackOptionsParameter />
              </Column>
              <Column Name="Message" Guid="0734f1a4-fbd9-4ff6-aec0-cf43875c8253" Width="100" IsVisible="true" SortPriority="0" />
              <Column Name="Process" Guid="7ee6a5ff-1faf-428a-a7c2-7d2cb2b5cf26" Width="150" IsVisible="true" SortPriority="28" />
              <Column Name="ThreadId" Guid="edf01e5d-3644-4dbc-ab9d-f8954e6db6ea" Width="50" IsVisible="true" SortPriority="27" />
              <Column Name="Time" Guid="bbfc990a-b6c9-4dcd-858b-f040ab4a1efe" Width="80" IsVisible="true" SortPriority="29" />
            </Columns>
            <MetadataEntries>
              <MetadataEntry Guid="edf01e5d-3644-4dbc-ab9d-f8954e6db6ea" Name="ThreadId" ColumnMetadata="EndThreadId" />
              <MetadataEntry Guid="bbfc990a-b6c9-4dcd-858b-f040ab4a1efe" Name="Time" ColumnMetadata="StartTime" />
              <MetadataEntry Guid="bbfc990a-b6c9-4dcd-858b-f040ab4a1efe" Name="Time" ColumnMetadata="EndTime" />
            </MetadataEntries>
            <HighlightEntries />
          </Preset>
        </ModifiedPresets>
        <PersistedPresets />
      </GraphSchema>
    </ModifiedGraphs>
  </Content>
</WpaProfileContainer>

您可以使用wpaPreset文件扩展名保存它,在WPA中加载数据,转到我的预设(在WPA的较新版本中的文件 – >窗口 – >我的存在),选择导入,浏览到保存预设的任何地方,选择它,并双击它以显示视图。另外,您还需要加载符号,以充分利用这一点。您可以在WPA中在File-> Configure Symbols下设置符号; 您需要将其指向msdl.microsoft.com/download/symbols上的Microsoft符号服务器以及您的符号服务器(或您没有符号服务器设置的符号文件的位置)。您可以在加载跟踪时自动配置WPA加载符号,但也可以通过转到文件 – >加载符号来手动加载符号。一旦完成,您将能够轻松地查看堆栈跟踪。它就会像下面这样:

以下是在创建上述过程中我为x64控制台应用程序编译的示例代码:

#include <Windows.h>#include <iostream>using namespace std;void* CreateCodeInVirtualMemory(BOOL writable)
{	BYTE code[3] = { 0x33, 0xc0, 0xc3 };	LPVOID result = VirtualAlloc(NULL, sizeof(code), MEM_COMMIT | MEM_RESERVE, writable ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE);	if (result)
	{
		memcpy(result, code, sizeof(code));
	}	else cout << "VirtualAllocEx failed with error " << GetLastError() << endl;	return result;
}void CreateCodeInVirtualMemoryAndExecute(BOOL useWritableMemory)
{	LPTHREAD_START_ROUTINE addr = (LPTHREAD_START_ROUTINE)CreateCodeInVirtualMemory(useWritableMemory);	if (addr)
	{		DWORD result = addr(NULL);
		cout << "Code at 0x" << hex << (void*)addr << " returned " << result << endl;
	}	else cout << "NULL address was not executed" << endl;
}void ExecuteIllegalMemory()
{
	CreateCodeInVirtualMemoryAndExecute(FALSE);
} 
void PrintOptions()
{
	cout << "Enter one of the following options:" << endl;
	cout << "1 - Execute Memory Not Marked As Executable" << endl;
	cout << "2 - Create Code in Virtual Memory" << endl;
	cout << "3 - Create Code in Virtual Memory and Execute" << endl;
	cout << "0 - Exit" << endl;
 
}void DecisionLoop()
{	while (true)
	{		int selection;
		PrintOptions();
		cin >> selection;		switch (selection)
		{			case 0:				return;			case 1:
				ExecuteIllegalMemory();				break;			case 2:
				CreateCodeInVirtualMemory(TRUE);				break;			case 3:
				CreateCodeInVirtualMemoryAndExecute(TRUE);				break;			default:
				cout << "Invalid input" << endl;
		}
	}
}int main()
{
	DecisionLoop();	return 0;
}

在这里我没有去对它的应用做更多的介绍,但我相信我的抛砖引玉一定能够让更多的人对这一功能产生兴趣。

对于在事件查看器中的应用程序和服务日志中找到的大多数内容,您也可以以相同的方式完成此类操作——单击特定日志的属性,它将具有Provider-Name-Parts / LogName形式的名称。您只需要在xperf命令中使用“Provider-Name-Parts”部分即可。

原文发布时间为:2017年8月16日

本文作者:Change 

本文来自合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。

原文链接

时间: 2024-09-11 16:48:02

轻松审计代码安全性,Windows 10有妙招的相关文章

10个妙招对xp系统安全隐患进行设置

  安全的系统能够更好的保障我们的信息,而关闭一些不需要的服务是一个保障安全性的重要方面. 所以,我们就要更全面的来杜绝这些威胁安全的隐患,看看xp系统是如何来杜绝这些隐患,关闭不必要的服务. 妙招一.IIS:微软的互联网信息服务(IIS)提供了将用户的计算机变成一个Web服务器的能力.这项服务可以通过以下方法关闭之:打开"控制面板",找到"添加或删除程序",单击"添加/删除Windows组件",取消选择"Internet信息服务(II

iPhone手机有刮痕怎么办?去除iPhone手机刮痕10大妙招

1.用牙膏去除刮痕 牙膏是日常生活中常用的清洁用品,除了我们每天刷牙保护牙齿外,牙膏也可以用来去除iPhone手机屏幕刮痕哦.在选用牙膏时,只要一般牙膏就可以了,请不要用凝胶类牙膏. 用牙膏去除屏幕刮痕步骤: 第一步,在棉花棒或干净柔软的布料上挤少量的牙膏. 第二步,使用已经涂上牙膏的棉花棒或布料,以圆圈旋转的方式,轻轻擦拭屏幕刮痕处. 第三步,直到屏幕刮痕消失,再将多余的牙膏清除即可. 第四步,再用干净抹布或卫生纸擦干净后,iPhone屏幕还会变得更亮哦. 去除原理:牙膏除了用来刷牙,还具有磨

增加 Windows10系统安全性!Windows 10系统也可以像iPhone手机一样设置输错密码等半年!

我们在日常生活中,手机.平板的密码若输入超过一定次数限制,会有暂时锁定的机制,用以推迟密码被破解的时间,而 Windows 电脑相当宽宏大量,为了怕你一时忘记密码,所以提供给你无限次数的密码输入机会,但同样的别人也有无限次的机会来尝试猜你的密码. 相信很多人都习惯会在电脑上设置密码,以避免其他人来窥视电脑中储存的数据,特别是办公室,电脑里的工作数据可不能外泄,其实 Windows 专业版.企业版与教育版中的「本地组策略编辑器」中就有一个设置登录次数上限的功能,当输入错误密码到你定下的上限时,系统

如何在Windows 10下轻松开启RS2 UWP版文件资源管理器

根据IT圈网友 EvianSemitemos 的介绍,Windows 10用户期待已久的UWP版文件资源管理器已经内置于RS2预览版14936中,只不过默认隐藏.现在该网友给出了开启方法,具体如下: 想要开启现有UWP版文件资源管理器,只需在设置→更新和安全,在开发者选项中开启设备门户,然后在设备门户中就可以开启. 不过目前14936中的该功能尚在早期开发中,基本功能还不完善,感兴趣的朋友尝尝鲜即可. 作者:晨风 来源:51CTO

新版Maps for Windows 10可更轻松驾驭复杂路径

在Windows 10创作者更新中,多款微软核心应用获得了不同程度的升级.本周更新的官方博文中,微软详细介绍了Maps地图应用中的新特性和新功能.在博文的前半部分,方便用户在应用中获得更流畅无缝的使用体验,包括同步不同设备的不同输入方式等.此外为了改善微软地图数据或者纠正错误信息,用户也可以非常方便的向微软提供自己的相关数据. 在输入方面,你能够在地图上使用画笔功能,可以根据用户绘制的路径来计算距离等等.此外这款应用还支持全新的Surface Dial和Narrator功能,此外还提供包括流量在

解决Windows 10恶意软件的Device Guard长什么样?

现在端点再次成为信息安全战争的中心.恶意软件感染每天都在发生,安全团队每天都在努力保护网络免受恶意代码影响.对此,Windows 10企业版引入了各种安全创新技术,例如Windows Hello多因素生物特征身份验证以及Microsoft Passport-目前完全支持FIDO(快速身份认证)联盟标准.其中可阻止恶意代码永久损害Windows 10设备的关键安全控制是Microsoft Device Guard,它可保护核心内核抵御恶意软件.Windows安全专业人士应该了解这个新的安全技术的工

WINDOWS 10 对网页设计的四大影响

  我想最近几天,你应该也被Windows 10给刷屏了.升级还是不升级,这是一个问题.但不论你是XP死忠,还是Win7铁粉,你必须承认以隔代产品靠谱而著称的微软这次发布的Win10可圈可点.从现在开始,微软将停止进行大版本更新的方式,而是采用频繁更新迭代(也许几天就要升级一次)来不断应对新的需求,添加新的功能.(从需求的角度上是不错,但是从微软更新系统的尿性来看,关电脑这件事会更加令人烦躁) 毫无疑问,Windows 10更加强大了,不过这事儿和Mac OS X还多少有点关系.80年代那段关于

在 Windows 10 专业版、企业版或教育版上设置展台

原文: 在 Windows 10 专业版.企业版或教育版上设置展台 Set up a kiosk on Windows 10 Pro, Enterprise, or Education 适用于 Windows 10 正在查找 Windows Embedded 8.1 工业版信息? 请参阅分配的访问权限 一次性设备或展台设备易于在 Windows 10 桌面版中设置. 使用 Windows 配置设计器(Windows 10 版本 1607 或更高版本)中的预配展台设备向导,可以创建预配包,以配置运

Windows 10如何将MBR磁盘转换为GPT

Creators Update 附带了最新的 MBR2GPT 磁盘转换工具,让 Windows 10 可以轻松地从旧版 BIOS 切换到 UEFI,BIOS 是位于主板芯片中的代码,负责帮助操作系统沟通底层硬件,可谓 PC 中最重要的部分之一.计算机使用 BIOS 已经很长一段时间了,但它在当今硬件飞速发展的情况下局限性也逐步突显.例如 BIOS 限制了单个磁盘分区需要小于 2TB,这也就是为什么 UEFI 会被引入的原因. UEFI 取代 BIOS 带来了许多优点,包括更快地启动.睡眠.恢复和