1. 程式人生 > 其它 >免殺學習——C++(一)

免殺學習——C++(一)

一、基本函式學習 1、VirtualAlloc函式 用來動態申請記憶體,通常用來分配大塊的記憶體 VirtualAlloc是一個Windows API函式,它包含在windows系統檔案Kernel32.dll中使用時要引用windows.h 該函式的功能是在呼叫程序的虛地址空間,預定或者提交一部分頁 如果用於記憶體分配的話,並且分配型別未指定MEM_RESET,則系統將自動設定為0
LPVOID VirtualAlloc{ 
LPVOID lpAddress, // 要分配的記憶體區域的地址
DWORD dwSize, // 分配的大小 
DWORD flAllocationType, // 分配的型別 
DWORD flProtect //
該記憶體的初始保護屬性 };
如果呼叫成功,返回分配的首地址;呼叫失敗,返回NULL 引數說明:
LPVOID lpAddress, 分配記憶體區域的地址。當你使用VirtualAlloc來提交一塊以前保留的記憶體塊的時候,lpAddress引數可以用來識別以前保留的記憶體塊。如果這個引數是NULL,系統將會決定分配記憶體區域的位置,並且按64-KB向上取整(roundup)。
SIZE_T dwSize, 要分配或者保留的區域的大小。這個引數以位元組為單位,而不是頁,系統會根據這個大小一直分配到下頁的邊界DWORD
flAllocationType, 分配型別 ,你可以指定或者合併以下標誌:MEM_COMMIT,MEM_RESERVE和MEM_TOP_DOWN。
DWORD flProtect 指定了被分配區域的訪問保護方式
使用示例
LPVOID Memory = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
2、memcpy函式 memcpy是memory copy的縮寫,意為記憶體複製 函式原型 void *memcpy(void *dest, const void *src, size_t n); 它的功能是從src的開始位置拷貝n個位元組的資料到dest。如果dest存在資料,將會被覆蓋。memcpy函式的返回值是dest的指標。memcpy函式定義在string.h標頭檔案裡 二、基本載入器 程式碼以及註釋
#include <windows.h>
#include 
<stdio.h> #pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")//不顯示視窗 unsigned char shellcode[] = ""; void main() { //申請記憶體空間,返回一個無型別的分配記憶體的首地址 LPVOID Memory = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); if (Memory == NULL) { return; } //複製shellcode程式碼到指定記憶體地址 memcpy(Memory, shellcode, sizeof(shellcode)); //讓程式跳轉到指定記憶體地址執行 ((void(*)())Memory)(); }