<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[wzprabbit的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/wzprabbit</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; wzprabbit]]></copyright><item><title><![CDATA[Win32学习笔记(26)远程线程注入]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/123298990</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/123298990</guid><author>wzprabbit</author><pubDate>Sat, 05 Mar 2022 18:41:09 +0800</pubDate><description><![CDATA[1.什么是注入？


所谓注入就是在第三方进程不知道或者不允许的情况下将模块或者代码写入对方进程空间，并设法执行的技术。

在安全领域，"注入"是非常重要的的一种技术手段，注入与反注入也一直处于不断变化的，而且也愈来愈激烈地对抗。

已知的注入方式：

远程线程注入、APC注入、消息钩子注入、注册表注入、导入表注入、输出发注入等等。









看一下上图。之前我们说的是，B进程帮A进程创建了一个线程。可是执行的是A进程中的代码，如果我们能执行自己的代码是不是就可以为所欲为了？ 那么怎么实现呢？...]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(25)远程线程]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/123298950</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/123298950</guid><author>wzprabbit</author><pubDate>Sat, 05 Mar 2022 18:33:29 +0800</pubDate><description><![CDATA[1.线程


&lt;1&gt;线程是附属在进程上的执行实体，是代码的执行流程。(一个进程至少有一个线程)

&lt;2&gt;代码必须通过线程才能执行

这里怎么理解呢？我们用代码演示一下


#include "StdAfx.h"
#include &lt;stdio.h&gt;
void Fun()
{
    for (int i = 0; i &lt; 10; i++)
    {
        Sleep(1000);
        printf("Fun............\n");.]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(24)隐式链接]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/123298907</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/123298907</guid><author>wzprabbit</author><pubDate>Sat, 05 Mar 2022 18:30:55 +0800</pubDate><description><![CDATA[1.隐式链接


步骤一: 将.dll .lib文件放到工程目录下

在之前使用dll时我们根本没使用.lib文件，因为函数根本不在他里面。他不是静态链接库里的lib文件。

但是这里面有着辅助信息,所以我们要使用隐式链接的话就要使用他，来让编译器找到dll。



步骤二:将 #pragma comment(lib,"lib名.lib")添加到调用文件中



步骤三:加入函数声明(也可以把dll头文件放到目录下)



注意:

extern "C" _declspec(dllexport) ... .]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(23)动态链接库]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/123298869</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/123298869</guid><author>wzprabbit</author><pubDate>Sat, 05 Mar 2022 18:27:50 +0800</pubDate><description><![CDATA[1.什么是动态链接库


动态链接库(Dynamic Link Library,缩写为DLL)，是微软公司在微软Windows操作系统中，实现共享函数库概念的一种方式。

这些库函数的拓展名是".dll",".ocx"

我们用OllyDbg随便打开一个exe。点上面的E。







可以看到一个exe包含很多dll。而且这些dll都是独立存在的，如果我们使用静态库那么静态库就会和exe在同一个模块里(两者编译到一起).之前所说的静态库的缺点:包含相同的公共代码，造成浪费。

我们可以看到，我们打开..]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(22)静态链接库]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/123298808</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/123298808</guid><author>wzprabbit</author><pubDate>Sat, 05 Mar 2022 18:24:25 +0800</pubDate><description><![CDATA[1.编写静态库


我们再做一个项目时，不可能都写到一个文件里。最好的办法就是把大项目分成很多份，大家一起来做。所以静态库就是一种软件模块化的一种解决方案。

我们创建静态库(我用的vs2019)







就选这两个。







这四个会给你，我们再创建一个头文件，里面声明一下函数。

A.h：


#ifndef A_H
#define A_H
#pragma once
int add(int x, int y);
#endif

A.cpp：实现


#include "A.h"
#in...]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(21)内存映射文件]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/123298697</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/123298697</guid><author>wzprabbit</author><pubDate>Sat, 05 Mar 2022 18:19:11 +0800</pubDate><description><![CDATA[1.什么是内存映射文件








如上图：内存映射文件意思就是吧一个硬盘上的文件映射到物理页上在把物理页映射到虚拟内存上。

这样的好处是不必再打开、关闭文件，直接像访问自己的内存一样想读就读想写就写，想要读写文件时候就直接读写内存。还有一个很大的优点就是当文件很大的时候使用这种方式会有很好的性能。

下面我们尝试用代码实现

介绍下CreateFileMapping()函数，这个可以理解为准备物理内存的。在之前的物理内存中我们也知道，这个函数是来实现多个进程公用物理页的。他还可以把硬盘上的内容映..]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(20)文件系统]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/123298545</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/123298545</guid><author>wzprabbit</author><pubDate>Sat, 05 Mar 2022 18:09:02 +0800</pubDate><description><![CDATA[1.文件系统


文件系统时操作系统用于管理磁盘上文件的方法和数据结构；简单点说就是在磁盘上如何组织文件的方法(可以理解为:任何东西存到硬盘上都是0和1不过怎么组织由文件系统决定)

文件系统
			NTFS
			FAT32
		磁盘分区容量
			2T
			32G
		单个文件容量
			4G以上
			最大4G
		EFS加密
			支持
			不支持
		磁盘配额
			支持
			不支持
		那么在哪看我们的硬盘是什么文件系统？

就比如我的C盘：我们右键点击属性





看到是NTFS。..]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(19)私有内存的申请释放]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/123298472</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/123298472</guid><author>wzprabbit</author><pubDate>Sat, 05 Mar 2022 17:57:00 +0800</pubDate><description><![CDATA[1.申请内存的两种方式：


&lt;1&gt;通过VirtualAlloc/VirtualAllocEx（后面会介绍，两者在底层的实现相同）申请的: Private Memory

&lt;2&gt;通过CreateFileMapping映射的: Mapped Memory





这个图我们已经熟悉了，不过物理页有着Map和Private两种。Map是公有物理页，Private是私有物理页。所以物理内存只分为两种一种是自己独占物理页，一种是和别人共享物理页。


2.内存申请与释放：



LPV..]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(18)虚拟内存与物理内存]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/123298435</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/123298435</guid><author>wzprabbit</author><pubDate>Sat, 05 Mar 2022 17:51:55 +0800</pubDate><description><![CDATA[1.虚拟内存与物理内存：


我们看图：







这张图我们都很熟悉。我们知道每个进程有4GB的虚拟内存，比如进程A中的123处存放10，在进程B的123处存放20.他们两个是互不影响的。我们所指的虚拟内存就是指每个进程都有自己4gb的虚拟内存。

当我们需要使用123地址处的10时，它就会存到物理内存中。

操作系统为了便于管理物理内存，会把物理内存按照4kb大小的单元一页一页的分。（每一页物理内存大小为4kb）也称页式管理。







所以说，如上图所示，进程A中的10和进程B中的20储...]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(17)子窗口]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/123298329</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/123298329</guid><author>wzprabbit</author><pubDate>Sat, 05 Mar 2022 17:49:55 +0800</pubDate><description><![CDATA[1.子窗口控件：


&lt;1&gt;WINDOWS 提供了几个预定义的窗口类以方便我们的使用，我们一般就它们叫做子窗口控件，简称控件

&lt;2&gt;控件会自己处理消息，并在自己状态发生改变时通知父窗口。

&lt;3&gt;预定义的控件有：

按钮、复选框、编辑框、静态字符串标签和滚动条等

1.那么什么是预定好的呢？在之前我们创建窗口时候我们必须自己定义窗口是什么样的。不过我们把

CreateWindow中第一个参数写成Button 或者 Edit就意味着我么使用了Windows预定义好的子.]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(16)消息类型]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/122353304</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/122353304</guid><author>wzprabbit</author><pubDate>Thu, 06 Jan 2022 21:40:02 +0800</pubDate><description><![CDATA[1.消息的产生与处理流程：






如上图，我们在创建窗口程序中详细介绍了这张图。比如，我们点击某个窗口的时候就会产生消息，操作系统会先判断这个消息是点在了哪个窗口，找到窗口后，会根据窗口对象中的一个成员找到窗口是属于哪个线程的。找到后就会把他封装好的消息放到一个结构体中，然后存到消息队列中，那么我们的GetMessage()就会不停地把消息队列中的消息取出。

在之前我们创建窗口程序的代码中有（我是截取的）


MSG msg;
GetMessage(&amp;msg, NULL, 0, 0)

我.]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(15)第一个Windows程序]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/122329718</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/122329718</guid><author>wzprabbit</author><pubDate>Wed, 05 Jan 2022 18:53:34 +0800</pubDate><description><![CDATA[注意：我们创建的是桌面应用程序


1.WinMain



int WINAPI wWinMain(HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    PWSTR pCmdLine, 
                    int nCmdShow);

解释参数:

&lt;1&gt;hInstance:

在win32中h开头的通常都是句柄，我们知道各种各样的句柄


HANDLE]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(14)消息队列]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/122329584</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/122329584</guid><author>wzprabbit</author><pubDate>Wed, 05 Jan 2022 18:41:30 +0800</pubDate><description><![CDATA[1.什么是消息？


当我们点击鼠标的时候，或者当我们按下键盘的时候，操作系统都要把这些动作记录下来，存储到一个结构体中，这个结构体就是消息。

比如我们打开一个窗口，我们用鼠标点，键盘按等动作都会被操作系统收集起来，会把这些信息存储到一个结构体中，这个结构体就是消息。


2.消息队列：每个线程只有一个消息队列




我们知道进程、线程在内核层都有一个结构体。

如图一个进程中有两个线程那么就有两个消息队列，右边那两个线程可以看成两个大的数组，一个大的容器用来存储消息。消息队列是与线程相关的，我们在线.]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(13)窗口的本质]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/122305673</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/122305673</guid><author>wzprabbit</author><pubDate>Tue, 04 Jan 2022 16:30:27 +0800</pubDate><description><![CDATA[1.窗口的本质








相信大家对这个图都很熟悉 。再用户层中我们知道有exe，dll什么的。他们就是一个个模块。我们其实在用户层使用的这些只是冰山一角，很多东西还是在内核层中实现的。在内核层中也有很多模块。





如图，介绍两个最重要的模块：ntoskrnl.exe win32k.sys

ntoskrnl.exe:


  我们在之前学过进程，线程。这些所有和程序运行，编程等概念相关的功能几乎都在
ntoskrnl.exe模块中实现。那么我们之前使用的CreateProcess()等等函..]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(12)事件]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/122160108</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/122160108</guid><author>wzprabbit</author><pubDate>Sun, 26 Dec 2021 20:23:57 +0800</pubDate><description><![CDATA[1.通知类型：



HANDLE CreateEventA(
  [in, optional] LPSECURITY_ATTRIBUTES lpEventAttributes,//安全描述符
  [in]           BOOL                  bManualReset,//填TRUE通知类型填FALSE互斥
  [in]           BOOL                  bInitialState,//填TRUE有信号填FALSE无信号，信号在互斥体中我们了解过。.]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(11)互斥体]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/122135216</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/122135216</guid><author>wzprabbit</author><pubDate>Fri, 24 Dec 2021 20:19:44 +0800</pubDate><description><![CDATA[1.内核级临界资源怎么办？


之前我们的临界资源是一个全局变量，它是在同一个进程中由两个或者多个线程共享的，可是如果我们把临界资源放到内核中想要实现跨进程的共享怎么办呢？我们之前实现临界区的时候哪个进程拿到令牌哪个进程就使用临界资源。那么是不是在内核中也类似令牌的东西？


2.互斥体的使用


我们可以把互斥体看作是内核中的令牌。



如图所示：

原理：当X线程访问临界资源时会先判断能否访问如果可以访问（得到令牌）那么就可以使用临界资源，这时Y线程判断是否可以访问，肯定是不行的那么Y线程就等待X线.]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(10)临界区]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/122069764</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/122069764</guid><author>wzprabbit</author><pubDate>Tue, 21 Dec 2021 17:45:50 +0800</pubDate><description><![CDATA[1.线程安全问题：


每个线程都有自己的栈，而局部变量是储存在栈中的，这就意味着每个线程都有一份自己的“局部变量”，如果线程仅仅使用“局部变量”那么就不存在线程安全问题。

那如果多个线程共用一个全局变量呢？

多线程不一定存在线程安全问题，多线程访问全局变量也不一定有安全问题，多线程如果对全局变量只读那也没有安全问题。

那么多线程的线程安全问题的前提是：

&lt;1&gt;有全局变量

&lt;2&gt;对全局变量不是只读，有写的动作。

我写一段代码让两个线程对全局变量同时有写的动作


#in.]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(9)线程控制]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/122049057</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/122049057</guid><author>wzprabbit</author><pubDate>Mon, 20 Dec 2021 20:07:05 +0800</pubDate><description><![CDATA[1.如何让线程停下来：




&lt;1&gt;让自己停下来：

Sleep()函数


void Sleep(
  [in] DWORD dwMilliseconds
);//停下多少毫秒

&lt;2&gt;让别人停下来：

SuspendThread()函数：让线程处于阻塞（挂起）不占用CPU


DWORD SuspendThread(
  [in] HANDLE hThread       //传线程句柄
);

线程恢复：

ResumeThread()函数


DWORD ResumeTh.]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(8)创建线程]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/122048890</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/122048890</guid><author>wzprabbit</author><pubDate>Mon, 20 Dec 2021 19:56:13 +0800</pubDate><description><![CDATA[1.什么是线程


&lt;1&gt;线程是附属在进程上的执行实体，是代码的执行流程。

&lt;2&gt;一个进程可以包含多个线程，但一个进程至少要包含一个线程。

我写一个程序


#include"stdafx.h"
#include&lt;stdio.h&gt;
int main(int argc, char argv[])
{
    for (int i = 0; i &lt; 100; i++)
    {
        Sleep(500);
        printf("------.]]></description><category></category></item><item><title><![CDATA[Win32学习笔记(7)进程相关API]]></title><link>https://blog.youkuaiyun.com/wzprabbit/article/details/122015650</link><guid>https://blog.youkuaiyun.com/wzprabbit/article/details/122015650</guid><author>wzprabbit</author><pubDate>Sat, 18 Dec 2021 19:01:19 +0800</pubDate><description><![CDATA[1.ID与句柄：


句柄：就是进程里的私有表里的一个索引。

不过除了进程中的句柄表，操作系统也有一个句柄表。称为全局句柄表

全局句柄表并不是一个私有的概念，整个操作系统只有一份。全局句柄表至少包含所有的正在运行中的所有的进程和线程。

在创建进程的学习中我们知道，CreateProcess()函数中的最后一个参数lpProcessInformation指向PROCESS_INFORMATION结构体，结构体成员中有


hProcess;//进程句柄
dwProcessId;//进程id

那么两者.]]></description><category></category></item></channel></rss>