零基础逆向工程27_Win32_01_宽字符_MessageBox_win32调试输出
1 多字节字符
ASCII码表:0 ~ 2^7-1
扩展ASCII码表:2^7 ~ 2^8-1
什么是GB2312:1980年,两个字节存储一个汉字;不通用,别国会有乱码。
UCICODE:只有一个字符集;每个字符都是16位宽。
2 C语言中的宽字符
2.1 宽字符的使用
"中"字的编码:
ASCII:d6 d0
UNICODE:4e 2d
char x = '中'; //汇编代码中出现的是d0
wchar_t x1 = '中'; //汇编代码中出现的是d0 d6
wchar_t x1 = L'中'; //告诉编译器我们要使用的是Unicode的那张表; 汇编代码4e 2d
2.2 宽字符串的使用
char x[] = "中国";
//d6 d0 b9 fa 00 使用拓展ASCII编码表 以00(\0)结尾
wchar_t x1[] = L"中国";
//2d 4e fd 56 00 00 使用UNICODE编码表 以00 00(\0\0)结尾
2.3 在控制台打印
char x[] = "中国";
wchar_t x1[] = L"中国";
printf("%s\n",x); //使用控制台默认的编码
wprintf(L"%s\n",x1); //默认使用英文
告诉编译器,使用控制台默认的编码格式
(1) 包含头文件 #include <locale.h>
(2) setlocale(LC_ALL,""); //使用控制台默认的编码
2.4 字符串长度(头文件:#include<string.h>
)
char x[] = "中国";
wchar_t x1[] = L"中国";
strlen(x); //取得多字节字符串中字符长度,不包含 00
wcslen(x1); //取得多字节字符串中字符长度,不包含 00 00
2.5 字符串复制
char x[] = "china";
char x1[] = "123";
strcpy(x,x1);
wchar_t y[] = L"中国";
wchar_t y1[] = L"好";
wcscpy(y,y1);
C语言中的宽字符和多字符
char wchar_t //多字节字符类型 宽字符类型
printf wprintf //打印到控制台函数
strlen wcslen //获取长度
strcpy wcscpy //字符串复制
strcat wcscat //字符串拼接
strcmp wcscmp //字符串比较
strstr wcsstr //字符串查找
3 Win32 API中的宽字符
3.1 什么是Win32 API?有哪些?在哪里?
主要是存放在 C:\WINDOWS\system32 下面所有的dll
3.2 非常重要的几个DLL
Kernel32.dll:最核心的功能模块,比如管理内存、进程和线程相关的函数等.
User32.dll:是Windows用户界面相关应用程序接口,如创建窗口和发送消息等.
GDI32.dll:全称是Graphical Device Interface(图形设备接口),包含用于画图和显示文本的函数
比如要显示一个程序窗口,就调用了其中的函数来画这个窗口
3.3 Win32 API中的宽字符和多字节字符
Windows是使用C语言开发的,Win32 API同时支持宽字符与多字节字符.
(1) 字符类型 | (2) 字符串指针 |
---|---|
char CHAR | PSTR(LPSTR) 指向多字节字符串 |
wchar_t WCHAR | PWSTR(LPWSTR) 指向宽字符串 |
宏 TCHAR | 宏 PTSTR(LPTSTR) |
字符数组赋值
CHAR cha[] = "中国";
WCHAR chw[] = L"中国";
TCHAR cht[] = TEXT("中国");
为字符串指针赋值:
PSTR pszChar = "china"; //多字节字符
PWSTR pszWChar = L"china"; //宽字符
PTSTR pszTChar = TEXT("china"); //如果项目是ASCII的 相当于"china" UNICODE 相当于L"china"
3.4 各种版本的MessageBox
MessageBoxA(0,"内容多字节","标题",MB_OK);
MessageBoxW(0,L"内容宽字节",L"标题",MB_OK);
MessageBox(0,TEXT("根据项目字符集决定"),TEXT("标题"),MB_OK);
Windows提供的API 凡是需要传递字符串参数的函数,都会提供两个版本和一个宏.
4 Win32的入口程序
int CALLBACK WinMain(
_In_ HINSTANCE hInstance,
_In_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow
)
{
return 0;
}
参数:
hInstance:
表示该程序当前运行的实例句柄,是一个数值标识。当程序在Windows下运行时,它唯一标识运行中的实例(注意,只有运行中的程序实例,才有实例句柄)。一个应用程序可以运行多个实例,每运行一个实例,系统都会给该实例分配一个实例句柄,并通过hInstance参数传递给WinMain函数。
hPrevInstance:
表示当前实例的前一个实例的句柄。通过查看MSDN我们可以知道,在Win32环境下,这个参数总是NULL,即在Win32环境下,这个参数不再起作用。
lpCmdLine:
是一个以空字符结尾的字符串,内容为命令行的参数。
nCmdShow:
指定程序的窗口应该如何显示,例如最大化、最小化、隐藏等。这个参数的值由该程序的调用者所指定,应用程序通常不需要去理会这个参数的值。
5 在Win32程序中打印信息
.h
void __cdecl OutputDebugStringF(const char *format, ...);
#ifdef _DEBUG
#define DbgPrintf OutputDebugStringF
#else
#define DbgPrintf
#endif
.cpp
void __cdecl OutputDebugStringF(const char *format, ...)
{
va_list vlArgs;
char *strBuffer = (char*)GlobalAlloc(GPTR, 4096);
va_start(vlArgs, format);
_vsnprintf(strBuffer, 4096 - 1, format, vlArgs);
va_end(vlArgs);
strcat(strBuffer, "\n");
OutputDebugStringA(strBuffer);
GlobalFree(strBuffer);
return;
}
以后调试win32程序,同样可以使用DbgPrintf()函数来打印测试信息。
6 GetLastError的使用
TCHAR szContent[] = TEXT("内容");
TCHAR szTitle[] = TEXT("标题");
MessageBox((HWND)0,szContent,szTitle,MB_OK);
DWORD errorCode = GetLastError();
可以查看errorCode中的值,查到错误原因(在msdn中查)
零基础逆向工程27_Win32_01_宽字符_MessageBox_win32调试输出的更多相关文章
- 零基础逆向工程20_PE结构04_任意节空白区_新增节_扩大节添加代码
向代码节添加代码实现 作者经过一周不断的失败,再思考以及无数次调试终于实现. 思路:八个步骤 1. 文件拷到文件缓冲区(FileBuffer) //图示见(零基础逆向工程18之PE加载过程) 2. 文 ...
- 零基础逆向工程33_Win32_07_创建线程
1 什么是线程(Threads)? 什么是多线程? 怎么在windows中观察多线程? 线程可以简单理解为主程序为解决一个问题而选择的其中一条路线. 同理,多线程就是同时选择不同的路线来解决此问题. ...
- 零基础逆向工程21_PE结构05_数据目录表_导出表
数据目录 1.我们所了解的PE分为头和节,在每个节中,都包含了我们写的一些代码和数据,但还有一些非常重要 的信息是编译器替我们加到PE文件中的,这些信息可能存在在任何可以利用的地方. 2.这些信息之所 ...
- 零基础逆向工程16_C语言10_宏定义_头文件_内存分配_文件读写
#define 无参数的宏定义的一般形式为:#define 标识符 字符序列 如:#define TRUE 1 注意事项: 1.之作字符序列的替换工作,不作任何语法的检查 2.如果宏定义不当,错误要到 ...
- 零基础逆向工程40_Win32_14_枚举窗口_模拟鼠标键盘
1 查找窗口 1.1 代码案例 //查找指定窗口 TCHAR szTitle[MAX_PATH] = {0}; HWND hwnd = ::FindWindow(TEXT("#32770&q ...
- 零基础逆向工程39_Win32_13_进程创建_句柄表_挂起方式创建进程
1 进程的创建过程 打开系统 --> 双击要运行的程序 --> EXE开始执行 步骤一: 当系统启动后,创建一个进程:Explorer.exe(也就是桌面进程) 步骤二: 当用户双击某一个 ...
- 零基础逆向工程38_Win32_12_信号量_线程控制小结
1 信号量 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用.[百度百科] 1.1 创建信号量 HANDLE Create ...
- 零基础逆向工程37_Win32_11_事件_线程同步
1 内核对象 前面已经学过线程和互斥体两个内核对象.此节讲了事件这个内核对象.前面提出了内核对象这个概念,可能不太清晰,简单来说内核对象就是系统层的东西. 1.1 小结内核对象: 进程.线程.事件.互 ...
- 零基础逆向工程36_Win32_10_互斥体_互斥体与临界区的区别
1 引言 讲了第二个内核对象,互斥体.前面已经学过一个内核对象,线程.这节讲两个函数,WaitForSingleObject()和WaitForMultipleObjects().因此这两个函数是根据 ...
随机推荐
- DOS查看端口占用及杀掉进程命令
转载自:http://www.cnblogs.com/rainman/p/3457227.html 1. 查看端口占用 在windows命令行窗口下执行: netstat -aon|findstr & ...
- JSP有哪些动作?
JSP使用动作来动态的插入文件,实现重定向和对JavaBean的引用等功能.它公有6个基本动作:jsp:include,jsp:useBean,jsp:setProperty,jsp:getPrope ...
- 使用Paramiko的问题
在使用Paramiko远程登录的时候,会报sudo: sorry, you must have a tty to run sudo 切换到root用户,使用visudo命令,然后就会打开一个文本,在文 ...
- CSS定位机制总结
1,CSS 有三种基本的定位机制:普通流.浮动和绝对定位.除非专门指定,否则所有框都在普通流中定位.2,普通流定位:块级框从上到下一个接一个地排列,框之间的垂直距离是由框的垂直外边距计算出来.行内框在 ...
- C#类和类的实例
类 ,顾名思义就是分类.类别的意思.我们要面向对象编程,就需要对不同的事物进行分类.类可以说是.net面向对象的核心. 类:就是具有相同的属性和功能的对象的抽象的集合. 1.类的定义 <访问修 ...
- ProtoBuf练习(六)
JSON类型 工程目录结构 $ ls proto/ proto文件 $ cat proto/style.proto syntax = "proto3"; import " ...
- 51nod1489(dfs)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1489 题意:中文题诶- 思路:dfs 首先我们要通过攻击第1 ...
- Android代码笔记
1. 如何监听Android的短信收发,自动填充验证码? getContentResolver().registerContentObserver(Uri.parse(SMS_URI_ALL), tr ...
- PAT天梯赛L3-007 天梯地图
题目链接:点击打开链接 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至 ...
- AddDemo教学演示