Files
2026-01-26 07:17:39 -08:00

82 lines
1.9 KiB
C++

#include <windows.h>
#include "crypt.h"
// apply XOR encryption
PBYTE XORInstruction(IN OUT PBYTE* buffer, SIZE_T index, SIZE_T size, PBYTE keys, SIZE_T keySize) {
PBYTE buf = *buffer;
BYTE b;
BYTE k;
BYTE e;
SIZE_T j = index % keySize;
for (SIZE_T i = index; i < size + index; i++) {
b = buf[i];
k = keys[j];
e = b ^ k;
// printf("%x ^ %x = %x\n", b, k, e);
buf[i] = e;
j += 1;
if (j == keySize) {
j = 0;
}
}
return *buffer;
}
void RC4KeySchedule(BYTE* S, PBYTE key, SIZE_T keyLen) {
for (int i = 0; i < 256; i++) S[i] = i;
int j = 0;
for (int i = 0; i < 256; i++) {
j = (j + S[i] + key[i % keyLen]) & 0xFF;
BYTE tmp = S[i];
S[i] = S[j];
S[j] = tmp;
}
}
void RC4GenerateKeystream(BYTE* S, BYTE* keystream, SIZE_T count, SIZE_T skip) {
int i = 0, j = 0;
for (SIZE_T s = 0; s < skip + count; s++) {
i = (i + 1) & 0xFF;
j = (j + S[i]) & 0xFF;
BYTE tmp = S[i];
S[i] = S[j];
S[j] = tmp;
BYTE K = S[(S[i] + S[j]) & 0xFF];
if (s >= skip) {
keystream[s - skip] = K;
}
}
}
PBYTE RC4Instruction(PBYTE* buffer, SIZE_T index, SIZE_T size, PBYTE key, SIZE_T keySize) {
BYTE S[256];
BYTE* keystream = (BYTE*)malloc(size);
if (!keystream) return NULL;
RC4KeySchedule(S, key, keySize);
RC4GenerateKeystream(S, keystream, size, index);
for (SIZE_T i = 0; i < size; i++) {
(*buffer)[index + i] ^= keystream[i];
}
free(keystream);
return *buffer;
}
// generic encryption algorithm
void ApplyCryptInstruction(PBYTE* shellcode, SIZE_T offset, SIZE_T size, PBYTE keys, SIZE_T keySize, EncryptionType encryption) {
if (encryption == ENCRYPTION_RC4) {
RC4Instruction(shellcode, offset, size, keys, keySize);
}
else {
XORInstruction(shellcode, offset, size, keys, keySize);
}
}