复制 #include "Header.h"
#include "api.h"
//ShellCode代码的开始位置
__declspec(naked)void ShellCodeStart()
{
__asm
{
jmp ShellCodeEntry; //跳转到ShellCode的入口函数
}
}
__declspec(naked) DWORD GetKernel32() {
_asm {
xor eax, eax; //eax清零
mov eax, fs:[30h]; //TEB->PEB
mov eax, [eax + 0ch]; //PEB->LDR
mov eax, [eax + 0ch]; //LDR->InLoadOrderModuleList
mov esi, [eax]; //指向第二个模块ntdll
mov esi, [esi]; //指向第三个模块kernel
mov eax, esi;
mov eax, [eax + 18h]; //获取kernel模块的基址
ret
};
}
//获取GetProcAddress函数的地址
DWORD pGetProcAddress(HMODULE Kernel32Base) {
char szGetProcAddr[] = { 'G','e','t','P','r','o','c','A','d','d','r','e','s','s',0 };
DWORD result = NULL;
// 遍历kernel32.dll的导出表,找到GetProcAddr函数地址
PIMAGE_DOS_HEADER pDosHead = (PIMAGE_DOS_HEADER)Kernel32Base;
PIMAGE_NT_HEADERS pNtHead = (PIMAGE_NT_HEADERS)((DWORD)Kernel32Base + pDosHead->e_lfanew);
PIMAGE_OPTIONAL_HEADER pOptHead = (PIMAGE_OPTIONAL_HEADER)& pNtHead->OptionalHeader;
PIMAGE_EXPORT_DIRECTORY pExport = (PIMAGE_EXPORT_DIRECTORY)((DWORD)Kernel32Base + pOptHead->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
DWORD *pAddOfFun_Raw = (DWORD*)((DWORD)Kernel32Base + pExport->AddressOfFunctions);
WORD *pAddOfOrd_Raw = (WORD*)((DWORD)Kernel32Base + pExport->AddressOfNameOrdinals);
DWORD *pAddOfNames_Raw = (DWORD*)((DWORD)Kernel32Base + pExport->AddressOfNames);
char *pFinded = NULL, *pSrc = szGetProcAddr;
for (DWORD dwCnt = 0; dwCnt < pExport->NumberOfNames; dwCnt++)
{
pFinded = (char *)((DWORD)Kernel32Base + pAddOfNames_Raw[dwCnt]);
while (*pFinded &&*pFinded == *pSrc)
{
pFinded++; pSrc++;
}
if (*pFinded == *pSrc)
{
result = (DWORD)Kernel32Base + pAddOfFun_Raw[pAddOfOrd_Raw[dwCnt]];
break;
}
pSrc = szGetProcAddr;
}
return result;
}
//初始化动态调用的api函数
void InitFunctions(PFunctions pFn) {
//获取GetProcAddress真实地址
pFn->MyGetProcAddress = (p_GetProcAddress)pGetProcAddress((HMODULE)GetKernel32());
//动态获取LoadLibraryA的地址
char xyLoadLibraryA[] = { 'L','o','a','d','L','i','b','r','a','r','y','A',0 };
pFn->MyLoadLibraryA = (p_LoadLibraryA)pFn->MyGetProcAddress((HMODULE)GetKernel32(), xyLoadLibraryA);
//动态获取MessageBoxA的地址
char xy_user32[] = { 'u','s','e','r','3','2','.','d','l','l',0 };
char xy_MessageBoxA[] = { 'M','e','s','s','a','g','e','B','o','x','A',0 };
pFn->MyMessageBoxA = (p_MessageBoxA)pFn->MyGetProcAddress(pFn->MyLoadLibraryA(xy_user32), xy_MessageBoxA);
//动态获取CreateFile的地址
char xyCreateFile[] = { 'C','r','e','a','t','F','i','l','e','A',0 };
pFn->MyCreateFileA = (p_CreateFileA)pFn->MyGetProcAddress((HMODULE)GetKernel32(), xyCreateFile);
}
//ShellCode的入口函数
void ShellCodeEntry()
{
char szTitle[] = { 'H','e','l','l','o','W','o','r','d',0 };
char szContent[] = { 0x48,0x65,0x6c,0x6c,0x6f,0x20,0x57,0x6f,0x72,0x6c,0x64,0x20,0x21,0 };
//char szContent[] = { 'T','i','p','!','!','!' };
Functions Fn;
InitFunctions(&Fn);
Fn.MyMessageBoxA(NULL, szContent, szTitle, 0);
}