#include <defs.h>


//-------------------------------------------------------------------------
// Function declarations

__int64 (**init_proc())(void);
void sub_1890();
// int printf(const char *format, ...);
// int inet_pton(int af, const char *cp, void *buf);
// char *strncat(char *dest, const char *src, size_t n);
// int puts(const char *s);
// int uname(struct utsname *name);
// __int64 __fastcall RSA_public_decrypt(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD); weak
// void __noreturn exit(int status);
// void *malloc(size_t size);
// FILE *fopen(const char *filename, const char *modes);
// int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
char *__fastcall indexLicValues(char *);
// void *dlsym(void *handle, const char *name);
// void free(void *ptr);
// size_t strlen(const char *s);
// __int64 __fastcall PEM_read_bio_RSAPrivateKey(_QWORD, _QWORD, _QWORD, _QWORD); weak
// DIR *opendir(const char *name);
// char *dlerror(void);
__int64 __fastcall real_time2(__int64);
// const unsigned __int16 **__ctype_b_loc(void);
// int __fastcall __cxa_finalize(void *);
// int sprintf(char *s, const char *format, ...);
__int64 __fastcall real_fxstat64(unsigned int, unsigned int, __int64);
__int64 __fastcall real_xstat64(unsigned int, __int64, __int64);
__int64 __fastcall real_memmove(__int64, __int64, __int64);
// char *strstr(const char *haystack, const char *needle);
// char *strcat(char *dest, const char *src);
__int64 __fastcall real_write(unsigned int, __int64, __int64);
// int atoi(const char *nptr);
void *validateLicense();
// int regcomp(regex_t *preg, const char *pattern, int cflags);
// void *memcpy(void *dest, const void *src, size_t n);
_BOOL8 __fastcall isValidMacAddress(_BYTE *);
// __int64 __fastcall PEM_read_bio_RSA_PUBKEY(_QWORD, _QWORD, _QWORD, _QWORD); weak
// size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
// char *getenv(const char *name);
// char *strdup(const char *s);
const char *__fastcall str_replace(const char *, const char *, const char *);
// int strcmp(const char *s1, const char *s2);
// char *strcpy(char *dest, const char *src);
__int64 __fastcall createRSA(__int64, int);
// char *strtok(char *s, const char *delim);
int __fastcall hex2char(const char *, char *);
_BOOL8 __fastcall prefix(char *, char *);
// void regfree(regex_t *preg);
// char *strncpy(char *dest, const char *src, size_t n);
__int64 __fastcall real_time(__int64);
// __int64 __fastcall BIO_new_mem_buf(_QWORD, _QWORD); weak
// int unsetenv(const char *name);
// int fscanf(FILE *stream, const char *format, ...);
void *checkLicenseInfo();
// __int64 strtoll(const char *nptr, char **endptr, int base);
// void *realloc(void *ptr, size_t size);
_DWORD *init();
// int fprintf(FILE *stream, const char *format, ...);
__int64 __fastcall str_replace3(_QWORD, _QWORD, _QWORD, _QWORD); // weak
__int64 __fastcall public_decrypt(__int64, unsigned int, __int64, __int64);
__int64 (**call_gmon_start())(void);
char *deregister_tm_clones();
__int64 register_tm_clones(); // weak
char *_do_global_dtors_aux();
__int64 __fastcall regex_replace(char **a1, char *a2, char *a3);
__int64 __fastcall real_time2(__int64 a1);
int __fastcall hex2char(const char *a1, char *a2);
_BYTE *__fastcall str_replace3(_BYTE *a1, __int64 a2, const char *a3, const char *a4);
__int64 __fastcall locate_forward(_QWORD *a1, _BYTE *a2, __int64 a3, unsigned __int64 a4);
__int64 __fastcall locate_backward(_QWORD *a1, _BYTE *a2, unsigned __int64 a3, __int64 a4);
__int64 __fastcall str_replace2(const char *a1, const char *a2, const char *a3);
const char *__fastcall str_replace(const char *a1, const char *a2, const char *a3);
_BYTE *__fastcall str_replace4(const char *a1, const char *a2, const char *a3);
_BOOL8 __fastcall prefix(char *a1, char *a2);
char *__fastcall indexLicValues(char *a1);
_BOOL8 __fastcall isValidMacAddress(_BYTE *a1);
unsigned int *validateLicense();
__int64 __fastcall createRSA(__int64 a1, int a2);
__int64 __fastcall public_decrypt(__int64 a1, unsigned int a2, __int64 a3, __int64 a4);
void *checkLicenseInfo();
_DWORD *init();
__int64 __fastcall real_write2(unsigned int a1, __int64 a2, __int64 a3);
__int64 __fastcall real_time(__int64 a1);
__int64 __fastcall time(__int64 a1);
int __fastcall ioctl(unsigned int a1, unsigned int a2, __int64 a3);
__int64 __fastcall real_xstat64(unsigned int a1, __int64 a2, __int64 a3);
__int64 __fastcall _xstat64(unsigned int a1, const char *a2, __int64 a3);
__int64 __fastcall real_fxstat64(unsigned int a1, unsigned int a2, __int64 a3);
__int64 __fastcall _fxstat64(unsigned int a1, unsigned int a2, __int64 a3);
__int64 __fastcall real_memmove(__int64 a1, __int64 a2, __int64 a3);
__int64 __fastcall memmove(__int64 a1, const char *a2, size_t a3);
__int64 __fastcall real_write(unsigned int a1, __int64 a2, __int64 a3);
char *__fastcall StringPadRight(char *a1, int a2, const char *a3);
__int64 __fastcall write(unsigned int a1, const char *a2, __int64 a3);
__int64 __fastcall syscall(__int64 a1, char *a2, __int64 a3, __int64 a4, __int64 a5, __int64 a6, __int64 a7);
__int64 ptrace(); // weak
void term_proc();
// int __fastcall _cxa_finalize(void *);
// __int64 _gmon_start__(void); weak

//-------------------------------------------------------------------------
// Data declarations

_UNKNOWN unk_4C40; // weak
void *_dso_handle = &_dso_handle; // weak
_DWORD g_write_override_enabled = 1; // weak
_UNKNOWN padding; // weak
char edata; // weak
int g_NumberofIOctls; // weak
int g_StartDate; // weak
_DWORD g_StopDate; // weak
_UNKNOWN g_limitTimeFaking; // weak
int g_time_calls; // weak
int total_write_calls; // weak
int g_n_uname_syscall; // weak
_UNKNOWN g_old_method; // weak
_UNKNOWN g_mem_calls; // weak
__int64 (__fastcall *orig_ioctl_16094)(_QWORD, _QWORD, _QWORD); // weak
__int64 handle_16090; // weak
__int64 (__fastcall *orig_syscall_16362)(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD, _QWORD, _QWORD); // weak
unsigned int g_License[222]; // weak
// extern _UNKNOWN _progname; weak
// extern struct _IO_FILE *stderr;


//----- (0000000000001880) ----------------------------------------------------
__int64 (**init_proc())(void)
{
  return call_gmon_start();
}

//----- (0000000000001890) ----------------------------------------------------
void sub_1890()
{
  JUMPOUT(0LL);
}
// 1896: control flows out of bounds to 0

//----- (0000000000001C20) ----------------------------------------------------
__int64 (**call_gmon_start())(void)
{
  __int64 (**result)(void); // rax

  result = &_gmon_start__;
  if ( &_gmon_start__ )
    return (__int64 (**)(void))_gmon_start__();
  return result;
}
// 206700: using guessed type __int64 _gmon_start__(void);

//----- (0000000000001C40) ----------------------------------------------------
char *deregister_tm_clones()
{
  return &edata;
}
// 2061E0: using guessed type char edata;

//----- (0000000000001C70) ----------------------------------------------------
__int64 register_tm_clones()
{
  return 0LL;
}
// 1C70: using guessed type __int64 register_tm_clones();

//----- (0000000000001CB0) ----------------------------------------------------
char *_do_global_dtors_aux()
{
  char *result; // rax

  if ( !edata )
  {
    if ( &_cxa_finalize )
      __cxa_finalize(&_dso_handle);
    result = deregister_tm_clones();
    edata = 1;
  }
  return result;
}
// 205D88: using guessed type void *_dso_handle;
// 2061E0: using guessed type char edata;

//----- (0000000000001CF5) ----------------------------------------------------
__int64 __fastcall regex_replace(char **a1, char *a2, char *a3)
{
  void *v3; // rsp
  size_t v5; // rbx
  size_t v6; // rax
  char *v7; // rax
  size_t v8; // rax
  char *v9; // rax
  size_t v10; // rax
  char *v11; // rax
  __int64 v12[3]; // [rsp+0h] [rbp-E0h] BYREF
  char *s; // [rsp+18h] [rbp-C8h]
  char *pattern; // [rsp+20h] [rbp-C0h]
  char **v15; // [rsp+28h] [rbp-B8h]
  regex_t preg; // [rsp+30h] [rbp-B0h] BYREF
  unsigned int v17; // [rsp+70h] [rbp-70h]
  int v18; // [rsp+74h] [rbp-6Ch]
  char *dest; // [rsp+78h] [rbp-68h]
  regmatch_t *__attribute__((__org_arrdim(0,0))) pmatch; // [rsp+80h] [rbp-60h]
  size_t v21; // [rsp+88h] [rbp-58h]
  size_t re_nsub; // [rsp+90h] [rbp-50h]
  int i; // [rsp+9Ch] [rbp-44h]
  char *src; // [rsp+A0h] [rbp-40h]
  int v25; // [rsp+A8h] [rbp-38h]
  unsigned int v26; // [rsp+ACh] [rbp-34h]
  char *v27; // [rsp+B0h] [rbp-30h]
  char *v28; // [rsp+B8h] [rbp-28h]

  v15 = a1;
  pattern = a2;
  s = a3;
  v26 = 0;
  if ( regcomp(&preg, a2, 1) )
    return 0xFFFFFFFFLL;
  re_nsub = preg.re_nsub;
  v21 = preg.re_nsub;
  v12[0] = preg.re_nsub + 1;
  v12[1] = 0LL;
  v3 = alloca(16 * ((8 * (preg.re_nsub + 1) + 15) / 0x10));
  pmatch = (regmatch_t *)v12;
  v25 = 0;
  v28 = s;
  while ( 1 )
  {
    do
      ++v28;
    while ( *v28 > 31 );
    if ( !*v28 )
      break;
    ++v25;
  }
  if ( re_nsub == v25 )
  {
    src = *v15;
    while ( !regexec(&preg, src, re_nsub + 1, pmatch, 1) )
    {
      v5 = strlen(*v15);
      v6 = strlen(s);
      dest = (char *)malloc(v5 + v6);
      if ( !dest )
        exit(1);
      *dest = 0;
      strncat(dest, *v15, src - *v15);
      v27 = s;
      v28 = s;
      strncat(dest, src, pmatch->rm_so);
      for ( i = 0; re_nsub > i; ++i )
      {
        do
          ++v28;
        while ( *v28 > 31 );
        v18 = *v28;
        strncat(dest, v27, v28 - v27);
        strncat(dest, &src[pmatch[v18].rm_so], pmatch[v18].rm_eo - pmatch[v18].rm_so);
        v7 = v28++;
        v27 = v7;
      }
      strcat(dest, v28);
      v17 = strlen(dest);
      strcat(dest, &src[pmatch->rm_eo]);
      free(*v15);
      v8 = strlen(dest);
      v9 = (char *)malloc(v8 + 1);
      *v15 = v9;
      strcpy(*v15, dest);
      src = &(*v15)[v17];
      free(dest);
      ++v26;
    }
    regfree(&preg);
    v10 = strlen(*v15);
    v11 = (char *)realloc(*v15, v10 + 1);
    *v15 = v11;
    return v26;
  }
  else
  {
    regfree(&preg);
    return 4294967294LL;
  }
}

//----- (00000000000020D2) ----------------------------------------------------
__int64 __fastcall real_time2(__int64 a1)
{
  __int64 (__fastcall *v1)(__int64); // rax

  v1 = (__int64 (__fastcall *)(__int64))dlsym((void *)0xFFFFFFFFFFFFFFFFLL, "time");
  return v1(a1);
}

//----- (00000000000020FF) ----------------------------------------------------
int __fastcall hex2char(const char *a1, char *a2)
{
  int v2; // eax
  int v4; // eax
  char v5; // cl
  int v6; // eax
  char v7[2512]; // [rsp+10h] [rbp-1D70h] BYREF
  char dest[5008]; // [rsp+9E0h] [rbp-13A0h] BYREF
  int v9; // [rsp+1D70h] [rbp-10h]
  int v10; // [rsp+1D74h] [rbp-Ch]
  int v11; // [rsp+1D78h] [rbp-8h]
  int v12; // [rsp+1D7Ch] [rbp-4h]

  strcpy(dest, a1);
  v12 = 0;
  v11 = 0;
  while ( dest[v12] )
  {
    if ( dest[v12] <= 47 || dest[v12] > 57 )
      v2 = dest[v12] - 87;
    else
      v2 = dest[v12] - 48;
    v10 = v2;
    if ( !dest[++v12] )
      return puts("invalid format");
    if ( dest[v12] <= 47 || dest[v12] > 57 )
      v4 = dest[v12] - 87;
    else
      v4 = dest[v12] - 48;
    v9 = v4;
    v5 = 16 * v10 + v4;
    v6 = v11++;
    v7[v6] = v5;
    ++v12;
  }
  v7[v11] = 0;
  return (unsigned int)strcpy(a2, v7);
}
// 20FF: using guessed type char dest[5008];
// 20FF: using guessed type char var_1D70[2512];

//----- (0000000000002265) ----------------------------------------------------
_BYTE *__fastcall str_replace3(_BYTE *a1, __int64 a2, const char *a3, const char *a4)
{
  const char *v7; // [rsp+28h] [rbp-48h] BYREF
  size_t v10; // [rsp+38h] [rbp-38h]
  const char *v12; // [rsp+48h] [rbp-28h]
  size_t n; // [rsp+50h] [rbp-20h]
  size_t v14; // [rsp+58h] [rbp-18h]
  void *dest; // [rsp+60h] [rbp-10h]
  _BYTE *v16; // [rsp+68h] [rbp-8h]

  v14 = strlen(a3);
  n = strlen(a4);
  v12 = &a3[v14 - 1];
  if ( !v14 )
    return a1;
  if ( n > v14 )
  {
    v10 = n - v14;
    v7 = a3;
    v16 = a1;
    dest = a1;
    while ( *v16 )
    {
      if ( (unsigned __int8)locate_forward(&v7, v16, (__int64)a3, (unsigned __int64)v12) )
        dest = (char *)dest + v10;
      if ( dest >= &a1[a2] )
        return 0LL;
      ++v16;
      dest = (char *)dest + 1;
    }
    v7 = v12;
    while ( dest >= a1 )
    {
      *(_BYTE *)dest = *v16;
      if ( (unsigned __int8)locate_backward(&v7, v16, (unsigned __int64)a3, (__int64)v12) )
      {
        dest = (char *)dest - v10;
        memcpy(dest, a4, n);
      }
      dest = (char *)dest - 1;
      --v16;
    }
    return a1;
  }
  else
  {
    v7 = a3;
    v16 = a1;
    dest = a1;
    while ( *v16 )
    {
      *(_BYTE *)dest = *v16;
      if ( (unsigned __int8)locate_forward(&v7, v16, (__int64)a3, (unsigned __int64)v12) )
      {
        dest = (char *)dest - v14;
        memcpy((char *)dest + 1, a4, n);
        dest = (char *)dest + n;
      }
      ++v16;
      dest = (char *)dest + 1;
    }
    *(_BYTE *)dest = 0;
    return a1;
  }
}
// 2265: using guessed type const char *var_48;

//----- (000000000000245C) ----------------------------------------------------
__int64 __fastcall locate_forward(_QWORD *a1, _BYTE *a2, __int64 a3, unsigned __int64 a4)
{
  if ( *(_BYTE *)*a1 == *a2 )
  {
    if ( a4 < ++*a1 )
    {
      *a1 = a3;
      return 1LL;
    }
  }
  else
  {
    *a1 = a3;
  }
  return 0LL;
}

//----- (00000000000024C8) ----------------------------------------------------
__int64 __fastcall locate_backward(_QWORD *a1, _BYTE *a2, unsigned __int64 a3, __int64 a4)
{
  if ( *(_BYTE *)*a1 == *a2 )
  {
    if ( a3 > --*a1 )
    {
      *a1 = a4;
      return 1LL;
    }
  }
  else
  {
    *a1 = a4;
  }
  return 0LL;
}

//----- (0000000000002534) ----------------------------------------------------
__int64 __fastcall str_replace2(const char *a1, const char *a2, const char *a3)
{
  int v3; // ebx
  size_t v4; // rax
  size_t v5; // rax
  size_t v6; // rax
  _BYTE v9[12]; // [rsp+2Ch] [rbp-34h]
  int v10; // [rsp+3Ch] [rbp-24h]
  int v11; // [rsp+3Ch] [rbp-24h]
  char *src; // [rsp+40h] [rbp-20h]
  char *i; // [rsp+48h] [rbp-18h]
  char *j; // [rsp+48h] [rbp-18h]

  v10 = 0;
  *(_QWORD *)v9 = (unsigned int)strlen(a1);
  for ( i = strstr(a3, a1); i; i = strstr(&i[*(int *)v9], a1) )
    ++v10;
  v3 = v10 * (strlen(a2) - *(_DWORD *)v9);
  v11 = v3 + strlen(a3);
  *(_QWORD *)&v9[4] = malloc(v11);
  src = (char *)a3;
  for ( j = strstr(a3, a1); j; j = strstr(src, a1) )
  {
    v4 = strlen(*(const char **)&v9[4]);
    strncpy((char *)(v4 + *(_QWORD *)&v9[4]), src, j - src);
    v5 = strlen(*(const char **)&v9[4]);
    strcpy((char *)(*(_QWORD *)&v9[4] + v5), a2);
    src = &j[*(int *)v9];
  }
  v6 = strlen(*(const char **)&v9[4]);
  strcpy((char *)(*(_QWORD *)&v9[4] + v6), src);
  return *(_QWORD *)&v9[4];
}

//----- (00000000000026EC) ----------------------------------------------------
const char *__fastcall str_replace(const char *a1, const char *a2, const char *a3)
{
  int v5; // [rsp+20h] [rbp-30h]
  int v6; // [rsp+24h] [rbp-2Ch]
  int n; // [rsp+28h] [rbp-28h]
  int m; // [rsp+2Ch] [rbp-24h]
  int k; // [rsp+30h] [rbp-20h]
  int j; // [rsp+34h] [rbp-1Ch]
  int i; // [rsp+38h] [rbp-18h]
  int v12; // [rsp+3Ch] [rbp-14h]

  v6 = strlen(a2);
  v5 = strlen(a3);
  for ( i = 0; i < strlen(a1); ++i )
  {
    if ( a1[i] == *a2 )
    {
      v12 = 1;
      for ( j = 1; j < v6 && a1[i + j] == a2[j]; ++j )
        ++v12;
      if ( v12 == v6 )
      {
        if ( v6 < v5 )
        {
          for ( k = strlen(a1); k > i; --k )
            a1[k + v5 - v6] = a1[k];
        }
        if ( v6 > v5 )
        {
          for ( m = i + v6 - v5; m < strlen(a1); ++m )
            a1[m - (v6 - v5)] = a1[m];
          a1[strlen(a1) - (v6 - v5)] = 0;
        }
        for ( n = 0; n < v5; ++n )
          a1[i + n] = a3[n];
        if ( v6 != v5 )
          i += v5 - 1;
      }
    }
  }
  return a1;
}

//----- (00000000000028E3) ----------------------------------------------------
_BYTE *__fastcall str_replace4(const char *a1, const char *a2, const char *a3)
{
  int v4; // eax
  int v5; // eax
  int v6; // eax
  _BYTE *v8; // [rsp+28h] [rbp-38h]
  int v9; // [rsp+34h] [rbp-2Ch]
  int v10; // [rsp+38h] [rbp-28h]
  int v11; // [rsp+3Ch] [rbp-24h]
  int v12; // [rsp+40h] [rbp-20h]
  int v13; // [rsp+44h] [rbp-1Ch]
  _BYTE *ptr; // [rsp+48h] [rbp-18h]
  _BYTE *ptra; // [rsp+48h] [rbp-18h]
  int i; // [rsp+54h] [rbp-Ch]
  int j; // [rsp+54h] [rbp-Ch]
  int v18; // [rsp+58h] [rbp-8h]
  int k; // [rsp+5Ch] [rbp-4h]
  int v20; // [rsp+5Ch] [rbp-4h]

  v11 = strlen(a1);
  v10 = strlen(a2);
  v9 = strlen(a3);
  if ( v11 )
  {
    v13 = 2 * (strlen(a3) + 1);
    ptra = malloc(v13);
    v12 = 0;
    v8 = malloc(v11);
    v20 = 0;
    v18 = 0;
    while ( v20 <= v9 )
    {
      if ( v13 > v18 + v10 )
      {
        if ( a3[v20] == a1[v12] )
        {
          v8[v12++] = a3[v20];
          if ( v12 == v11 )
          {
            v12 = 0;
            for ( i = 0; i < v10; ++i )
            {
              v4 = v18++;
              ptra[v4] = a2[i];
            }
          }
        }
        else
        {
          for ( j = 0; j < v12; ++j )
          {
            v5 = v18++;
            ptra[v5] = v8[j];
          }
          v12 = 0;
          v6 = v18++;
          ptra[v6] = a3[v20];
        }
      }
      else
      {
        v13 *= 2;
        ptra = realloc(ptra, v13);
      }
      ++v20;
    }
    free(v8);
    return ptra;
  }
  else
  {
    ptr = malloc(v9 + 1);
    for ( k = 0; k <= v9; ++k )
      ptr[k] = a3[k];
    return ptr;
  }
}

//----- (0000000000002B1B) ----------------------------------------------------
_BOOL8 __fastcall prefix(char *a1, char *a2)
{
  char *v3; // rax
  char *v4; // rax
  char *v6; // [rsp+8h] [rbp-18h]
  char v7; // [rsp+1Eh] [rbp-2h]
  char v8; // [rsp+1Fh] [rbp-1h]

  v6 = a1;
  if ( !*a1 )
    return 1LL;
  while ( 1 )
  {
    v3 = v6++;
    v7 = *v3;
    if ( !*v3 )
      break;
    v4 = a2++;
    v8 = *v4;
    if ( !*v4 )
      break;
    if ( v7 != v8 )
      return 0LL;
  }
  return v8 != 0;
}
// 2B7D: variable 'v8' is possibly undefined

//----- (0000000000002B8D) ----------------------------------------------------
char *__fastcall indexLicValues(char *a1)
{
  char *v1; // rax
  char *v2; // rax
  char *v3; // rax
  char *v4; // rax
  char *v5; // rax
  char *v6; // rax
  char *v7; // rax
  char *v8; // rax
  char *v9; // rax
  char *v10; // rax
  char *v11; // rax
  char *v12; // rax
  char *v13; // rax
  char *v14; // rax
  char *v15; // rax
  char *v16; // rax
  char *v17; // rax
  char *v18; // rax
  char *v19; // rax
  char *v20; // rax
  char *v21; // rax
  char *v22; // rax
  char *result; // rax
  char *v24; // rax
  char *v25; // [rsp+18h] [rbp-B8h]
  char *v26; // [rsp+20h] [rbp-B0h]
  char *v27; // [rsp+28h] [rbp-A8h]
  char *v28; // [rsp+30h] [rbp-A0h]
  char *v29; // [rsp+38h] [rbp-98h]
  char *v30; // [rsp+40h] [rbp-90h]
  char *v31; // [rsp+48h] [rbp-88h]
  char *v32; // [rsp+50h] [rbp-80h]
  char *v33; // [rsp+58h] [rbp-78h]
  char *v34; // [rsp+60h] [rbp-70h]
  char *v35; // [rsp+68h] [rbp-68h]
  char *v36; // [rsp+70h] [rbp-60h]
  char *v37; // [rsp+78h] [rbp-58h]
  char *v38; // [rsp+80h] [rbp-50h]
  char *v39; // [rsp+88h] [rbp-48h]
  char *v40; // [rsp+90h] [rbp-40h]
  char *v41; // [rsp+98h] [rbp-38h]
  char *v42; // [rsp+A0h] [rbp-30h]
  char *v43; // [rsp+A8h] [rbp-28h]
  char *v44; // [rsp+B0h] [rbp-20h]
  char *v45; // [rsp+B8h] [rbp-18h]
  char *src; // [rsp+C0h] [rbp-10h]
  char *nptr; // [rsp+C8h] [rbp-8h]

  if ( prefix("FO=", a1) )
  {
    v1 = strdup(a1);
    nptr = (char *)str_replace(v1, "FO=", (const char *)&unk_4C40);
    g_License[2] = atoi(nptr);
  }
  if ( prefix("FMA=", a1) )
  {
    v2 = strdup(a1);
    src = (char *)str_replace(v2, "FMA=", (const char *)&unk_4C40);
    strcpy((char *)&g_License[7], src);
  }
  if ( prefix("FIP=", a1) )
  {
    v3 = strdup(a1);
    v45 = (char *)str_replace(v3, "FIP=", (const char *)&unk_4C40);
    strcpy((char *)&g_License[3], v45);
  }
  if ( prefix("FR=", a1) )
  {
    v4 = strdup(a1);
    v44 = (char *)str_replace(v4, "FR=", (const char *)&unk_4C40);
    strcpy((char *)&g_License[39] + 2, v44);
  }
  if ( prefix("FV=", a1) )
  {
    v5 = strdup(a1);
    v43 = (char *)str_replace(v5, "FV=", (const char *)&unk_4C40);
    strcpy((char *)&g_License[58] + 1, v43);
  }
  if ( prefix("FMM=", a1) )
  {
    v6 = strdup(a1);
    v42 = (char *)str_replace(v6, "FMM=", (const char *)&unk_4C40);
    strcpy((char *)&g_License[77], v42);
  }
  if ( prefix("FD=", a1) )
  {
    v7 = strdup(a1);
    v41 = (char *)str_replace(v7, "FD=", (const char *)&unk_4C40);
    strcpy((char *)&g_License[95] + 3, v41);
  }
  if ( prefix("FIU=", a1) )
  {
    v8 = strdup(a1);
    v40 = (char *)str_replace(v8, "FIU=", (const char *)&unk_4C40);
    *(_QWORD *)&g_License[118] = strtoll(v40, 0LL, 10);
  }
  if ( prefix("FIV=", a1) )
  {
    v9 = strdup(a1);
    v39 = (char *)str_replace(v9, "FIV=", (const char *)&unk_4C40);
    *(_QWORD *)&g_License[120] = strtoll(v39, 0LL, 10);
  }
  if ( prefix("FIL=", a1) )
  {
    v10 = strdup(a1);
    v38 = (char *)str_replace(v10, "FIL=", (const char *)&unk_4C40);
    *(_QWORD *)&g_License[122] = strtoll(v38, 0LL, 10);
  }
  if ( prefix("FK=", a1) )
  {
    v11 = strdup(a1);
    v37 = (char *)str_replace(v11, "FK=", (const char *)&unk_4C40);
    g_License[115] = atoi(v37);
  }
  if ( prefix("FKT=", a1) )
  {
    v12 = strdup(a1);
    v36 = (char *)str_replace(v12, "FKT=", (const char *)&unk_4C40);
    *(_QWORD *)&g_License[116] = atoi(v36);
  }
  if ( prefix("FKTH=", a1) )
  {
    v13 = strdup(a1);
    v35 = (char *)str_replace(v13, "FKTH=", (const char *)&unk_4C40);
    strcpy((char *)&g_License[13] + 1, v35);
  }
  if ( prefix("H=", a1) )
  {
    v14 = strdup(a1);
    v34 = (char *)str_replace(v14, "H=", (const char *)&unk_4C40);
    strcpy((char *)&g_License[153], v34);
  }
  if ( prefix("R=", a1) )
  {
    v15 = strdup(a1);
    v33 = (char *)str_replace(v15, "R=", (const char *)&unk_4C40);
    strcpy((char *)&g_License[171] + 3, v33);
  }
  if ( prefix("IP=", a1) )
  {
    v16 = strdup(a1);
    v32 = (char *)str_replace(v16, "IP=", (const char *)&unk_4C40);
    strcpy((char *)&g_License[124], v32);
  }
  if ( prefix("MAC=", a1) )
  {
    v17 = strdup(a1);
    v31 = (char *)str_replace(v17, "MAC=", (const char *)&unk_4C40);
    strcpy((char *)&g_License[128], v31);
  }
  if ( prefix("UT=", a1) )
  {
    v18 = strdup(a1);
    v30 = (char *)str_replace(v18, "UT=", (const char *)&unk_4C40);
    *(_QWORD *)&g_License[218] = atoi(v30);
  }
  if ( prefix("EW=", a1) )
  {
    v19 = strdup(a1);
    v29 = (char *)str_replace(v19, "EW=", (const char *)&unk_4C40);
    *(_QWORD *)&g_License[220] = atoi(v29);
  }
  if ( prefix("CI=", a1) )
  {
    v20 = strdup(a1);
    v28 = (char *)str_replace(v20, "CI=", (const char *)&unk_4C40);
    *(_QWORD *)&g_License[216] = strtoll(v28, 0LL, 10);
  }
  if ( prefix("CIDT=", a1) )
  {
    v21 = strdup(a1);
    v27 = (char *)str_replace(v21, "CIDT=", (const char *)&unk_4C40);
    strcpy((char *)&g_License[134] + 1, v27);
  }
  if ( prefix("LTD=", a1) )
  {
    v22 = strdup(a1);
    v26 = (char *)str_replace(v22, "LTD=", (const char *)&unk_4C40);
    strcpy((char *)&g_License[209] + 1, v26);
  }
  result = (char *)prefix("FN=", a1);
  if ( (_DWORD)result )
  {
    v24 = strdup(a1);
    v25 = (char *)str_replace(v24, "FN=", (const char *)&unk_4C40);
    return strcpy((char *)&g_License[20] + 3, v25);
  }
  return result;
}
// 206240: using guessed type unsigned int g_License[222];

//----- (0000000000003539) ----------------------------------------------------
_BOOL8 __fastcall isValidMacAddress(_BYTE *a1)
{
  int v3; // [rsp+18h] [rbp-8h]
  int v4; // [rsp+1Ch] [rbp-4h]

  v4 = 0;
  v3 = 0;
  while ( *a1 )
  {
    if ( ((*__ctype_b_loc())[(char)*a1] & 0x1000) != 0 )
    {
      ++v4;
    }
    else if ( *a1 == 58 || *a1 == 45 )
    {
      if ( !v4 || v3 != v4 / 2 - 1 )
        return v4 == 12 && (v3 == 5 || !v3);
      ++v3;
    }
    else
    {
      v3 = -1;
    }
    ++a1;
  }
  return v4 == 12 && (v3 == 5 || !v3);
}

//----- (00000000000035F0) ----------------------------------------------------
unsigned int *validateLicense()
{
  unsigned int *result; // rax
  size_t v1; // rbx
  char s[160]; // [rsp+0h] [rbp-2A0h] BYREF
  char s1[64]; // [rsp+A0h] [rbp-200h] BYREF
  struct utsname name; // [rsp+E0h] [rbp-1C0h] BYREF
  __int64 v5; // [rsp+268h] [rbp-38h]
  __int64 v6; // [rsp+270h] [rbp-30h]
  FILE *stream; // [rsp+278h] [rbp-28h]
  int v9; // [rsp+28Ch] [rbp-14h]

  v9 = 0;
  if ( uname(&name) )
  {
    g_License[1] = 0;
    return 0LL;
  }
  if ( strcmp((const char *)&g_License[153], name.nodename) )
  {
    g_License[1] = 0;
    return 0LL;
  }
  v1 = strlen((const char *)&g_License[153]);
  if ( v1 > strlen((const char *)&g_License[20] + 3) )
    g_old_method = 1;
  if ( opendir("/sys/class/net/") )
  {
    sprintf(s, "/sys/class/net/%s/address", (const char *)&g_License[134] + 1);
    stream = fopen(s, "r");
    if ( stream )
    {
      fscanf(stream, "%s", s1);
      if ( !strcmp(s1, (const char *)&g_License[128]) )
      {
        v9 = 1;
      }
      else
      {
        if ( isValidMacAddress(s1) )
        {
          v9 = 0;
          g_License[1] = 0;
          return 0LL;
        }
        v9 = 1;
      }
    }
    else
    {
      v9 = 1;
      g_License[1] = 1;
    }
  }
  else
  {
    v9 = 1;
  }
  v6 = real_time2(0LL);
  v5 = v6;
  if ( v6 <= *(_QWORD *)&g_License[220] )
  {
    result = g_License;
    g_License[1] = 1;
  }
  else
  {
    g_License[1] = 0;
    return 0LL;
  }
  return result;
}
// 206240: using guessed type unsigned int g_License[222];

//----- (00000000000037FD) ----------------------------------------------------
__int64 __fastcall createRSA(__int64 a1, int a2)
{
  __int64 v3; // [rsp+10h] [rbp-10h] BYREF
  __int64 v4; // [rsp+18h] [rbp-8h]

  v3 = 0LL;
  v4 = BIO_new_mem_buf(a1, 0xFFFFFFFFLL);
  if ( v4 )
  {
    if ( a2 )
      return PEM_read_bio_RSA_PUBKEY(v4, &v3, 0LL, 0LL);
    else
      return PEM_read_bio_RSAPrivateKey(v4, &v3, 0LL, 0LL);
  }
  else
  {
    printf("Failed to create key BIO");
    return 0LL;
  }
}
// 1980: using guessed type __int64 __fastcall PEM_read_bio_RSAPrivateKey(_QWORD, _QWORD, _QWORD, _QWORD);
// 1AA0: using guessed type __int64 __fastcall PEM_read_bio_RSA_PUBKEY(_QWORD, _QWORD, _QWORD, _QWORD);
// 1B80: using guessed type __int64 __fastcall BIO_new_mem_buf(_QWORD, _QWORD);

//----- (0000000000003892) ----------------------------------------------------
__int64 __fastcall public_decrypt(__int64 a1, unsigned int a2, __int64 a3, __int64 a4)
{
  __int64 RSA; // [rsp+28h] [rbp-8h]

  RSA = createRSA(a3, 1);
  return (unsigned int)RSA_public_decrypt(a2, a1, a4, RSA, padding);
}
// 18F0: using guessed type __int64 __fastcall RSA_public_decrypt(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD);

//----- (00000000000038E8) ----------------------------------------------------
void *checkLicenseInfo()
{
  void *result; // rax
  char delim[2]; // [rsp+Eh] [rbp-43E2h] BYREF
  char s[5008]; // [rsp+10h] [rbp-43E0h] BYREF
  char ptr[5008]; // [rsp+13A0h] [rbp-3050h] BYREF
  char v4[2336]; // [rsp+2730h] [rbp-1CC0h] BYREF
  char v5[5004]; // [rsp+3050h] [rbp-13A0h] BYREF
  int v6; // [rsp+43DCh] [rbp-14h]
  FILE *stream; // [rsp+43E0h] [rbp-10h]
  char *i; // [rsp+43E8h] [rbp-8h]

  if ( !strstr(_progname, "whostmgr")
    && !strstr(_progname, "xml-api")
    && !strstr(_progname, "queueprocd")
    && !strstr(_progname, "cpanel")
    && !strstr(_progname, "uapi")
    && !strstr(_progname, "cpsrvd") )
  {
    return 0LL;
  }
  strcpy(
    v4,
    "2d2d2d2d2d424547494e205055424c4943204b45592d2d2d2d2d0d0a4d494944496a414e42676b71686b6947397730424151454641414f434177"
    "38414d49494443674b43417745417845656a772f306f4145336753754f52536c37550d0a6f654a574d754c2f39516d2f33494c617759575a6f6d"
    "38432b4c4a695a4d2b5931674a64744f594c386f596b646c34426b36785068347235616b54593679435a0d0a6d4737317052784d30396d797334"
    "585572664b32737669625a4366653563504930754b78737436353149396b4e396a557143466d39306371374f686c35512f4c0d0a57526a4e4d55"
    "694e3671543450633943307255677535686f7332362f6f6d49685563464978764d4d3932386a734578544976793866483836466859486835654c"
    "0d0a31727870527771515155656a35304d644531357337334a36622b5a6a78343752526c62633145796c68655367756c464e7454346457703074"
    "74646b6348674c510d0a6c7a6370526c6b615a724c39736f55354e464a784639476a73626961733844366345435362496270314f486d5373746c"
    "7a594d4d776c427871624b3441326c4f0d0a493274463646323254436d7875766a576a423574394d6474336865784b5137594e3142705270776e"
    "756c536c4c4e4f75414e3043305838335a4d556b32396c490d0a39343451696f6648306a6442734e642b2b623432706e306444394b50464a326c"
    "6e35436a596c5a617a37595570577954774558617133576e526d5469456a51560d0a4d41727059694a7436346774536c72744f58753145683378"
    "706658714d7268486e4d4b55675375634e4458577876324837392f51474e5835497950754f4e65680d0a39456a474f5350534d78654832632b51"
    "3537494a694e584a3259435474475a7239714257626b4263622b715057765471495a415a4e617543656177464f4f74500d0a4a7a3362614f6c63"
    "376e636c7444447963586d776d3231524a4533554e366c544f365a396377314d496351597974326e704f74533772513574457844304d41520d0a"
    "52435968786738506333746167335659597a4268386454394b62655a55786a4b66383534725a5a4e6371344342624f2f796669485a35454a3669"
    "766c51414e740d0a456e36754a2f6b426f50677873435156516179516f7250566445545848485a623432563352617a746a4b2f534a4a375a4e71"
    "4d34546454466a557264652b4a630d0a74734435656532534a6e417473727334436f796754327838376b776e63596f617a5441523477532b4769"
    "7032484970577075423052376248324c4b736d7a44580d0a37326f6e593858652b364b65782b375242457563746339575730695059754143534f"
    "614879326a684e2f487a6f7571436b533450582f526941556157534e75520d0a717a7067664d2b482b7771354959715657436b46653932546830"
    "30547a5946413741704d7a45536f434575627732465341425359612f6d576e5a6a6d32444f680d0a4f39354b3341796c484673545a355a7a6a38"
    "794f2f73594d744562516f3062365148547a47676641525a477841674d424141453d0d0a2d2d2d2d2d454e44205055424c4943204b45592d2d2d2d2d");
  hex2char(v4, v5);
  stream = fopen("/usr/local/RCBIN/icore/lkey", "rb");
  if ( !stream )
    return 0LL;
  fread(ptr, 0x300uLL, 1uLL, stream);
  result = (void *)public_decrypt((__int64)ptr, 0x300u, (__int64)v5, (__int64)s);
  v6 = (int)result;
  strcpy(delim, ",");
  if ( (_DWORD)result != -1 )
  {
    for ( i = strtok(s, delim); i; i = strtok(0LL, delim) )
      indexLicValues(i);
    return validateLicense();
  }
  return result;
}

//----- (0000000000003ADF) ----------------------------------------------------
_DWORD *init()
{
  _DWORD *result; // rax
  int v1; // edx
  const char *v2; // [rsp+10h] [rbp-10h]
  const char *nptr; // [rsp+18h] [rbp-8h]

  unsetenv("LD_PRELOAD");
  result = (_DWORD *)g_License[0];
  if ( !g_License[0] )
  {
    checkLicenseInfo();
    g_License[0] = 1;
    nptr = getenv("StartDate");
    v2 = getenv("StopDate");
    getenv("WriteDisabled");
    if ( getenv("WriteDisabled") )
    {
      result = &g_write_override_enabled;
      g_write_override_enabled = 0;
    }
    else
    {
      result = &g_write_override_enabled;
      g_write_override_enabled = 1;
    }
    if ( nptr )
    {
      if ( v2 )
      {
        g_limitTimeFaking = 1;
        g_StartDate = atoi(nptr);
        v1 = atoi(v2);
        result = &g_StopDate;
        g_StopDate = v1;
      }
    }
  }
  return result;
}
// 2061D8: using guessed type _DWORD g_write_override_enabled;
// 2061EC: using guessed type int g_StartDate;
// 2061F0: using guessed type _DWORD g_StopDate;
// 206240: using guessed type unsigned int g_License[222];

//----- (0000000000003BC4) ----------------------------------------------------
__int64 __fastcall real_write2(unsigned int a1, __int64 a2, __int64 a3)
{
  __int64 (__fastcall *v3)(_QWORD, __int64, __int64); // rax

  v3 = (__int64 (__fastcall *)(_QWORD, __int64, __int64))dlsym((void *)0xFFFFFFFFFFFFFFFFLL, "write");
  return v3(a1, a2, a3);
}

//----- (0000000000003C02) ----------------------------------------------------
__int64 __fastcall real_time(__int64 a1)
{
  __int64 (__fastcall *v1)(__int64); // rax

  v1 = (__int64 (__fastcall *)(__int64))dlsym((void *)0xFFFFFFFFFFFFFFFFLL, "time");
  return v1(a1);
}

//----- (0000000000003C2F) ----------------------------------------------------
__int64 __fastcall time(__int64 a1)
{
  init();
  ++g_time_calls;
  if ( g_License[1]
    && g_License[115]
    && (!g_StartDate || g_time_calls >= g_StartDate)
    && (!g_StopDate || g_time_calls <= g_StopDate) )
  {
    return *(_QWORD *)&g_License[116];
  }
  else
  {
    return real_time(a1);
  }
}
// 2061EC: using guessed type int g_StartDate;
// 2061F0: using guessed type _DWORD g_StopDate;
// 2061F8: using guessed type int g_time_calls;
// 206240: using guessed type unsigned int g_License[222];

//----- (0000000000003D12) ----------------------------------------------------
int __fastcall ioctl(unsigned int a1, unsigned int a2, __int64 a3)
{
  int result; // eax
  char *v4; // rax
  char *v5; // rax
  char *v6; // rax
  __int64 v7; // rax
  int v9; // [rsp+1Ah] [rbp-66h]
  __int16 v10; // [rsp+1Eh] [rbp-62h]
  __int64 v11; // [rsp+20h] [rbp-60h]
  char *v12; // [rsp+28h] [rbp-58h]
  char *v13; // [rsp+30h] [rbp-50h]
  char *v14; // [rsp+38h] [rbp-48h]
  char *dest; // [rsp+40h] [rbp-40h]
  char *s1; // [rsp+48h] [rbp-38h]
  char *v17; // [rsp+50h] [rbp-30h]
  char *cp; // [rsp+58h] [rbp-28h]
  char *v19; // [rsp+60h] [rbp-20h]
  int v20; // [rsp+6Ch] [rbp-14h]
  unsigned __int8 v21; // [rsp+72h] [rbp-Eh]
  unsigned __int8 v22; // [rsp+73h] [rbp-Dh]
  int v23; // [rsp+74h] [rbp-Ch]
  char *v24; // [rsp+78h] [rbp-8h]

  init();
  ++g_NumberofIOctls;
  if ( !g_License[1] )
    return orig_ioctl_16094(a1, a2, a3);
  v19 = strdup((const char *)&g_License[7]);
  cp = strdup((const char *)&g_License[3]);
  if ( !handle_16090 )
  {
    orig_ioctl_16094 = (__int64 (__fastcall *)(_QWORD, _QWORD, _QWORD))dlsym((void *)0xFFFFFFFFFFFFFFFFLL, "ioctl");
    v17 = dlerror();
    if ( v17 )
    {
      fprintf(stderr, "%s\n", v17);
      exit(1);
    }
  }
  if ( !g_License[1] || g_NumberofIOctls > 5 || a2 != 35111 && a2 != 35093 )
    return orig_ioctl_16094(a1, a2, a3);
  s1 = (char *)(a3 + 2);
  dest = (char *)a3;
  if ( !strcmp((const char *)(a3 + 2), "lo") )
    return orig_ioctl_16094(a1, a2, a3);
  if ( !strcmp(dest, (const char *)&g_License[13] + 1) )
  {
    v14 = dest + 16;
    strncpy(dest, (const char *)&g_License[134] + 1, 0xFuLL);
  }
  if ( a2 == 35093 )
  {
    v20 = orig_ioctl_16094(a1, 35093LL, a3);
    v13 = (char *)a3;
    if ( !strcmp((const char *)a3, (const char *)&g_License[134] + 1) )
    {
      v12 = v13 + 16;
      inet_pton(2, cp, v13 + 20);
      return 0;
    }
    else
    {
      return v20;
    }
  }
  else
  {
    if ( strcmp(dest, (const char *)&g_License[134] + 1) )
      return orig_ioctl_16094(a1, a2, a3);
    v20 = orig_ioctl_16094(a1, 35111LL, a3);
    result = (int)v19;
    v24 = v19;
    if ( v19 )
    {
      v23 = 0;
      do
      {
        v4 = v24++;
        v22 = *v4;
        if ( v22 <= 0x2Fu || v22 > 0x39u )
        {
          if ( v22 <= 0x40u || v22 > 0x46u )
          {
            if ( v22 <= 0x60u || v22 > 0x66u )
            {
              v24 = 0LL;
              goto LABEL_44;
            }
            v22 -= 87;
          }
          else
          {
            v22 -= 55;
          }
        }
        else
        {
          v22 -= 48;
        }
        v5 = v24++;
        v21 = *v5;
        if ( v21 <= 0x2Fu || v21 > 0x39u )
        {
          if ( v21 <= 0x40u || v21 > 0x46u )
          {
            if ( v21 <= 0x60u || v21 > 0x66u )
            {
              v24 = 0LL;
              goto LABEL_44;
            }
            v21 -= 87;
          }
          else
          {
            v21 -= 55;
          }
        }
        else
        {
          v21 -= 48;
        }
        *((_BYTE *)&v9 + v23++) = (16 * v22) | v21;
        if ( v23 > 5 )
          goto LABEL_44;
        v6 = v24++;
      }
      while ( *v6 == 58 );
      v24 = 0LL;
LABEL_44:
      if ( v24 && !*v24 )
      {
        v11 = a3 + 16;
        *(_WORD *)(a3 + 16) = 1;
        v7 = v11 + 2;
        *(_DWORD *)(v11 + 2) = v9;
        *(_WORD *)(v7 + 4) = v10;
        return 0;
      }
      else
      {
        return v20;
      }
    }
  }
  return result;
}
// 3F83: conditional instruction was optimized away because %var_78.4==8927
// 4102: conditional instruction was optimized away because %var_8.8!=0
// 2061E8: using guessed type int g_NumberofIOctls;
// 206210: using guessed type __int64 (__fastcall *orig_ioctl_16094)(_QWORD, _QWORD, _QWORD);
// 206218: using guessed type __int64 handle_16090;
// 206240: using guessed type unsigned int g_License[222];

//----- (0000000000004155) ----------------------------------------------------
__int64 __fastcall real_xstat64(unsigned int a1, __int64 a2, __int64 a3)
{
  __int64 (__fastcall *v3)(_QWORD, __int64, __int64); // rax

  v3 = (__int64 (__fastcall *)(_QWORD, __int64, __int64))dlsym((void *)0xFFFFFFFFFFFFFFFFLL, "__xstat64");
  return v3(a1, a2, a3);
}

//----- (0000000000004193) ----------------------------------------------------
__int64 __fastcall _xstat64(unsigned int a1, const char *a2, __int64 a3)
{
  unsigned int v5; // [rsp+2Ch] [rbp-4h]

  init();
  v5 = real_xstat64(a1, (__int64)a2, a3);
  if ( !g_License[1] )
    return v5;
  if ( !strcmp(a2, "/usr/local/cpanel") )
    *(_QWORD *)(a3 + 8) = *(_QWORD *)&g_License[118];
  if ( !strcmp(a2, "/var/cpanel") )
    *(_QWORD *)(a3 + 8) = *(_QWORD *)&g_License[120];
  return v5;
}
// 206240: using guessed type unsigned int g_License[222];

//----- (000000000000423A) ----------------------------------------------------
__int64 __fastcall real_fxstat64(unsigned int a1, unsigned int a2, __int64 a3)
{
  void *v3; // rax

  v3 = dlsym((void *)0xFFFFFFFFFFFFFFFFLL, "__fxstat64");
  return ((__int64 (__fastcall *)(_QWORD, _QWORD, __int64))v3)(a1, a2, a3);
}

//----- (0000000000004275) ----------------------------------------------------
__int64 __fastcall _fxstat64(unsigned int a1, unsigned int a2, __int64 a3)
{
  unsigned int v5; // [rsp+1Ch] [rbp-4h]

  init();
  v5 = real_fxstat64(a1, a2, a3);
  if ( !g_License[1] )
    return v5;
  if ( *(_QWORD *)(a3 + 8) == *(_QWORD *)&g_License[216] )
    *(_QWORD *)(a3 + 8) = *(_QWORD *)&g_License[122];
  return v5;
}
// 206240: using guessed type unsigned int g_License[222];

//----- (00000000000042F0) ----------------------------------------------------
__int64 __fastcall real_memmove(__int64 a1, __int64 a2, __int64 a3)
{
  __int64 (__fastcall *v3)(__int64, __int64, __int64); // rax

  v3 = (__int64 (__fastcall *)(__int64, __int64, __int64))dlsym((void *)0xFFFFFFFFFFFFFFFFLL, "memmove");
  return v3(a1, a2, a3);
}

//----- (0000000000004331) ----------------------------------------------------
__int64 __fastcall memmove(__int64 a1, const char *a2, size_t a3)
{
  char *dest; // [rsp+28h] [rbp-8h]

  init();
  if ( g_mem_calls > 3
    || !g_License[1]
    || !strstr(a2, "\nhst:")
    || !strstr(a2, "\nuexp:")
    || !strstr(a2, "ltd:")
    || !strstr(a2, "\nlpt:")
    || !strstr(a2, "\nflags:")
    || !strstr(a2, "\nuid:")
    || !strstr(a2, "\nmu:")
    || !strstr(a2, "\nlt:")
    || !strstr(a2, "\npb:")
    || !strstr(a2, "\nhse:")
    || !strstr(a2, "\nm0:")
    || !strstr(a2, "\nm1:")
    || !strstr(a2, "\nm2:")
    || !strstr(a2, "\nm3:")
    || !strstr(a2, "\nm4:")
    || !strstr(a2, "\nm5:")
    || !strstr(a2, "\nm6:")
    || !strstr(a2, "\nm7:")
    || !strstr(a2, "\nm8:")
    || !strstr(a2, "\nm9:") )
  {
    return real_memmove(a1, (__int64)a2, a3);
  }
  dest = (char *)malloc(a3 + 10);
  strncpy(dest, a2, a3);
  if ( !g_old_method )
    str_replace3(dest, a3, (char *)&g_License[20] + 3, &g_License[153]);
  ++g_mem_calls;
  return real_memmove(a1, (__int64)dest, a3);
}
// 1C00: using guessed type __int64 __fastcall str_replace3(_QWORD, _QWORD, _QWORD, _QWORD);
// 206240: using guessed type unsigned int g_License[222];

//----- (000000000000467B) ----------------------------------------------------
__int64 __fastcall real_write(unsigned int a1, __int64 a2, __int64 a3)
{
  __int64 (__fastcall *v3)(_QWORD, __int64, __int64); // rax

  v3 = (__int64 (__fastcall *)(_QWORD, __int64, __int64))dlsym((void *)0xFFFFFFFFFFFFFFFFLL, "write");
  return v3(a1, a2, a3);
}

//----- (00000000000046B9) ----------------------------------------------------
char *__fastcall StringPadRight(char *a1, int a2, const char *a3)
{
  int v5; // [rsp+28h] [rbp-8h]
  int i; // [rsp+2Ch] [rbp-4h]

  v5 = strlen(a1);
  if ( v5 >= a2 )
    return a1;
  for ( i = 0; i < a2 - v5; ++i )
    strcat(a1, a3);
  return a1;
}

//----- (000000000000471A) ----------------------------------------------------
__int64 __fastcall write(unsigned int a1, const char *a2, __int64 a3)
{
  char *v4; // rax
  char *v5; // rax
  char v7[160]; // [rsp+60h] [rbp-170h] BYREF
  char v8[160]; // [rsp+100h] [rbp-D0h] BYREF
  char *dest; // [rsp+1A0h] [rbp-30h]
  char *v10; // [rsp+1A8h] [rbp-28h]
  char *v11; // [rsp+1B0h] [rbp-20h]
  char *v12; // [rsp+1B8h] [rbp-18h]
  char *s; // [rsp+1C0h] [rbp-10h]
  __int64 v14; // [rsp+1C8h] [rbp-8h]

  v14 = a3;
  if ( a1 != 1 )
    return real_write(a1, (__int64)a2, a3);
  init();
  if ( !g_old_method )
    return real_write(a1, (__int64)a2, a3);
  if ( !g_write_override_enabled )
    return real_write(1u, (__int64)a2, a3);
  if ( !g_License[1] || total_write_calls > 2 )
    return real_write(a1, (__int64)a2, a3);
  s = strdup((const char *)&g_License[20] + 3);
  v12 = strdup((const char *)&g_License[153]);
  v4 = strdup(s);
  v11 = strtok(v4, ".");
  v5 = strdup(v12);
  v10 = strtok(v5, ".");
  sprintf(v8, "[%s]", v11);
  sprintf(v7, "[%s]", v10);
  if ( !strstr(a2, s) )
    return real_write(1u, (__int64)a2, a3);
  dest = (char *)malloc(a3 + 500);
  strncpy(dest, a2, a3);
  ++total_write_calls;
  if ( strstr(a2, s) )
    str_replace3(dest, a3, s, v12);
  return real_write(1u, (__int64)dest, a3);
}
// 1C00: using guessed type __int64 __fastcall str_replace3(_QWORD, _QWORD, _QWORD, _QWORD);
// 2061D8: using guessed type _DWORD g_write_override_enabled;
// 2061FC: using guessed type int total_write_calls;
// 206240: using guessed type unsigned int g_License[222];
// 471A: using guessed type char var_D0[160];
// 471A: using guessed type char var_170[160];

//----- (00000000000049C0) ----------------------------------------------------
__int64 __fastcall syscall(__int64 a1, char *a2, __int64 a3, __int64 a4, __int64 a5, __int64 a6, __int64 a7)
{
  char *v8; // rax
  char *v9; // rax
  char *v10; // rax
  __int64 v15; // [rsp+30h] [rbp-10h]
  const char *src; // [rsp+38h] [rbp-8h]

  init();
  orig_syscall_16362 = (__int64 (__fastcall *)(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD, _QWORD, _QWORD))dlsym((void *)0xFFFFFFFFFFFFFFFFLL, "syscall");
  if ( !g_License[1] || a1 != 63 || g_n_uname_syscall > 0 )
    return (int)orig_syscall_16362(a1, a2, a3, a4, a5, a6, a7);
  ++g_n_uname_syscall;
  v15 = (int)orig_syscall_16362(63LL, a2, a3, a4, a5, a6, a7);
  if ( g_old_method )
    src = strdup((const char *)&g_License[20] + 3);
  else
    src = strdup((const char *)&g_License[153]);
  strcpy(a2, "Linux");
  strcpy(a2 + 65, src);
  v8 = strdup((const char *)&g_License[39] + 2);
  strcpy(a2 + 130, v8);
  v9 = strdup((const char *)&g_License[58] + 1);
  strcpy(a2 + 195, v9);
  v10 = strdup((const char *)&g_License[77]);
  strcpy(a2 + 260, v10);
  strcpy(a2 + 325, "GNU/Linux");
  return v15;
}
// 206200: using guessed type int g_n_uname_syscall;
// 206220: using guessed type __int64 (__fastcall *orig_syscall_16362)(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD, _QWORD, _QWORD);
// 206240: using guessed type unsigned int g_License[222];

//----- (0000000000004C0E) ----------------------------------------------------
__int64 ptrace()
{
  return 0LL;
}
// 4C0E: using guessed type __int64 ptrace();

//----- (0000000000004C1C) ----------------------------------------------------
void term_proc()
{
  ;
}

// nfuncs=136 queued=39 decompiled=39 lumina nreq=0 worse=0 better=0
// ALL OK, 39 function(s) have been successfully decompiled
 

C++ Online Compiler

Write, Run & Share C++ code online using OneCompiler's C++ online compiler for free. It's one of the robust, feature-rich online compilers for C++ language, running on the latest version 17. Getting started with the OneCompiler's C++ compiler is simple and pretty fast. The editor shows sample boilerplate code when you choose language as C++ and start coding!

Read inputs from stdin

OneCompiler's C++ online compiler supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample program which takes name as input and print your name with hello.

#include <iostream>
#include <string>
using namespace std;

int main() 
{
    string name;
    cout << "Enter name:";
    getline (cin, name);
    cout << "Hello " << name;
    return 0;
}

About C++

C++ is a widely used middle-level programming language.

  • Supports different platforms like Windows, various Linux flavours, MacOS etc
  • C++ supports OOPS concepts like Inheritance, Polymorphism, Encapsulation and Abstraction.
  • Case-sensitive
  • C++ is a compiler based language
  • C++ supports structured programming language
  • C++ provides alot of inbuilt functions and also supports dynamic memory allocation.
  • Like C, C++ also allows you to play with memory using Pointers.

Syntax help

Loops

1. If-Else:

When ever you want to perform a set of operations based on a condition If-Else is used.

if(conditional-expression) {
   //code
}
else {
   //code
}

You can also use if-else for nested Ifs and If-Else-If ladder when multiple conditions are to be performed on a single variable.

2. Switch:

Switch is an alternative to If-Else-If ladder.

switch(conditional-expression){    
case value1:    
 // code    
 break;  // optional  
case value2:    
 // code    
 break;  // optional  
......    
    
default:     
 code to be executed when all the above cases are not matched;    
} 

3. For:

For loop is used to iterate a set of statements based on a condition.

for(Initialization; Condition; Increment/decrement){  
  //code  
} 

4. While:

While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.

while (condition) {  
// code 
}  

5. Do-While:

Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.

do {  
 // code 
} while (condition); 

Functions

Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increases re-usuability and modularity. Function gets run only when it is called.

How to declare a Function:

return_type function_name(parameters);

How to call a Function:

function_name (parameters)

How to define a Function:

return_type function_name(parameters) {  
 // code
}