Win32编程
WIN32
malloc函数的底层实现是Win32API
字符编码
-
原始的ASCII编码最多能表示127个符号 0-7F(十六进制) 缺点:表示的符号太少了
-
ASCII编码的扩展:GB2312或GB2312-80(中文) 127-255(7F-80) 缺点:不能沟通(可能出现乱码) 相当于一个汉字两个字节
-
UNICODE编码: 这是一个编码方案,说白了就是一张全世界所有文字的编码表,编码范围:0-0x10ffff可以容纳100多万个符号!
缺点:Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码如何存储。 可能是一个字节,两个字节,三个字节,多了补齐一个字节 -
如何存储UNICODE:UTF-16/UTF-8是Unicode的实现方式
(多数中文,少数英文)
-
UTF-16 编码以16位无符号整数为单位,注意是16位为一个单位,不是一个字符就只有16位,这个要看字符的unicode编码处于什么范围而定,有可能是2个字节,也可能是4个字节现在机器上的unicode编码一般就是指UTF-16 以两个字节为单位进行传输存储,但是传输的话占用空间
-
UTF-8(平时多英文,在网路中传输)
Unicode编码(16进制) 对应的 UTF-8字节流(二进制)
000000-00007F 0xxxxxxx
000080-0007FF 110xxxxx 10xxxxxx
000800-00FFFF 1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
缺点:解析效率低,以一个字节进行解析
3.BOM(Byte Order Mark)
UTF-8 EFBB BF
UTF-16LE(小端存储) FF FE
UTF-16BE(大端存储) FE FF
进程(PID唯一)
进程给提供程序所需要的资源,如:数据、代码等等。空间上的概念。每个进程都有自己一个虚拟的地址空间(00000000-FFFFFFFF)4GB 前64K的没用,80000000-8FFFFFFF 高2G 给内核用
进程内存空间的地址划分
分区 | x86 32bitwindows |
---|---|
空指针赋值区 | 0x00000000-0x0000FFFF |
用户模式区 | 0x00010000-0x7FFEFFFF |
64K禁入区 | 0x7FFF0000-0x7FFFFFFF |
内核 | 0x80000000-0xFFFFFFFF |
进程内的所有所有模块都都遵循一个PE格式,进程就是PE格式文件
进程的创建
1.任何进程都是别的进程创建的:CreateProcess()
2.进程的创建过程
1.映射EXE文件
2.创建内核对象EPROCESS
3.映射系统DLL(ntdll.dll)
4.创建线程内核对象ETHREAD
5.系统启动线程
//DLL注入到目标进程
映射DLL(ntdll.LdrInitializeThunk)
线程开始执行
进程的创建
BOOL CreateProcess(
LPCWSTR pszImageName, //// name of executable module 进程名(完整文件路径)
LPCWSTR pszCmdLine, //命令行
LPSECURITY_ATTRIBUTES psaProcess, //不继承进程句柄 SD进程句柄
LPSECURITY_ATTRIBUTES psaThread, //不继承线程句柄 SD线程句柄
BOOL fInheritHandles, //不继承句柄
DWORD fdwCreate, //没用创建标志
LPVOID pvEnvironment, //使用父进程环境变量
LPWSTR pszCurDir, //使用父进程目录作为当前目录,可以自己设置目录
LPSTARTUPINFOW psiStartInfo, //STARTUPINFO结构体详细信息(启动进程相关信息)
LPPROCESS_INFORMATION pProcInfo//PROCESS_INFORMATION结构体进程信息(进程ID、线程ID、进程句柄、线程句柄)
);
CreateProcess函数的了解就是前2个参数和后2个参数,前两个参数:lpApplicationName、
lpCommandLine,第一个是需要启动的进程文件路径,第二个是命令行参数,如果你启动的进程有参数的可以可以传入。