滴水逆向win32学习笔记1
滴水逆向win32学习笔记
一、字符编码
基本介绍
首先介绍了ASCII码,但是除美国外还需要显示其他字符,所以在ASCII码扩展表的基础上引入了GB2312之类的编码。由于每个国家有自己的一套扩展表,所以还是会出现问题。那怎么办呢?
采用unicode编码,编码范围是0-010FFFF,任何一个符号都能在编码表中体现。
关于utf-16、utf-8和unicode的关系
unicode只告诉了字符如何编码,没有解决编码以何种方式存储。举个例子,汉字中
的unicode编码为4E 2D
,另一个汉字的编码为1 AB CD
,或者字符A
的编码为41
,这些字符如何存储呢?
utf-16编码以16位无符号整数为单位,也就是二个字节为一组。如果编码只有一个字节,前面补零。如果有三个字节,那就凑齐四个。中
字utf-16编码。
utf-16这样的存储方式比较简单,但是对于网络传输而言,如果单纯的传输字母数字类,只占一个字节的符号时,会造成空间的浪费(由于补零,导致一个字节变成两个字节)。于是出现了utf-8编码。
utf-8遵循下面的规则:
unicode编码(16进制) | utf-8字节流(二进制) |
---|---|
000000-00007F | 0xxx xxxx |
000080-0007FF | 110x xxxx 10xx xxxx |
000800-00FFFF | 1110 xxxx 10xx xxxx 10xx xxxx |
010000-10FFFF | 1111 0xxx 10xx xxxx 10xx xxxx 10xxxxxx |
首先查看字符在什么范围内,然后进行转换。还是中
字,4E 2D
在000800-00FFFF
范围内,0100 1110 0010 1101
转换的结果就是 1110 0100 1011 1000 1010 1101
,转换成16进制 E4 B8 AD
BOM头
为了让计算机知道一个文件是按照什么方式存储的,需要在文件的头部添加表示,这个东西叫BOM。
utf-8 EF BB BF
utf-16 小端存储 FF FE
utf-16 大端存储 FE FF
二、宽字符
基本介绍
我们在vs中写程序,如果默认的字符集为ASCII,那么在定义一个字符串的时候,会按照gb2312来进行编码。如果使用宽字符集,则使用utf-16,注意字符串结尾
00
占两个字节。
常用函数
char | wchar_t | |
---|---|---|
printf | wprintf | 控制台打印 |
strlen | wcslen | 长度 |
strcpy | wcscpy | 字符串复制 |
strcat | wcscat | 拼接 |
strcmp | wcscmp | 比较 |
strstr | wcsstr | 查找 |
三、Win32 API中的宽字符
什么是win32 API
主要是存放c:\windows\system32
下面的所有dll。64位系统和32位系统都在这个文件夹下,64位系统中32位的dll在C:\Windows\SysWOW64
中。
几个重要的dll
- Kernel32.dll。最核心的功能模块,比如内存管理、进程和线程相关的函数。
- User32.dll。是Windows用户界面相关应用程序接口,如创建窗口和发送消息。
- GDI32.dll。图形设备接口,用于画图和显示文本。
messagebox函数
具体看文档吧,没什么好写的了。