init linux pic loader
						commit
						83972b17cf
					
				| 
						 | 
					@ -0,0 +1,71 @@
 | 
				
			||||||
 | 
					# -*- mode: ruby -*-
 | 
				
			||||||
 | 
					# vi: set ft=ruby :
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# All Vagrant configuration is done below. The "2" in Vagrant.configure
 | 
				
			||||||
 | 
					# configures the configuration version (we support older styles for
 | 
				
			||||||
 | 
					# backwards compatibility). Please don't change it unless you know what
 | 
				
			||||||
 | 
					# you're doing.
 | 
				
			||||||
 | 
					Vagrant.configure(2) do |config|
 | 
				
			||||||
 | 
					  # The most common configuration options are documented and commented below.
 | 
				
			||||||
 | 
					  # For a complete reference, please see the online documentation at
 | 
				
			||||||
 | 
					  # https://docs.vagrantup.com.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Every Vagrant development environment requires a box. You can search for
 | 
				
			||||||
 | 
					  # boxes at https://atlas.hashicorp.com/search.
 | 
				
			||||||
 | 
					  config.vm.box = "ubuntu/wily64"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Disable automatic box update checking. If you disable this, then
 | 
				
			||||||
 | 
					  # boxes will only be checked for updates when the user runs
 | 
				
			||||||
 | 
					  # `vagrant box outdated`. This is not recommended.
 | 
				
			||||||
 | 
					  # config.vm.box_check_update = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Create a forwarded port mapping which allows access to a specific port
 | 
				
			||||||
 | 
					  # within the machine from a port on the host machine. In the example below,
 | 
				
			||||||
 | 
					  # accessing "localhost:8080" will access port 80 on the guest machine.
 | 
				
			||||||
 | 
					  # config.vm.network "forwarded_port", guest: 80, host: 8080
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Create a private network, which allows host-only access to the machine
 | 
				
			||||||
 | 
					  # using a specific IP.
 | 
				
			||||||
 | 
					  # config.vm.network "private_network", ip: "192.168.33.10"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Create a public network, which generally matched to bridged network.
 | 
				
			||||||
 | 
					  # Bridged networks make the machine appear as another physical device on
 | 
				
			||||||
 | 
					  # your network.
 | 
				
			||||||
 | 
					  # config.vm.network "public_network"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Share an additional folder to the guest VM. The first argument is
 | 
				
			||||||
 | 
					  # the path on the host to the actual folder. The second argument is
 | 
				
			||||||
 | 
					  # the path on the guest to mount the folder. And the optional third
 | 
				
			||||||
 | 
					  # argument is a set of non-required options.
 | 
				
			||||||
 | 
					  # config.vm.synced_folder "../data", "/vagrant_data"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Provider-specific configuration so you can fine-tune various
 | 
				
			||||||
 | 
					  # backing providers for Vagrant. These expose provider-specific options.
 | 
				
			||||||
 | 
					  # Example for VirtualBox:
 | 
				
			||||||
 | 
					  #
 | 
				
			||||||
 | 
					  # config.vm.provider "virtualbox" do |vb|
 | 
				
			||||||
 | 
					  #   # Display the VirtualBox GUI when booting the machine
 | 
				
			||||||
 | 
					  #   vb.gui = true
 | 
				
			||||||
 | 
					  #
 | 
				
			||||||
 | 
					  #   # Customize the amount of memory on the VM:
 | 
				
			||||||
 | 
					  #   vb.memory = "1024"
 | 
				
			||||||
 | 
					  # end
 | 
				
			||||||
 | 
					  #
 | 
				
			||||||
 | 
					  # View the documentation for the provider you are using for more
 | 
				
			||||||
 | 
					  # information on available options.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies
 | 
				
			||||||
 | 
					  # such as FTP and Heroku are also available. See the documentation at
 | 
				
			||||||
 | 
					  # https://docs.vagrantup.com/v2/push/atlas.html for more information.
 | 
				
			||||||
 | 
					  # config.push.define "atlas" do |push|
 | 
				
			||||||
 | 
					  #   push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"
 | 
				
			||||||
 | 
					  # end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Enable provisioning with a shell script. Additional provisioners such as
 | 
				
			||||||
 | 
					  # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
 | 
				
			||||||
 | 
					  # documentation for more information about their specific syntax and use.
 | 
				
			||||||
 | 
					  # config.vm.provision "shell", inline: <<-SHELL
 | 
				
			||||||
 | 
					  #   sudo apt-get update
 | 
				
			||||||
 | 
					  #   sudo apt-get install -y apache2
 | 
				
			||||||
 | 
					  # SHELL
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,109 @@
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <sys/mman.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <sysexits.h>
 | 
				
			||||||
 | 
					#include <openssl/sha.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char *picProto(void *picAddr, size_t picSize, void *clonePtr) {
 | 
				
			||||||
 | 
					  char *(*cloneFunc)(void *, size_t) = clonePtr;
 | 
				
			||||||
 | 
					  return cloneFunc(picAddr, picSize);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char *clone(void *picAddr, size_t picSize) {
 | 
				
			||||||
 | 
					  auto retVal = EX_SOFTWARE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  srand((unsigned int)time(NULL));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  unsigned int picOffset = (rand() % (picSize + 1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ((char *)picAddr)[picOffset] = ((char *)picAddr)[picOffset] & (rand() % 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  unsigned char *digest = NULL;
 | 
				
			||||||
 | 
					  SHA_CTX sha;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SHA1_Init(&sha);
 | 
				
			||||||
 | 
					  SHA1_Update(&sha, picAddr, picSize);
 | 
				
			||||||
 | 
					  SHA1_Final(digest, &sha);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  char *fileOutPath = NULL;
 | 
				
			||||||
 | 
					  sprintf(fileOutPath, "./%s_%x.bin", digest, rand());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FILE *fileOutHandle = fopen(fileOutPath, "wb");
 | 
				
			||||||
 | 
					  if (NULL == fileOutHandle) {
 | 
				
			||||||
 | 
					    retVal = EX_SOFTWARE;
 | 
				
			||||||
 | 
					    goto CLONE_CLEANUP;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  retVal = fwrite(picAddr, 1, picSize, fileOutHandle);
 | 
				
			||||||
 | 
					  if (retVal != picSize) {
 | 
				
			||||||
 | 
					    retVal = EX_SOFTWARE;
 | 
				
			||||||
 | 
					    goto CLONE_CLEANUP;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  retVal = EX_OK;
 | 
				
			||||||
 | 
					CLONE_CLEANUP:
 | 
				
			||||||
 | 
					  if (fileOutHandle) {
 | 
				
			||||||
 | 
					    fclose(fileOutHandle);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return fileOutPath;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(int argc, const char **argv) {
 | 
				
			||||||
 | 
					  auto retVal = EX_SOFTWARE;
 | 
				
			||||||
 | 
					  char *fileInPath = argv[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FILE *fileInHandle = fopen(fileInPath, "rb");
 | 
				
			||||||
 | 
					  if (NULL == fileInHandle) {
 | 
				
			||||||
 | 
					    retVal = EX_SOFTWARE;
 | 
				
			||||||
 | 
					    goto MAIN_CLEANUP;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fseek(fileInHandle, 0L, SEEK_END);
 | 
				
			||||||
 | 
					  size_t picBuffer_len = ftell(fileInHandle);
 | 
				
			||||||
 | 
					  fseek(fileInHandle, 0L, SEEK_SET);
 | 
				
			||||||
 | 
					  if (0 >= picBuffer_len) {
 | 
				
			||||||
 | 
					    retVal = EX_SOFTWARE;
 | 
				
			||||||
 | 
					    goto MAIN_CLEANUP;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void *picBuffer = malloc(picBuffer_len);
 | 
				
			||||||
 | 
					  if (NULL == picBuffer) {
 | 
				
			||||||
 | 
					    retVal = EX_SOFTWARE;
 | 
				
			||||||
 | 
					    goto MAIN_CLEANUP;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  memset_s(&picBuffer, picBuffer_len, 0, picBuffer_len);
 | 
				
			||||||
 | 
					  retVal = mprotect(picBuffer, picBuffer_len, PROT_EXEC);
 | 
				
			||||||
 | 
					  if (0 == retVal) {
 | 
				
			||||||
 | 
					    retVal = EX_SOFTWARE;
 | 
				
			||||||
 | 
					    goto MAIN_CLEANUP;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  retVal = fread(picBuffer, 1, picBuffer_len, fileInHandle);
 | 
				
			||||||
 | 
					  if (retVal != picBuffer_len) {
 | 
				
			||||||
 | 
					    retVal = EX_SOFTWARE;
 | 
				
			||||||
 | 
					    goto MAIN_CLEANUP;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (fileInHandle) {
 | 
				
			||||||
 | 
					    fclose(fileInHandle);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  char *(*cloneFunc)(void *, size_t) = clone;
 | 
				
			||||||
 | 
					  void *(*picFunc)(void *, size_t, void *) = picBuffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  char *childPath = picFunc(picBuffer, picBuffer_len, cloneFunc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  retVal = EX_OK;
 | 
				
			||||||
 | 
					MAIN_CLEANUP:
 | 
				
			||||||
 | 
					  if (fileInHandle) {
 | 
				
			||||||
 | 
					    fclose(fileInHandle);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (picBuffer) {
 | 
				
			||||||
 | 
					    free(picBuffer);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return retVal;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,154 @@
 | 
				
			||||||
 | 
					#ifndef WIN32_LEAN_AND_MEAN
 | 
				
			||||||
 | 
					#define WIN32_LEAN_AND_MEAN
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <windows.h>
 | 
				
			||||||
 | 
					#include <winsock2.h>
 | 
				
			||||||
 | 
					#include <ws2tcpip.h>
 | 
				
			||||||
 | 
					#include <iphlpapi.h>
 | 
				
			||||||
 | 
					#include <assert.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <io.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <malloc.h>
 | 
				
			||||||
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					#include <intrin.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma comment(lib, "Ws2_32.lib")
 | 
				
			||||||
 | 
					#pragma comment(lib, "Mswsock.lib")
 | 
				
			||||||
 | 
					#pragma comment(lib, "AdvApi32.lib")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PORT 999
 | 
				
			||||||
 | 
					#define PORT_STR "999"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef auto (*FUNCPTR)();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int __cdecl main(int argc, const char **argv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    auto retVal = SOCKET_ERROR;
 | 
				
			||||||
 | 
					    LPVOID picBuffer = NULL;
 | 
				
			||||||
 | 
					    HANDLE fileHandle;
 | 
				
			||||||
 | 
					    DWORD picBuffer_len = 0;
 | 
				
			||||||
 | 
					    DWORD oldProtect;
 | 
				
			||||||
 | 
					    char *fileInPath = argv[0];
 | 
				
			||||||
 | 
					    char *fileOutPath = argv[0];
 | 
				
			||||||
 | 
					    FUNCPTR func = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SecureZeroMemory(&fileHandle, sizeof(fileHandle));
 | 
				
			||||||
 | 
					    fileHandle = CreateFile(fileInPath, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
 | 
				
			||||||
 | 
					    if (INVALID_HANDLE_VALUE == fileHandle)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        retVal = GetLastError();
 | 
				
			||||||
 | 
					        goto CLEAN_UP;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    picBuffer_len = GetFileSize(fileHandle, &picBuffer_len);
 | 
				
			||||||
 | 
					    if (-1 == picBuffer_len)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        retVal = GetLastError();
 | 
				
			||||||
 | 
					        goto CLEAN_UP;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    picBuffer = malloc(picBuffer_len);
 | 
				
			||||||
 | 
					    if (NULL == picBuffer)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        retVal = GetLastError();
 | 
				
			||||||
 | 
					        goto CLEAN_UP;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SecureZeroMemory(picBuffer, sizeof(picBuffer_len));
 | 
				
			||||||
 | 
					    retVal = VirtualProtect(picBuffer, picBuffer_len, PAGE_EXECUTE_READWRITE,
 | 
				
			||||||
 | 
					                            &oldProtect);
 | 
				
			||||||
 | 
					    if (0 == retVal)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        retVal = GetLastError();
 | 
				
			||||||
 | 
					        goto CLEAN_UP;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SecureZeroMemory(&overlapped, sizeof(overlapped));
 | 
				
			||||||
 | 
					    retVal =
 | 
				
			||||||
 | 
					        ReadFile(fileHandle, picBuffer, picBuffer_len, &overlapped, NULL);
 | 
				
			||||||
 | 
					    if (FALSE == retVal)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        retVal = GetLastError();
 | 
				
			||||||
 | 
					        goto CLEAN_UP;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (fileHandle)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        CloseHandle(fileHandle);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    func = (FUNCPTR)picBuffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SecureZeroMemory(&wsaData, sizeof(wsaData));
 | 
				
			||||||
 | 
					    WSAStartup(MAKEWORD(2, 2), &wsaData);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* create sockets */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    OVERLAPPED overlapped;
 | 
				
			||||||
 | 
					    unsigned int listenSocket = INVALID_SOCKET;
 | 
				
			||||||
 | 
					    unsigned int clientSocket = INVALID_SOCKET;
 | 
				
			||||||
 | 
					    struct addrinfo *result = NULL;
 | 
				
			||||||
 | 
					    struct addrinfo hints;
 | 
				
			||||||
 | 
					    SOCKET socketReuse = INVALID_SOCKET;
 | 
				
			||||||
 | 
					    WSABUF messageBuffer;
 | 
				
			||||||
 | 
					    WSAOVERLAPPED sendOverlapped;
 | 
				
			||||||
 | 
					    WSADATA wsaData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SecureZeroMemory(&hints, sizeof(hints));
 | 
				
			||||||
 | 
					    hints.ai_family = AF_INET;
 | 
				
			||||||
 | 
					    hints.ai_socktype = SOCK_STREAM;
 | 
				
			||||||
 | 
					    hints.ai_protocol = IPPROTO_TCP;
 | 
				
			||||||
 | 
					    hints.ai_flags = AI_PASSIVE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    retVal = getaddrinfo(NULL, PORT_STR, &hints, &result);
 | 
				
			||||||
 | 
					    if (SOCKET_ERROR == retVal)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        retVal = WSAGetLastError();
 | 
				
			||||||
 | 
					        goto CLEAN_UP;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    listenSocket = INVALID_SOCKET;
 | 
				
			||||||
 | 
					    listenSocket =
 | 
				
			||||||
 | 
					        socket(result->ai_family, result->ai_socktype, result->ai_protocol);
 | 
				
			||||||
 | 
					    if (INVALID_SOCKET == listenSocket)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        retVal = WSAGetLastError();
 | 
				
			||||||
 | 
					        goto CLEAN_UP;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    retVal = bind(listenSocket, result->ai_addr, (int)result->ai_addrlen);
 | 
				
			||||||
 | 
					    if (SOCKET_ERROR == retVal)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        retVal = WSAGetLastError();
 | 
				
			||||||
 | 
					        goto CLEAN_UP;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    freeaddrinfo(result);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    retVal = listen(listenSocket, SOMAXCONN);
 | 
				
			||||||
 | 
					    if (SOCKET_ERROR == retVal)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        retVal = WSAGetLastError();
 | 
				
			||||||
 | 
					        goto CLEAN_UP;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    clientSocket = accept(listenSocket, NULL, NULL);
 | 
				
			||||||
 | 
					    if (INVALID_SOCKET == clientSocket)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        retVal = WSAGetLastError();
 | 
				
			||||||
 | 
					        goto CLEAN_UP;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    socketReuse = func(); /** PIC test here **/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    retVal = 0;
 | 
				
			||||||
 | 
					CLEAN_UP:
 | 
				
			||||||
 | 
					    if (fileHandle)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        CloseHandle(fileHandle);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    WSACleanup();
 | 
				
			||||||
 | 
					    return retVal;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
		Loading…
	
		Reference in New Issue