windows编程
文章平均质量分 90
kiki商
这个作者很懒,什么都没留下…
展开
-
windbg script learn
从需求出发:定位一个句柄占用导致的文件无法删除的问题:#include <iostream>#include <string>#include <filesystem>#include <windows.h>std::wstring getlineFromConsole(){ std::wstring strRet; std:...原创 2020-04-21 00:18:35 · 572 阅读 · 0 评论 -
IUnknown 必须得是虚表中的第一个指针,必须!!!!!!!!深夜发现bug
https://docs.microsoft.com/en-us/windows/win32/api/unknwn/nn-unknwn-iunknownEnables clients to get pointers to other interfaces on a given object through theQueryInterfacemethod, and manage the...原创 2020-04-18 00:27:41 · 187 阅读 · 0 评论 -
性能分析的技巧
找到低性能的点写好测试代码用好测试工具不要盲目优化,因为优化可能反而导致效率降低,应该瞄准性能瓶颈再下手找到基准版本,即最朴素的实现方法,没有缓存,没有各种优化,然后分析->优化排名前三的时间点->优化直到没有可优化的地方。windows 平台工具推荐:https://blog.csdn.net/qq_18218335/article/details/89484397...原创 2020-03-13 00:11:52 · 170 阅读 · 0 评论 -
windows的writeprivateprofilestring和getprivateprofilestring系列函数,是多进程、多线程安全的
参考资料:wsr,win2k源码,实例验证原创 2019-12-10 19:01:21 · 852 阅读 · 1 评论 -
windows 进程和线程系列翻译
application 由一个或多个process组成。process 对简单的理解就是:一个执行的application。process 的上下文中运行着一个或多个thread。thread是操作系统分配处理器时间的最小单位。thread可以执行进程代码的任意的部分,包括,当前正在被其它thread执行的部分。job 对象允许以许多个process 为单位来进行管理。job 对象是:可命名,...翻译 2018-11-17 17:56:24 · 255 阅读 · 0 评论 -
Windows with C++-----Windows 中线程和I/O 的演变
https://www.codeproject.com/Articles/11976/Win32-Thread-Pool池的概念:资源重用,因为资源的创建费时费力,可重用的话,会带来很大的资源和效率提升。上面的例子是:对于win32 线程池的封装的一个示例代码当你开始一个新的项目,是否问过自己一个问题:这个程序是否是计算密集型或I/O 密集型?这是应该的,我发现,大部分的情况下,总是它...翻译 2018-11-22 00:07:10 · 287 阅读 · 0 评论 -
线程池
线程池是工作线程的集合,可以代表应用程序有效地执行异步回调。线程池主要用于减少应用程序线程的数量并提供工作线程的管理。应用程序可以对工作项进行排队,将工作与可等待的句柄相关联,根据计时器自动排队,并与I / O绑定。线程池体系结构以下应用程序可以从使用线程池中受益:1. 高度并行的应用程序,可以异步分派大量小工作项(例如分布式索引搜索或网络I / O)。2. 一个创建和销毁大量线程...翻译 2018-11-21 00:13:59 · 167 阅读 · 0 评论 -
多线程,创建线程、线程栈大小、线程句柄和标识符(TID)、暂停线程执行
https://docs.microsoft.com/en-us/windows/desktop/procthread/multiple-threads一个线程是一个进程内的可以被调度执行的实体。一个进程内所有的线程共享它的虚拟地址空间和系统资源。每个进程都开始于一个单线程,但它可以从任何它的线程中创建一个额外的线程。创建线程 CreateThread 函数为一个进程创建一个...翻译 2018-11-19 01:04:27 · 749 阅读 · 0 评论 -
多处理器、NUMA 支持,Thread Ordering Service(线程排序服务)?
具有多处理器的计算器通常有两种体系结构:非统一内存访问(NUMA)或对称多处理(SMP)。在NUMA 计算机中,每个处理器比其他处理器更靠近内存的某些部分,使得内存的某些部分的内存访问速度比其他部分更快。在NUMA 模型下,系统尝试在接近正在使用的内存的处理器上调度线程。SMP 计算机中,两个或多个相同的处理器或核心链接到单个共享主存储器。在SMP 模型下,可以将任何线程分配给任何处理器。因此...翻译 2018-11-18 22:49:25 · 1380 阅读 · 0 评论 -
Global系列内存管理函数
MSDN 介绍:Global 函数相比于其它的内存分配函数来说有更大的开销,同时其提供了更少的功能。更建议使用heap 系列的函数进行内存管理。另外,当前Global*** 函数的主要应用场景为:DDE(动态数据交换),剪贴板,OLE 数据对象。其它情况下还是使用Heap 系列的内存管理函数比较好。如果想执行动态生成的代码,需要使用VirtualAlloc 申请内存,然后VirtualProtec...原创 2017-06-26 20:33:58 · 536 阅读 · 0 评论 -
loadlibrary、freelibrary 以及静态链接、动态链接
A.exe->动态链接B.dll B.dll->动态链接C.dll当A.exe 卸载B.dll,C 不被卸载A.exe->动态链接B.dll B.dll->静态链接C.dll当A.exe卸载B.dll,C被卸载由此我们想到一个问题?静态链接和动态链接的区别是什么?原创 2018-03-16 16:39:43 · 882 阅读 · 0 评论 -
dll 加载与卸载的顺序研究
之前写过一篇DLL 加载卸载的文章,不太好,重写一下,更深入一点。两个组或者两个公司独立的开发可能用来组成同一个产品的组件,但是他们必须独立的构建、测试和提交他们的工作。组件粒度很难是正确的且与怎么对组件是最好的这样的问题无关。取而代之的是,一个组件是怎样才能对公司最好(团队不喜欢使用多个dll,且他们想自主的写一个单独的DLL,以便他们的测试人员可以对测试组件所意为的工作量感到满意)以及怎样才对一原创 2018-03-16 10:44:15 · 2532 阅读 · 0 评论 -
使用ProcMon 输出调试信息
https://github.com/Wintellect/ProcMonDebugOutput提供者/*//////////////////////////////////////////////////////////////////////////////// Process Monitor Debug Output Header File//// History:// - April原创 2018-03-14 18:44:51 · 1028 阅读 · 0 评论 -
一款新的壳---Amber----外文翻译
介绍一种新的“打包方法”(packer 这里应该翻译为”壳”:第一个“首款??”反射式PE 打包器”壳“—Amber 由于操作系统内部安全标准的提高以及恶意软件检测技术的突飞猛进,如今的恶意软件作者开始利用内存内执行[由内存执行]代码的透明性。PE文件由内存执行(或者称为无PE 文件执行)就是通过手动完成通常操作系统加载器在执行一个PE 文件时所提供的功能来在内存中执行一个被编译的翻译 2017-11-12 13:43:26 · 891 阅读 · 0 评论 -
多线程的同步执行、多线程和GDI 对象、线程局部存储、在线程中创建窗口、terminiate 线程、线程安全和访问权限
多线程的同步执行为了避免冲突和思索,有必要同步多线程对共享资源的访问。当需要确保以适当的顺序执行相互依赖的代码,同步也是必要的。有一些对象的句柄可以被用来进行同步,这包括:1. 控制台输入缓存2. 事件3. 互斥体4. 进程5. 信号量6. 线程7. 定时器这些对象的状态,或者是有信号,或者没信号。当调用等待函数wait functions,并传入了这些对象中的...翻译 2018-11-19 23:43:32 · 332 阅读 · 0 评论 -
子进程
创建进程https://docs.microsoft.com/en-us/windows/desktop/procthread/creating-processesCreateProcess函数创建一个新进程,该进程独立于创建进程运行。但是,为简单起见,该关系称为父子关系。 以下代码演示了如何创建进程。如果CreateProcess成功,它将返回一个PROCESS_INFORMATIO...翻译 2018-11-20 01:32:00 · 481 阅读 · 0 评论 -
托盘,右键,windows全局快捷键,双击alt,自启动,ui隐藏
// autoselectDlg.cpp : 实现文件//#include "stdafx.h"#include "autoselect.h"#include "autoselectDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg :...原创 2019-06-21 14:50:13 · 1517 阅读 · 0 评论 -
账户枚举相关函数
计算机名称的获取和当前用户名的获取https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getcomputernameexa#include #include#include &lt;Windows.h&gt;#include using namespace std;BOOL e...原创 2019-02-16 21:00:37 · 273 阅读 · 0 评论 -
编码相关的编程实验
前面介绍了编码的基础知识,下面开始实验,最终将总结出相关的通用编码做法。 char szBuffer[] = &amp;amp;amp;quot;汉&amp;amp;amp;quot;; wchar_t wzBuffer[] = L&amp;amp;amp;quot;汉&amp;amp;amp;quot;; TCHAR tzBuffer[] = TEXT(&amp;amp;amp;quot;汉&a原创 2019-01-20 15:59:38 · 593 阅读 · 0 评论 -
Visual Studio 2017 - Windows XP (v141_xp)_多线程 (/MT)_xp_not_a_valid_win32_application问题解决
既然我已经使用了,上述配置,应该没有引用高版本的系统dll中的不存在的函数。查看它的导入表,也如我们所想。后来我看到网上这篇文章:https://blog.csdn.net/ryu2003/article/details/52064925最大的,提醒:版本匹配,pe 中有一个字段,指定了最低支持的系统版本。我们将,平台工具集换成了v141_xp 后,设置如下:我...原创 2018-12-28 11:22:08 · 5865 阅读 · 1 评论 -
windows 上c\c++ 字符处理,wchar,char 那些事
#include<stdio.h>#include<tchar.h>#include<windows.h>#include<locale.h>int main(){ _tsetlocale(LC_CTYPE, TEXT("")); char szBuffer[] = "你好"; wchar_t wzBuffer[] ...原创 2018-12-17 13:46:16 · 1013 阅读 · 0 评论 -
如何解决,virtualKD 加载windbg 后,没有设置符号路径
首先,使用VirtualKD构建双机调试,具体教程在这里:https://blog.csdn.net/coc_k/article/details/52034927在实际使用的时候,发现,每次都得自己手动配置符号的地址,很麻烦,这里我们的解决办法很多,下面的链接给出了,windbg 设置符号的位置的4中办法:https://blog.yowko.com/windbg-symbol-fil...原创 2018-11-26 22:18:05 · 501 阅读 · 1 评论 -
调度
系统调度器通过判断哪个竞争线程得到下一个处理器时间分片来控制多任务。调度器使用调度优先级来决定下一个执行的线程是哪个调度优先级线程基于它们的调度优先级来被调度运行,每个线程都有一个绑定的调度优先级。0~31(最高)。仅仅zero-page线程可以有0 优先级。(zero-page 线程,是当系统中没有其它的线程需要执行的时候,操作系统用来把空闲的页面设置为0的)系统将具有相同优先级的所...翻译 2018-11-18 02:32:51 · 216 阅读 · 0 评论 -
多任务
https://docs.microsoft.com/zh-cn/windows/desktop/ProcThread/multitasking多任务操作系统将可用的处理器时间分配需要它的process 或 thread 上。系统设计为抢占式多任务。它申请处理器时间切片到每个它执行的thread 上。当前执行的thread 的时间切片使用完后,thread 被suspended,允许其它的线程...翻译 2018-11-17 19:48:37 · 931 阅读 · 0 评论 -
ATL 基本介绍
ATL 活动模板库,一系列的基于模板的C++ 类,使得开发COM 对象更加方便,它特别支持了关键的COM 功能,包括库存实现,,双接口,标准COM 枚举器接口,连接点,和ActiveX 控件。如果进行大量的ATL 编程,将有需要了解有关属性的更多信息,这是Visual C++.NET 中旨在简化COM 编程的新功能。ATL 致力于简化创建高效、灵活、轻量的控件的过程。下面示例演示Activ...翻译 2018-11-23 01:36:02 · 1323 阅读 · 0 评论 -
MemoryModule阅读与PE文件解析(一)
参考链接https://github.com/fancycode/MemoryModule本文阅读github 上MemoryModule 代码的同时,介绍PE 文件相关的基础知识。 该项目实现“手动加载DLL”即“实现了自己的LoadLibrary函数”,将DLL 加载到内存中,然后进行常规的DLL 操作。 函数第一步,通过调用LoadLibrary 函数加载DLL 并进行一些常规的原创 2017-10-25 11:05:42 · 3446 阅读 · 0 评论 -
内核模式到用户模式的回调函数----这篇文章是十年前国外大牛写的
内核模式到用户模式的回调函数http://www.nynaeve.net/?p=200 NTDLL 拥有一些特定的函数被内核用来代表用户模式执行特定的功能。尽管理解这些函数对于特定的功能(比如用户模式APC)的底层实现的理解是有用的,这些函数提供的功能非常的简单。 下面是一些NTDLL导出的,内核用于与用户模式通讯的函数: 1.KiUserExceptionDis翻译 2017-10-23 22:38:17 · 8185 阅读 · 0 评论 -
WhoUseMe 驱动实现
前面写过一个应用层的查找谁占用了我们的文件的程序WhoUseMe http://blog.csdn.net/qq_18218335/article/details/62884657 从文中截图可以看出来,普通的应用层程序虽然可以达到枚举句柄的目的,但是对于一部分具有特殊权限的文件及端口句柄来说,调用NtQueryObject函数可能导致线程挂起,对此我们的解决办法是让一个单独的线程执行N原创 2017-07-30 17:55:03 · 686 阅读 · 0 评论 -
Win32线程劫持-Suspend-Inject-Resume
Win32线程劫持-Suspend-Inject-Resume 所谓线程劫持,就是利用目标进程已有的线程执行自己的代码,而不用自己再在目标进程中创建新的线程。其核心就是Suspend(选择目标进程中的一个非等待状态的线程)-Inject(将EIP指向我们已经写入目标进程虚拟地址空间中的代码的起始地址)-Resume(恢复该线程的执行,这样一来目标线程将执行我们的代码),这种方法最关键的一点原创 2017-07-17 21:18:32 · 861 阅读 · 0 评论 -
APC 基本概念及APC注入的实现(Ring3 + Ring0)----实现
APC 基本概念及APC注入的实现(Ring3 + Ring0)—-实现Ring3 原理 利用QueueUserAPC 函数把APC添加到指定可警告线程的APC队列。 其中QueueUserAPC 函数及APC函数声明如下: DWORD WINAPI QueueUserAPC( _In_ PAPCFUNC pfnAPC, _In_ HANDLE原创 2017-07-21 12:40:31 · 2832 阅读 · 0 评论 -
C/C++ 运行库
C/C++ 运行库 任何一个C 程序,它的背后都有一套庞大的代码来进行支撑,以使得该程序能够正常运行。这套代码至少包括入口函数,及其所依赖的函数所构成的函数集合。另外包括各种标准库函数的实现。 这样的一个代码集合称之为运行时库(Runtime Library),C 语言的运行时库,称为 C 运行库(CRT)。 C 运行库大致包含的功能: 启动与退原创 2017-07-08 11:12:35 · 5569 阅读 · 0 评论 -
Drag And Drop 进阶
Drag And Drop 进阶上一篇文章我们介绍了基本的Drag And Drop 编程和其运行机制。为了我们的初衷,自动往打开的explorer 管理窗口发送我们的文件,我们应该想到,如果采用静态的枚举当前所有窗口然后进行独立的操作的话,新生成的资源管理器窗口无法被操作。因此,我们应该想一种方法,即使是新生成的窗口也会运行我们的代码。答案是:窗口钩子。窗口钩子简介SetWi原创 2017-04-17 15:34:32 · 798 阅读 · 0 评论 -
WhoUseMe--枚举句柄查找文件占用
枚举句柄-查找谁占用了我们的文件平时偶尔会遇见文件无法删除的情况,通常使用PE 或者 PH 来查找谁占用了我们的文件,然后有一天就想自己实现查询占用文件情况的功能。占用文件或目录,就会打开文件或目录(加载的DLL例外),然后我们的任务变成:枚举所有的句柄,如果不是自己进程的句柄,先DuplicateObject然后得到句柄类型(或者设置全局的类型数据,然后根据TypeIndex进行类型原创 2017-03-17 11:38:28 · 1608 阅读 · 0 评论 -
Ring3获得所有对象类型
Ring3枚举系统对象类型刚开始想到的方式:NtQueryObject(NULL或者INVALID_HANDLE_VALUE,ObjectTypesInformation,...);#include #include typedef enum _OBJECT_INFORMATION_CLASS{ ObjectBasicInformation, // OBJECT_BASIC_I原创 2017-03-16 13:03:23 · 948 阅读 · 0 评论 -
枚举窗口的两种方法(自己实现 AND API)
#include <Windows.h>#include <stdio.h>// 枚举特定类窗口的所有子窗口,或者特定标题等等void EnumWindows(HWND hParent,LPCSTR szTargetClassName){ // 这种方法获得的窗口可能已经销毁了 CHAR szClass[0x100]; HWND hChild = GetWi...原创 2017-04-10 16:58:28 · 2351 阅读 · 0 评论 -
存储管理相关的基本概念
存储管理相关的基本概念 磁盘:物理的存储设备,分区:磁盘上一组连续扇区的集合,分区表或其他的磁盘管理数据库保存了一个分区的起始扇区、分区的大小和其他的特征,它与该分区在同一个磁盘上简单卷:描述了单个分区中的扇区的对象,文件系统驱动程序的操作单元多分区卷:描述了多个分区中的扇区的对象,文件系统驱动程序的操作单元,相比简单卷,提供了性能、可靠性和尺寸变化方面的特性 在管理一原创 2017-03-11 11:34:12 · 817 阅读 · 0 评论 -
NTFS(文件恢复)最简单情况
NTFS文件恢复(最简单情况)原理:这里我们不深究NTFS 系统的细节,只根据需要了解相关知识。工具:WinHex,DiskExplorer问题一:NTFS 是什么?是Microsoft公司开发的专用文件系统,从Windows NT 3.1开始成为Windows NT家族的标准文件系统(磁盘主要文件系统)。使用更高级的数据结构以提升性能、可靠性和磁盘空间利用率,并附带一系列增强功能原创 2017-02-26 15:37:23 · 10828 阅读 · 10 评论 -
DLL 加载和卸载顺序
程序启动或加载DLL 的时候,加载器构建由该程序/DLL引用的所有DLL 的依赖树。然后程序绝对了DLL 的加载顺序,以确保在当前DLL依赖的DLL 没有被加载的时候,DLL不会被加载,如果发现了循环相依的现象,DLL加载失败,或程序初始化失败。 相反的,在程序终止的时候卸载DLL,依赖其它DLL的DLL 先被卸载,然后其依赖的DLL再被卸载。 B 静态链接 A原创 2017-03-18 13:25:42 · 1032 阅读 · 0 评论 -
X64--线程劫持-Suspend-Inject-Resume
X64–线程劫持-Suspend-Inject-Resume X64与X86 的原理是一样的。这里不做多解释 #include <stdio.h>#include <Windows.h>#include <string.h>#include <Psapi.h>#include <TlHelp32.h>#include <tchar.h>EXTERN_C VOID asm_原创 2017-07-18 16:22:39 · 1617 阅读 · 1 评论 -
监视并控制进程的创建
我们都知道,进程的创建会涉及比较多的行为,从开始的创建进程空间,创建句柄表等内核功能,之后映射可执行文件、主线程的运行,如果我们可以在其中的一个位置做手脚,进程的创建应该就会失败。这里我们使用的是系统回调函数的方法。 基本函数。 // 可以通知我们进程的创建NTSTATUS PsSetCreateProcessNotifyRoutine( IN PCREATE_PROC原创 2017-07-31 00:05:48 · 1099 阅读 · 0 评论