removed python and windows impl, it was not going anywhere
parent
c2f08290cf
commit
2ce5281a55
154
pic-windows.c
154
pic-windows.c
|
@ -1,154 +0,0 @@
|
||||||
#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;
|
|
||||||
}
|
|
13
scrap.asm
13
scrap.asm
|
@ -4,17 +4,14 @@
|
||||||
mov rbp,rsp
|
mov rbp,rsp
|
||||||
sub rsp,0x30
|
sub rsp,0x30
|
||||||
mov QWORD [rbp-0x18],rdi
|
mov QWORD [rbp-0x18],rdi
|
||||||
mov QWORD [rbp-0x20],rsi
|
mov DWORD [rbp-0x1c],esi
|
||||||
mov QWORD [rbp-0x28],rdx
|
mov QWORD [rbp-0x28],rdx
|
||||||
mov QWORD [rbp-0x30],rcx
|
|
||||||
mov rax,QWORD [rbp-0x28]
|
mov rax,QWORD [rbp-0x28]
|
||||||
mov QWORD [rbp-0x8],rax
|
mov QWORD [rbp-0x8],rax
|
||||||
mov rdx,QWORD [rbp-0x30]
|
mov ecx,DWORD [rbp-0x1c]
|
||||||
mov rsi,QWORD [rbp-0x20]
|
mov rdx,QWORD [rbp-0x18]
|
||||||
mov rcx,QWORD [rbp-0x18]
|
|
||||||
mov rax,QWORD [rbp-0x8]
|
mov rax,QWORD [rbp-0x8]
|
||||||
mov rdi,rcx
|
mov esi,ecx
|
||||||
|
mov rdi,rdx
|
||||||
call rax
|
call rax
|
||||||
nop
|
|
||||||
leave
|
|
||||||
ret
|
ret
|
||||||
|
|
|
@ -11,17 +11,14 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <openssl/sha.h>
|
#include <openssl/sha.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <setjmp.h>
|
|
||||||
|
|
||||||
#pragma comment(lib, "openssl/sha.lib")
|
#pragma comment(lib, "openssl/sha.lib")
|
||||||
|
|
||||||
#define SHA_SUM_LENGTH (SHA_DIGEST_LENGTH + SHA_DIGEST_LENGTH + 1)
|
#define SHA_SUM_LENGTH (SHA_DIGEST_LENGTH + SHA_DIGEST_LENGTH + 1)
|
||||||
|
|
||||||
jmp_buf jmpBuf;
|
void picProto(void *picAddr, size_t picSize, void *clonePtr) {
|
||||||
|
|
||||||
void picProto(void *picAddr, size_t picSize, void *clonePtr, char *checksum) {
|
|
||||||
void (*cloneFunc)(void *, size_t, char *) = clonePtr;
|
void (*cloneFunc)(void *, size_t, char *) = clonePtr;
|
||||||
cloneFunc(picAddr, picSize, checksum);
|
cloneFunc(picAddr, picSize);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,16 +64,6 @@ CLONE_CLEANUP:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void magic_handler(int sig) {
|
|
||||||
|
|
||||||
switch (sig) {
|
|
||||||
|
|
||||||
case SIGSEGV:
|
|
||||||
longjmp(jmpBuf, 1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, const char **argv) {
|
int main(int argc, const char **argv) {
|
||||||
auto retVal = EX_SOFTWARE;
|
auto retVal = EX_SOFTWARE;
|
||||||
char fileInPath[SHA_SUM_LENGTH];
|
char fileInPath[SHA_SUM_LENGTH];
|
||||||
|
@ -99,9 +86,7 @@ int main(int argc, const char **argv) {
|
||||||
goto MAIN_CLEANUP;
|
goto MAIN_CLEANUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *picBuffer =
|
void *picBuffer = mmap(NULL, picStat.st_size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0);
|
||||||
mmap(NULL, picStat.st_size, PROT_READ | PROT_WRITE | PROT_EXEC,
|
|
||||||
MAP_ANON | MAP_PRIVATE, -1, 0);
|
|
||||||
if (MAP_FAILED == picBuffer) {
|
if (MAP_FAILED == picBuffer) {
|
||||||
retVal = errno;
|
retVal = errno;
|
||||||
goto MAIN_CLEANUP;
|
goto MAIN_CLEANUP;
|
||||||
|
@ -124,12 +109,7 @@ int main(int argc, const char **argv) {
|
||||||
|
|
||||||
signal(SIGSEGV, magic_handler);
|
signal(SIGSEGV, magic_handler);
|
||||||
|
|
||||||
if (!setjmp(jmpBuf)) {
|
picFunc(picBuffer, picStat.st_size, cloneFunc, checksum);
|
||||||
picFunc(picBuffer, picStat.st_size, cloneFunc, checksum);
|
|
||||||
} else {
|
|
||||||
retVal = errno;
|
|
||||||
goto MAIN_CLEANUP;
|
|
||||||
}
|
|
||||||
|
|
||||||
strncpy(fileInPath, checksum, SHA_SUM_LENGTH);
|
strncpy(fileInPath, checksum, SHA_SUM_LENGTH);
|
||||||
|
|
38
sins.py
38
sins.py
|
@ -1,38 +0,0 @@
|
||||||
#! /usr/bin/env python
|
|
||||||
# encoding: utf-8
|
|
||||||
|
|
||||||
import mmap
|
|
||||||
import ctypes
|
|
||||||
|
|
||||||
class Sins:
|
|
||||||
def __init__(self):
|
|
||||||
self.seed = open('./build/scrap.asm.2.o', 'rb').read()
|
|
||||||
self.pic = self.pic_load(self.seed)
|
|
||||||
self.callback = ctypes.PYFUNCTYPE(ctypes.c_void_p, ctypes.c_int, ctypes.py_object)(self.callme)
|
|
||||||
|
|
||||||
def pic_load(self, seedling):
|
|
||||||
size = len(seedling)
|
|
||||||
prot = (mmap.PROT_READ | mmap.PROT_WRITE | mmap.PROT_EXEC)
|
|
||||||
page = mmap.mmap(-1, size, prot=prot)
|
|
||||||
page.write(seedling)
|
|
||||||
addr = ctypes.addressof((ctypes.c_char * size).from_buffer(page))
|
|
||||||
|
|
||||||
func = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int)(addr)
|
|
||||||
func.page = page
|
|
||||||
func.addr = addr
|
|
||||||
func.size = size
|
|
||||||
|
|
||||||
return func
|
|
||||||
|
|
||||||
def callme(self, picAddr, picSize):
|
|
||||||
print('So Happy.')
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
import pprint
|
|
||||||
pp = pprint.PrettyPrinter()
|
|
||||||
|
|
||||||
sins = Sins()
|
|
||||||
|
|
||||||
print('pic_load')
|
|
||||||
|
|
||||||
pp.pprint(sins.pic(sins.callback, sins.pic.size))
|
|
Loading…
Reference in New Issue