ShellCode加载器编写

一、什么是shellcode

shellcode就是一段可执行代码,shellcode代码可以独立存在,无需任何格式得包装,内存中运行无需固定指定得宿主进程,shellcode优点短小精悍,灵活多变。

二、减少文件体积

默认ide生成出来的体积偏大即使里面什么也没有写体积8KB,优化第一步修改函数入口点,属性->链接器->高级->程序入口点修改成任意名称需和代码对应。

第二步关闭程序安全检查属性->c++->代码生成->安全检查进行禁用

 第三步设置工程兼容Windows XP,步骤属性->c++->代码生成->运行库Release版本需要修改为多线程(/MT) Debug需要修改为,多线程调试(/MTd),关闭生成清单,步骤属性->链接器->清单文件->生成清单 选择否就可以实现清除资源段的效果,关闭调试信息属性->链接器->调试去掉rdata数据段。

三、shellcode的编写原则函数动态调用

<1>.IDE生成执行文件编译器将MessageBox转换成系统中真正执行弹窗函数地址, 执行完毕后再跳转回去。

//使用内联汇编的方式进行调用
#include <windows.h> int EntryMain() { LPVOID lp = GetProcAddress(LoadLibraryA("user32.dll"), "MessageBoxA"); const char* pszData = "Hello world"; __asm { push 0; push 0; push pszData; push 0; call lp; } return 0; }

 说明:LPVOID是一个没有类型的指针,也就是说可以将任意类型的指针赋值给LPVOID类型的变量(一般作为参数传递),然后在使用的时候在转换回来

#include <windows.h>


int EntryMain() {

  //CreateFileA("1.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
  //转到CreaFifleA函数定义将代码扣出来 typedef HANDLE(WINAPI* FN_CreateFileA)( //使用typedef做一个该类型的函数指针声明 _In_ LPCSTR lpFileName, _In_ DWORD dwDesiredAccess, _In_ DWORD dwShareMode, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _In_ DWORD dwCreationDisposition, _In_ DWORD dwFlagsAndAttributes, _In_opt_ HANDLE hTemplateFile ); FN_CreateFileA fn_CreateFileA; fn_CreateFileA =(FN_CreateFileA) GetProcAddress(LoadLibraryA("kernel32.dll"), "CreateFileA"); fn_CreateFileA("1.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); return 0; }

  

 

猜你喜欢

转载自www.cnblogs.com/websecyw/p/13199522.html