前言
如题,就是往程序里面注代码,然后实现一些小功能,拿最简单 MessageBox 做个示例
预热
正式加壳之前,记录一些需要掌握的知识
MessageBox()
功能:用于在 Windows 操作系统中弹出一个标准的对话框,显示信息、警告、错误提示等内容。
int MessageBox( HWND hWnd,LPCTSTR lpText, LPCTSTR lpCaption = NULL, UINT nType = MB_OK );
四个参数说明:
hWnd:表示窗口句柄,指定该对话框的所有者窗口;如果该参数为空(0/NULL),则该对话框不属于任何窗口
lpText:字符串,指显示在对话框中的内容
lpCaption:字符串,指对话框的标题;如果此参数为空,则默认使用“错误”作为标题
nType:指定显示按钮的数目及形式,表名使用的图标样式、缺省按钮是什么、以及消息框的强制回应等
注意的点:
- MessageBox() 不是 C 标准库的函数,它是 Windows 操作系统提供的 API 函数,用于弹出标准对话框。
- 通过 C 语言调用时,需要包含 windows.h 头文件,并链接到 user32.dll。当编写一个 Windows 应用程序并调用 MessageBox 时,程序在运行时会动态加载 user32.dll,以调用其中的 MessageBox 函数。如果一个程序中包含 user32.dll,则此程序就有 MessageBox API 函数。
call 与 jmp 指令的硬编码
- call 指令的硬编码:E8 后面跟了 4 个字节(转换后的地址)
- jmp 指令的硬编码:E9 后面跟了 4 个字节(转换后的地址)
由于 call 指令和 jmp 指令后面跟着的是想要去调用的函数地址或者跳转的地址,那 E8 和 E9 后面跟的 4 个字节是不是就是这个地址本身呢?不是!E8 和 E9 后面跟的地址数据是需要转换得到的,下面举例说明:
#include "stdafx.h"
void Function(int a,int b,int c,int d){
}
int main(int argc,char* argv[]){
Function(1,2,3,4);
return 0;
}