ShellCode加载 - 回调函数加载
1、基于回调函数加载
- 基于回调函数加载shellcode:本质是通过调用Windows的某些API或函数,这些函数能接受一个回调函数作为参数,并在某些条件下调用该函数
1.1、EnumFontFamiliesExA 函数
- 函数介绍:EnumFontFamiliesEx 函数枚举系统中与 LOGFONT 结构指定的字体特征匹配的所有唯一命名字体。 EnumFontFamiliesEx 基于字号名称、字符集或两者枚举字体。
- 函数语法
int EnumFontFamiliesExA(
[in] HDC hdc, //用于枚举字体的设备上下文的句柄。
[in] LPLOGFONTA lpLogfont, // 指向 LOGFONT 结构的指针,其中包含要枚举的字体的相关信息。
[in] FONTENUMPROCA lpProc, // 指向应用程序定义的回调函数的指针。
[in] LPARAM lParam, // 应用程序定义值。 该函数将此值传递给回调函数以及字体信息。
DWORD dwFlags // 此参数未使用,必须为零。
);
1.2、通过该函数加载shellcode
#include <windows.h>
#include <iostream>
// 示例 shellcode,仅打印一条消息
void shellcode() {
std::cout << "Shellcode executed!" << std::endl;
ExitThread(0); // 结束当前线程,以防止后续回调
}
// 字体枚举回调
int CALLBACK FontEnumProc(
const LOGFONTA *lpelf, // 指向逻辑字体结构的指针
const TEXTMETRICA *lptm, // 指向文本度量结构的指针
DWORD FontType, // 字体类型
LPARAM lParam // shellcode 地址
) {
void (*func)() = (void (*)())lParam;
func();
return 1; // 如果返回0,则枚举将在此处停止
}
int main() {
LOGFONTA logFont = {0};
logFont.lfCharSet = DEFAULT_CHARSET; // 枚举所有字符集的字体
// 调用 EnumFontFamiliesExA,并将 shellcode 地址作为回调函数的参数
EnumFontFamiliesExA(GetDC(NULL), &logFont, FontEnumProc, (LPARAM)shellcode, 0);
return 0;
}
版权所有:Ljierui'Blog
文章标题:ShellCode加载 - 回调函数加载
文章链接:https://fuckdog.org/post-25.html
本站文章均为原创,未经授权请勿用于任何商业用途
文章标题:ShellCode加载 - 回调函数加载
文章链接:https://fuckdog.org/post-25.html
本站文章均为原创,未经授权请勿用于任何商业用途
推荐阅读: