- 博客(26)
- 收藏
- 关注
原创 Win32学习笔记(26)远程线程注入
1.什么是注入?所谓注入就是在第三方进程不知道或者不允许的情况下将模块或者代码写入对方进程空间,并设法执行的技术。在安全领域,"注入"是非常重要的的一种技术手段,注入与反注入也一直处于不断变化的,而且也愈来愈激烈地对抗。已知的注入方式:远程线程注入、APC注入、消息钩子注入、注册表注入、导入表注入、输出发注入等等。看一下上图。之前我们说的是,B进程帮A进程创建了一个线程。可是执行的是A进程中的代码,如果我们能执行自己的代码是不是就可以为所欲为了? 那么怎么实现呢?...
2022-03-05 18:41:09 690
原创 Win32学习笔记(25)远程线程
1.线程<1>线程是附属在进程上的执行实体,是代码的执行流程。(一个进程至少有一个线程)<2>代码必须通过线程才能执行这里怎么理解呢?我们用代码演示一下#include "StdAfx.h"#include <stdio.h>void Fun(){ for (int i = 0; i < 10; i++) { Sleep(1000); printf("Fun............\n");.
2022-03-05 18:33:29 502
原创 Win32学习笔记(24)隐式链接
1.隐式链接步骤一: 将.dll .lib文件放到工程目录下在之前使用dll时我们根本没使用.lib文件,因为函数根本不在他里面。他不是静态链接库里的lib文件。但是这里面有着辅助信息,所以我们要使用隐式链接的话就要使用他,来让编译器找到dll。步骤二:将 #pragma comment(lib,"lib名.lib")添加到调用文件中步骤三:加入函数声明(也可以把dll头文件放到目录下)注意:extern "C" _declspec(dllexport) ... .
2022-03-05 18:30:55 768
原创 Win32学习笔记(23)动态链接库
1.什么是动态链接库动态链接库(Dynamic Link Library,缩写为DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。这些库函数的拓展名是".dll",".ocx"我们用OllyDbg随便打开一个exe。点上面的E。可以看到一个exe包含很多dll。而且这些dll都是独立存在的,如果我们使用静态库那么静态库就会和exe在同一个模块里(两者编译到一起).之前所说的静态库的缺点:包含相同的公共代码,造成浪费。我们可以看到,我们打开..
2022-03-05 18:27:50 1073
原创 Win32学习笔记(22)静态链接库
1.编写静态库我们再做一个项目时,不可能都写到一个文件里。最好的办法就是把大项目分成很多份,大家一起来做。所以静态库就是一种软件模块化的一种解决方案。我们创建静态库(我用的vs2019)就选这两个。这四个会给你,我们再创建一个头文件,里面声明一下函数。A.h:#ifndef A_H#define A_H#pragma onceint add(int x, int y);#endifA.cpp:实现#include "A.h"#in...
2022-03-05 18:24:25 338
原创 Win32学习笔记(21)内存映射文件
1.什么是内存映射文件如上图:内存映射文件意思就是吧一个硬盘上的文件映射到物理页上在把物理页映射到虚拟内存上。这样的好处是不必再打开、关闭文件,直接像访问自己的内存一样想读就读想写就写,想要读写文件时候就直接读写内存。还有一个很大的优点就是当文件很大的时候使用这种方式会有很好的性能。下面我们尝试用代码实现介绍下CreateFileMapping()函数,这个可以理解为准备物理内存的。在之前的物理内存中我们也知道,这个函数是来实现多个进程公用物理页的。他还可以把硬盘上的内容映..
2022-03-05 18:19:11 2389
原创 Win32学习笔记(20)文件系统
1.文件系统文件系统时操作系统用于管理磁盘上文件的方法和数据结构;简单点说就是在磁盘上如何组织文件的方法(可以理解为:任何东西存到硬盘上都是0和1不过怎么组织由文件系统决定)文件系统 NTFS FAT32 磁盘分区容量 2T 32G 单个文件容量 4G以上 最大4G EFS加密 支持 不支持 磁盘配额 支持 不支持 那么在哪看我们的硬盘是什么文件系统?就比如我的C盘:我们右键点击属性看到是NTFS。..
2022-03-05 18:09:02 1008
原创 Win32学习笔记(19)私有内存的申请释放
1.申请内存的两种方式:<1>通过VirtualAlloc/VirtualAllocEx(后面会介绍,两者在底层的实现相同)申请的: Private Memory<2>通过CreateFileMapping映射的: Mapped Memory这个图我们已经熟悉了,不过物理页有着Map和Private两种。Map是公有物理页,Private是私有物理页。所以物理内存只分为两种一种是自己独占物理页,一种是和别人共享物理页。2.内存申请与释放:LPV..
2022-03-05 17:57:00 1298
原创 Win32学习笔记(18)虚拟内存与物理内存
1.虚拟内存与物理内存:我们看图:这张图我们都很熟悉。我们知道每个进程有4GB的虚拟内存,比如进程A中的123处存放10,在进程B的123处存放20.他们两个是互不影响的。我们所指的虚拟内存就是指每个进程都有自己4gb的虚拟内存。当我们需要使用123地址处的10时,它就会存到物理内存中。操作系统为了便于管理物理内存,会把物理内存按照4kb大小的单元一页一页的分。(每一页物理内存大小为4kb)也称页式管理。所以说,如上图所示,进程A中的10和进程B中的20储...
2022-03-05 17:51:55 759
原创 Win32学习笔记(17)子窗口
1.子窗口控件:<1>WINDOWS 提供了几个预定义的窗口类以方便我们的使用,我们一般就它们叫做子窗口控件,简称控件<2>控件会自己处理消息,并在自己状态发生改变时通知父窗口。<3>预定义的控件有:按钮、复选框、编辑框、静态字符串标签和滚动条等1.那么什么是预定好的呢?在之前我们创建窗口时候我们必须自己定义窗口是什么样的。不过我们把CreateWindow中第一个参数写成Button 或者 Edit就意味着我么使用了Windows预定义好的子.
2022-03-05 17:49:55 2041
原创 Win32学习笔记(16)消息类型
1.消息的产生与处理流程:如上图,我们在创建窗口程序中详细介绍了这张图。比如,我们点击某个窗口的时候就会产生消息,操作系统会先判断这个消息是点在了哪个窗口,找到窗口后,会根据窗口对象中的一个成员找到窗口是属于哪个线程的。找到后就会把他封装好的消息放到一个结构体中,然后存到消息队列中,那么我们的GetMessage()就会不停地把消息队列中的消息取出。在之前我们创建窗口程序的代码中有(我是截取的)MSG msg;GetMessage(&msg, NULL, 0, 0)我.
2022-01-06 21:40:02 742 1
原创 Win32学习笔记(15)第一个Windows程序
注意:我们创建的是桌面应用程序1.WinMainint WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);解释参数:<1>hInstance:在win32中h开头的通常都是句柄,我们知道各种各样的句柄HANDLE
2022-01-05 18:53:34 874 2
原创 Win32学习笔记(14)消息队列
1.什么是消息?当我们点击鼠标的时候,或者当我们按下键盘的时候,操作系统都要把这些动作记录下来,存储到一个结构体中,这个结构体就是消息。比如我们打开一个窗口,我们用鼠标点,键盘按等动作都会被操作系统收集起来,会把这些信息存储到一个结构体中,这个结构体就是消息。2.消息队列:每个线程只有一个消息队列我们知道进程、线程在内核层都有一个结构体。如图一个进程中有两个线程那么就有两个消息队列,右边那两个线程可以看成两个大的数组,一个大的容器用来存储消息。消息队列是与线程相关的,我们在线.
2022-01-05 18:41:30 674
原创 Win32学习笔记(13)窗口的本质
1.窗口的本质相信大家对这个图都很熟悉 。再用户层中我们知道有exe,dll什么的。他们就是一个个模块。我们其实在用户层使用的这些只是冰山一角,很多东西还是在内核层中实现的。在内核层中也有很多模块。如图,介绍两个最重要的模块:ntoskrnl.exe win32k.sysntoskrnl.exe: 我们在之前学过进程,线程。这些所有和程序运行,编程等概念相关的功能几乎都在ntoskrnl.exe模块中实现。那么我们之前使用的CreateProcess()等等函..
2022-01-04 16:30:27 801
原创 Win32学习笔记(12)事件
1.通知类型:HANDLE CreateEventA( [in, optional] LPSECURITY_ATTRIBUTES lpEventAttributes,//安全描述符 [in] BOOL bManualReset,//填TRUE通知类型填FALSE互斥 [in] BOOL bInitialState,//填TRUE有信号填FALSE无信号,信号在互斥体中我们了解过。.
2021-12-26 20:23:57 738 1
原创 Win32学习笔记(11)互斥体
1.内核级临界资源怎么办?之前我们的临界资源是一个全局变量,它是在同一个进程中由两个或者多个线程共享的,可是如果我们把临界资源放到内核中想要实现跨进程的共享怎么办呢?我们之前实现临界区的时候哪个进程拿到令牌哪个进程就使用临界资源。那么是不是在内核中也类似令牌的东西?2.互斥体的使用我们可以把互斥体看作是内核中的令牌。如图所示:原理:当X线程访问临界资源时会先判断能否访问如果可以访问(得到令牌)那么就可以使用临界资源,这时Y线程判断是否可以访问,肯定是不行的那么Y线程就等待X线.
2021-12-24 20:19:44 836
原创 Win32学习笔记(10)临界区
1.线程安全问题:每个线程都有自己的栈,而局部变量是储存在栈中的,这就意味着每个线程都有一份自己的“局部变量”,如果线程仅仅使用“局部变量”那么就不存在线程安全问题。那如果多个线程共用一个全局变量呢?多线程不一定存在线程安全问题,多线程访问全局变量也不一定有安全问题,多线程如果对全局变量只读那也没有安全问题。那么多线程的线程安全问题的前提是:<1>有全局变量<2>对全局变量不是只读,有写的动作。我写一段代码让两个线程对全局变量同时有写的动作#in.
2021-12-21 17:45:50 492
原创 Win32学习笔记(9)线程控制
1.如何让线程停下来:<1>让自己停下来:Sleep()函数void Sleep( [in] DWORD dwMilliseconds);//停下多少毫秒<2>让别人停下来:SuspendThread()函数:让线程处于阻塞(挂起)不占用CPUDWORD SuspendThread( [in] HANDLE hThread //传线程句柄);线程恢复:ResumeThread()函数DWORD ResumeTh.
2021-12-20 20:07:05 478
原创 Win32学习笔记(8)创建线程
1.什么是线程<1>线程是附属在进程上的执行实体,是代码的执行流程。<2>一个进程可以包含多个线程,但一个进程至少要包含一个线程。我写一个程序#include"stdafx.h"#include<stdio.h>int main(int argc, char argv[]){ for (int i = 0; i < 100; i++) { Sleep(500); printf("------.
2021-12-20 19:56:13 654
原创 Win32学习笔记(7)进程相关API
1.ID与句柄:句柄:就是进程里的私有表里的一个索引。不过除了进程中的句柄表,操作系统也有一个句柄表。称为全局句柄表全局句柄表并不是一个私有的概念,整个操作系统只有一份。全局句柄表至少包含所有的正在运行中的所有的进程和线程。在创建进程的学习中我们知道,CreateProcess()函数中的最后一个参数lpProcessInformation指向PROCESS_INFORMATION结构体,结构体成员中有hProcess;//进程句柄dwProcessId;//进程id那么两者.
2021-12-18 19:01:19 846
原创 Win32学习笔记(6)句柄表
句柄表1.首先我们了解一下什么是内核对象(比如进程、线程):像进程、线程、文件、互斥体、事件等在内核都有一个对应的结构体,这些结构体由内核负责管理。我们管这样的对象叫做内核对象。如图当我们在应用层创建线程,进程等时系统会在内核层为我们创建相应结构体。我们管这种对象叫做内核对象。那么我们怎么知道谁是内核对象,除了直接查找内核对象是谁,我们想要确定这个对象是不是内核对象还可以在官方文档里搜索它。比如:CreateThread()中会发现一个安全描述符: LPSECURITY_ATTRIB
2021-12-17 19:42:46 557
原创 Win32学习笔记(5)创建进程
创建进程:创建进程的时候Windows提供了,CreateProcess()函数。通过官方文档查询CreatProcess()BOOL CreateProcessA( [in, optional] LPCSTR lpApplicationName, [in, out, optional] LPSTR lpCommandLine, [in, optional] LPSECURITY_ATTRIBUTES l...
2021-12-15 21:27:25 506
原创 Win32学习笔记(4)进程的创建过程
进程的创建过程:进程:进程提供程序所需的资源,如:数据,代码等等。随便打开一个exe文件,查看内存布局。这些东西就是进程,进程就是提供数据等等。每个进程都有4GB的虚拟内存,分别是低2G和高2G。低2G是属于这个进程能使用的,高2G是公用的。(比如有十个进程其中低两G是各自占有的,高两G是这十个进程公用的)进程内存空间的地址划分分区 x86 32位Windows 空指针赋值区(不能使用) 0x00000000-0x0000FFFF 用户模式区(用户使用.
2021-12-14 22:50:44 985
原创 Win32学习笔记(3)C语言中的宽字符
c语言中的宽字符使用ASCII编码:可以看到是以一个00结尾,所以”中国“占5个字节使用unicode编码:可以看到是两个00结尾,因为UTF-16的基本单位就是两个字节。所以“中国“占6个字节char wchar_t //多字节字符类型 宽字符类型printf wprintf //打印到控制台函数strlen wcslen //获取长度strcpy wcsc...
2021-12-14 14:47:46 880
原创 Win32学习笔记(2)API中的宽字符
win32 API中的宽字符API就是系统函数。几个重要的DLL:<1>Kernel32.dll:最核心的功能模块,比如管理内存,进程和线程相关的函数等。<2>User32.dll:是Windows用户界面相关应用程序接口,如创建窗口和发送消息等。<3>GDI32.dll:全称是Graphical Device Interface(图形设备接口),包含用于画图和现实文本的函数。在win32API中有很多没见过的定义。比如LPCTSTR,但其实只
2021-12-13 11:10:35 1066
原创 Win32学习笔记(1)字符编码
1.字符编码ASCII编码(0- 7F):一般的英文字符用ASCII就够了,不过还有ASCII拓展表(80-FF)ASCII编码的拓展:GB2312或GB2312-80编码因为汉字太多了,专家们就规定把两个ASCII拓展表中的符号拼到一起组成一个汉字。不过GB2312编码有着明显的弊端就是一个国家规定一个国家的文字对应的编码。有可能你用GB2312编码写一封邮件给国外的朋友,他看到的与你写的就不是一样的。UNICODE编码于是出现了UNICODE编码,它是全世界文
2021-12-12 11:55:30 415 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人