CPP 172
Untitled Guest on 10th February 2020 09:03:29 PM
  1. #include <winsock2.h>
  2. #include <windows.h>
  3. #include <iphlpapi.h>
  4. #include <stdio.h>
  5. #include <time.h>
  6. #include <tlhelp32.h>
  7. #include <psapi.h>
  8. #include <icmpapi.h>
  9. #include <io.h>
  10.  
  11. #include "hook.h"
  12. #include "blowfish.h"
  13. #include "resource.h"
  14. #include "Obfuscator.h"
  15.  
  16. #include "stdafx.h"
  17. #include "ThemidaSDK.h"
  18. #include "splash.h"
  19.  
  20. #pragma comment(lib, "User32.lib")
  21. #pragma comment(lib, "ws2_32.lib")
  22. #pragma comment(lib, "iphlpapi.lib")
  23. #pragma comment(lib, "psapi.lib")
  24.  
  25. struct TFontDrawInfo
  26. {
  27.         int font;
  28.         unsigned int color, u1, u2, u3, u4;
  29. };
  30.  
  31. struct TNetworkPacket
  32. {
  33.     unsigned char id, p1;
  34.     unsigned short int subid, size, p2;
  35.     unsigned char *data;
  36. };
  37.  
  38. struct TSpecialString
  39. {
  40.         bool isDraw;
  41.         TFontDrawInfo FontDrawInfo;
  42.         int x, y;
  43.         wchar_t text[64];
  44. };
  45.  
  46. #pragma pack(1)
  47. typedef struct _IDENTIFY_DATA
  48. {
  49.         USHORT GeneralConfiguration;
  50.     USHORT NumberOfCylinders;
  51.     USHORT Reserved1;
  52.     USHORT NumberOfHeads;
  53.     USHORT UnformattedBytesPerTrack;
  54.     USHORT UnformattedBytesPerSector;
  55.     USHORT SectorsPerTrack;
  56.     USHORT VendorUnique1[3];
  57.     USHORT SerialNumber[10];
  58.     USHORT BufferType;
  59.     USHORT BufferSectorSize;
  60.     USHORT NumberOfEccBytes;
  61.     USHORT FirmwareRevision[4];
  62.     USHORT ModelNumber[20];
  63.     UCHAR  MaximumBlockTransfer;
  64.     UCHAR  VendorUnique2;
  65.     USHORT DoubleWordIo;
  66.     USHORT Capabilities;
  67.     USHORT Reserved2;
  68.     UCHAR  VendorUnique3;
  69.     UCHAR  PioCycleTimingMode;
  70.     UCHAR  VendorUnique4;
  71.     UCHAR  DmaCycleTimingMode;
  72.     USHORT TranslationFieldsValid:1;
  73.     USHORT Reserved3:15;
  74.     USHORT NumberOfCurrentCylinders;
  75.     USHORT NumberOfCurrentHeads;
  76.     USHORT CurrentSectorsPerTrack;
  77.     ULONG  CurrentSectorCapacity;
  78.     USHORT CurrentMultiSectorSetting;
  79.     ULONG  UserAddressableSectors;
  80.     USHORT SingleWordDMASupport : 8;
  81.     USHORT SingleWordDMAActive : 8;
  82.     USHORT MultiWordDMASupport : 8;
  83.     USHORT MultiWordDMAActive : 8;
  84.     USHORT AdvancedPIOModes : 8;
  85.     USHORT Reserved4 : 8;
  86.     USHORT MinimumMWXferCycleTime;
  87.     USHORT RecommendedMWXferCycleTime;
  88.     USHORT MinimumPIOCycleTime;
  89.     USHORT MinimumPIOCycleTimeIORDY;
  90.     USHORT Reserved5[2];
  91.     USHORT ReleaseTimeOverlapped;
  92.     USHORT ReleaseTimeServiceCommand;
  93.     USHORT MajorRevision;
  94.     USHORT MinorRevision;
  95.     USHORT Reserved6[50];
  96.     USHORT SpecialFunctionsEnabled;
  97.     USHORT Reserved7[128];
  98. } IDENTIFY_DATA, *PIDENTIFY_DATA;
  99. #pragma pack()
  100.  
  101. typedef int (__stdcall *_connect) (SOCKET s, const struct sockaddr *name, int namelen);
  102. _connect true_connect;
  103.  
  104. typedef int (__fastcall *_AddNetworkQueue) (unsigned int This, unsigned int EDX, TNetworkPacket *NetworkPacket);
  105. _AddNetworkQueue true_AddNetworkQueue;
  106.  
  107. typedef void (__cdecl *_SendPacket) (unsigned int This, char *Format, ...);
  108. _SendPacket true_SendPacket;
  109.  
  110. typedef void (_fastcall *_MasterProcessPreRender) (unsigned int This, unsigned int EDX, unsigned int UCanvas);
  111. _MasterProcessPreRender true_MasterProcessPreRender;
  112.  
  113. typedef int (_fastcall *_DrawTextTTFToCanvas) (unsigned int This, unsigned int EDX, int X, int Y, wchar_t *text, TFontDrawInfo *FontDrawInfo, unsigned char, int, int, unsigned int FontDrawInfoSection);
  114. _DrawTextTTFToCanvas true_DrawTextTTFToCanvas;
  115.  
  116. typedef void (_fastcall *_Render) (unsigned int This, unsigned int EDX, unsigned int FRenderInterface);
  117. _Render true_Render;
  118.  
  119. RECT rc;
  120. HWND hWND;
  121. TSpecialString SpecialStrings[16];
  122. unsigned int Canvas, hEngineStart, hEngineEnd, mainThread, lastPing = 0, KiUserExceptDispADR, hNtDllStart, hNtDllEnd;
  123. HANDLE ghMutex;
  124.  
  125. void ErrorExit(char *msg)
  126. {
  127.         FILE *f;
  128.        
  129.         fopen_s(&f, "Protection.log", "a+");
  130.  
  131.         if (f != 0)
  132.         {
  133.                 fprintf(f, "%s\n", msg);
  134.                 fclose(f);
  135.         }
  136.  
  137.         ExitProcess(0);
  138. }
  139.  
  140. void Logger(char *msg)
  141. {
  142.         FILE *f;
  143.        
  144.         fopen_s(&f, "Debug.log", "a+");
  145.  
  146.         if (f != 0)
  147.         {
  148.                 fprintf(f, "%s\n", msg);
  149.                 fclose(f);
  150.         }
  151. }
  152.  
  153. bool SetPrivileges(HANDLE hProcess, DWORD dwPrivilegeCount, LPCTSTR *ppPrivilegeName)
  154. {
  155.         HANDLE hToken = 0;
  156.         if(!::OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hToken))
  157.                 return false;
  158.  
  159.         PTOKEN_PRIVILEGES Privileges = (PTOKEN_PRIVILEGES)
  160.                 new char[sizeof(DWORD) + sizeof(LUID_AND_ATTRIBUTES) * dwPrivilegeCount];
  161.  
  162.         LUID_AND_ATTRIBUTES *LuidAndAttr = (LUID_AND_ATTRIBUTES *)(((char *)Privileges) + sizeof(DWORD));
  163.  
  164.         Privileges->PrivilegeCount = dwPrivilegeCount;
  165.  
  166.         for(DWORD i = 0; i < dwPrivilegeCount; i++)
  167.         {
  168.                 if(!::LookupPrivilegeValue(0,
  169.                         ppPrivilegeName[i],
  170.                         &LuidAndAttr[i].Luid))
  171.                 {
  172.                         ::CloseHandle(hToken);
  173.                         delete[]Privileges;
  174.                         return false;
  175.                 }
  176.  
  177.                 LuidAndAttr[i].Attributes = SE_PRIVILEGE_ENABLED;
  178.         }
  179.         if(!::AdjustTokenPrivileges(hToken, FALSE, Privileges, 0, 0, 0))
  180.         {
  181.                 ::CloseHandle(hToken);
  182.                 delete[]Privileges;
  183.                 return false;
  184.         }
  185.         ::CloseHandle(hToken);
  186.         delete[]Privileges;
  187.         return true;
  188. }
  189.  
  190. bool checkRun(char* NAmePorc)
  191. {
  192.     HANDLE hProcessSnap = NULL;
  193.     PROCESSENTRY32 pe32;
  194.     hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  195.     if(hProcessSnap == INVALID_HANDLE_VALUE)
  196.         {
  197.                 return true;
  198.         }
  199.     pe32.dwSize = sizeof(PROCESSENTRY32);
  200.     if(Process32First(hProcessSnap, &pe32))
  201.     {
  202.         while(Process32Next(hProcessSnap, &pe32));
  203.                 {
  204.                         if(strstr(NAmePorc, (char*)pe32.szExeFile))
  205.                         {
  206.                                 CloseHandle (hProcessSnap);
  207.                                 return true;
  208.                         }
  209.                 }
  210.     }
  211.     CloseHandle(hProcessSnap);
  212.     return false;
  213. }
  214.  
  215. int __stdcall new_connect(SOCKET s, const struct sockaddr *name, int namelen)
  216. {
  217.         struct sockaddr_in *name_in = (struct sockaddr_in*) name;
  218.         if (name_in->sin_port == htons(2106))
  219.         {
  220.                 name_in->sin_port = htons(2106);
  221.                 name_in->sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
  222.         }
  223.  
  224.         if (name_in->sin_port == htons(7777))
  225.         {
  226.                 name_in->sin_port = htons(7777);
  227.                 name_in->sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
  228.         }
  229.         return true_connect(s, name, namelen);
  230. }
  231.  
  232. void decodeKey(unsigned char *buf)
  233. {
  234.         unsigned char bfkey[16] =  {110, 36, 2, 15, -5, 17, 24, 23, 18, 45, 1, 21, 122, 16, -5, 12}; //STATIC KEY
  235.         unsigned char tmp[24];
  236.         Blowfish_CTX ctx;
  237.  
  238.         memcpy(tmp, buf, 16);
  239.  
  240.         Blowfish_Init(&ctx, bfkey, 16);
  241.         Blowfish_Decrypt(&ctx, tmp, 16);
  242.  
  243.         memcpy(buf, tmp, 16);
  244. }
  245. int __fastcall new_AddNetworkQueue(unsigned int This, unsigned int EDX, TNetworkPacket *NetworkPacket)
  246. {
  247. //      if ((*(unsigned int*) (KiUserExceptDispADR + 10) + KiUserExceptDispADR < hNtDllStart) || (*(unsigned int*) (KiUserExceptDispADR + 10) + KiUserExceptDispADR > hNtDllEnd))
  248. //              ErrorExit("Bot Program Detected #0!");
  249.  
  250.         unsigned int retAddr = *((unsigned int*) &NetworkPacket - 1);
  251.  
  252.         if ((retAddr < hEngineStart) || (retAddr > hEngineEnd))
  253.                 ErrorExit("Bot Program Detected #1!");
  254.  
  255.         if (NetworkPacket->subid == 0xFFFF)
  256.         {
  257.                 switch (NetworkPacket->id)
  258.                 {
  259.                         case 0x2E:
  260.                         //      decodeKey(NetworkPacket->data + 1);
  261.                                 break;
  262.                         case 0xB0:
  263.                                 memset(&SpecialStrings[NetworkPacket->data[0]].FontDrawInfo, 0, sizeof(TFontDrawInfo));
  264.                                 SpecialStrings[NetworkPacket->data[0]].isDraw = (NetworkPacket->data[1] == 1) ? true : false;
  265.                                 SpecialStrings[NetworkPacket->data[0]].FontDrawInfo.font = (char) NetworkPacket->data[2];
  266.                                 SpecialStrings[NetworkPacket->data[0]].x = *(int*) (NetworkPacket->data + 3);
  267.                                 SpecialStrings[NetworkPacket->data[0]].y = *(int*) (NetworkPacket->data + 7);
  268.                                 SpecialStrings[NetworkPacket->data[0]].FontDrawInfo.color = *(unsigned int*) (NetworkPacket->data + 11);
  269.                                 wcscpy_s(SpecialStrings[NetworkPacket->data[0]].text, (wchar_t*) (NetworkPacket->data + 15));
  270.                                 if (NetworkPacket->data[0] == 14)
  271.                                 {
  272.                                         HANDLE hIcmpFile = IcmpCreateFile();
  273.                                         ICMP_ECHO_REPLY Reply;
  274.                                         if (hIcmpFile != 0)
  275.                                         {
  276.                                                 if (IcmpSendEcho(hIcmpFile, inet_addr("127.0.0.1"), 0, 0, 0, &Reply, sizeof(ICMP_ECHO_REPLY), 500) != 0)
  277.                                                         lastPing = Reply.RoundTripTime;
  278.                                                 IcmpCloseHandle(hIcmpFile);
  279.                                         }
  280.                                         wsprintf(SpecialStrings[NetworkPacket->data[0]].text, L"%ls%d", (wchar_t*) (NetworkPacket->data + 15), lastPing);
  281.                                 }
  282.                                 break;
  283.                 }
  284.         }
  285.  
  286.         return true_AddNetworkQueue(This, EDX, NetworkPacket);
  287. }
  288.  
  289. bool getHWID(wchar_t *str)
  290. {
  291.         HW_PROFILE_INFO   HwProfInfo;
  292.         char HWID[1024];
  293.  
  294.         if (!GetCurrentHwProfile(&HwProfInfo))
  295.         {
  296.                 return false;
  297.         }
  298.         sprintf_s(HWID, 1000, "%02X%02X%02X%02X", HwProfInfo.szHwProfileGuid);
  299.         mbstowcs_s(0, str, 1000, HWID, 1000);
  300.  
  301.         return true;
  302. }
  303.  
  304. bool getMAC(wchar_t *str)
  305. {
  306.         IP_ADAPTER_INFO AdapterInfo[16];
  307.         PIP_ADAPTER_INFO pAdapterInfo;
  308.         unsigned long dwBufLen;
  309.         char MAC[1024];
  310.  
  311.         dwBufLen = sizeof(AdapterInfo);
  312.  
  313.         if (GetAdaptersInfo(AdapterInfo, &dwBufLen) != ERROR_SUCCESS)
  314.                 return false;
  315.  
  316.         pAdapterInfo = AdapterInfo;
  317.  
  318.         while ((pAdapterInfo->Address[0] == 0) && (pAdapterInfo->Address[1] == 0) && (pAdapterInfo->Address[2] == 0) &&(pAdapterInfo->Address[3] == 0) && (pAdapterInfo->Address[4] == 0) && (pAdapterInfo->Address[5] == 0))
  319.                 pAdapterInfo = pAdapterInfo->Next;
  320.  
  321.         sprintf_s(MAC, 1000, "%02X%02X%02X%02X%02X%02X", pAdapterInfo->Address[0], pAdapterInfo->Address[1], pAdapterInfo->Address[2], pAdapterInfo->Address[3], pAdapterInfo->Address[4], pAdapterInfo->Address[5]);
  322.  
  323.         mbstowcs_s(0, str, 1000, MAC, 1000);
  324.  
  325.         return true;
  326. }
  327.  
  328. char *flipAndCodeBytes (const char *str, int pos, int flip, char *buf)
  329. {
  330.         int i;
  331.         int j = 0;
  332.         int k = 0;
  333.  
  334.         buf[0] = '\0';
  335.  
  336.         if (pos <= 0)
  337.                 return buf;
  338.  
  339.         if (!j)
  340.         {
  341.                 char p = 0;
  342.  
  343.                 j = 1;
  344.                 k = 0;
  345.                 buf[k] = 0;
  346.  
  347.                 for (i = pos; j && str[i] != '\0'; ++i)
  348.                 {
  349.                         char c = tolower(str[i]);
  350.  
  351.                         if (isspace(c))
  352.                                 c = '0';
  353.  
  354.                         ++p;
  355.                         buf[k] <<= 4;
  356.  
  357.                         if (c >= '0' && c <= '9')
  358.                                 buf[k] |= (unsigned char) (c - '0');
  359.                         else if (c >= 'a' && c <= 'f')
  360.                                 buf[k] |= (unsigned char) (c - 'a' + 10);
  361.                         else
  362.                         {
  363.                                 j = 0;
  364.                                 break;
  365.                         }
  366.  
  367.                         if (p == 2)
  368.                         {
  369.                                 if (buf[k] != '\0' && ! isprint(buf[k]))
  370.                                 {
  371.                                         j = 0;
  372.                                         break;
  373.                                 }
  374.  
  375.                                 ++k;
  376.                                 p = 0;
  377.                                 buf[k] = 0;
  378.                         }
  379.                 }
  380.         }
  381.  
  382.         if (!j)
  383.         {
  384.                 j = 1;
  385.                 k = 0;
  386.  
  387.                 for (i = pos; j && str[i] != '\0'; ++i)
  388.                 {
  389.                         char c = str[i];
  390.  
  391.                         if ( ! isprint(c))
  392.                         {
  393.                                 j = 0;
  394.                                 break;
  395.                         }
  396.  
  397.                         buf[k++] = c;
  398.                 }
  399.         }
  400.  
  401.         if (!j)
  402.         {
  403.                 k = 0;
  404.         }
  405.  
  406.         buf[k] = '\0';
  407.  
  408.         if (flip)
  409.                 for (j = 0; j < k; j += 2)
  410.                 {
  411.                         char t = buf[j];
  412.                         buf[j] = buf[j + 1];
  413.                         buf[j + 1] = t;
  414.                 }
  415.  
  416.                 i = j = -1;
  417.  
  418.                 for (k = 0; buf[k] != '\0'; ++k)
  419.                 {
  420.                         if (! isspace(buf[k]))
  421.                         {
  422.                                 if (i < 0)
  423.                                         i = k;
  424.  
  425.                                 j = k;
  426.                         }
  427.                 }
  428.  
  429.                 if ((i >= 0) && (j >= 0))
  430.                 {
  431.                         for (k = i; (k <= j) && (buf[k] != '\0'); ++k)
  432.                                 buf[k - i] = buf[k];
  433.  
  434.                         buf[k - i] = '\0';
  435.                 }
  436.  
  437.                 return buf;
  438. }
  439.  
  440. bool getHDDSerialNumber(wchar_t *str)
  441. {
  442.         HANDLE hPhysicalDriveIOCTL = 0;
  443.         char serialNumber[1024], windir[256], filename[256];
  444.  
  445.         if (GetWindowsDirectoryA(windir, 256) == 0)
  446.                 return false;
  447.  
  448.         memset(filename, 0, 256);
  449.  
  450.         strcpy_s(filename, "\\\\.\\\\");
  451.         windir[2] = 0;
  452.         strcat_s(filename, windir);
  453.  
  454.         hPhysicalDriveIOCTL = CreateFileA(filename, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
  455.  
  456.         if (hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE)
  457.                 return false;
  458.  
  459.         STORAGE_PROPERTY_QUERY query;
  460.         unsigned long cbBytesReturned = 0;
  461.         char buffer[10000];
  462.  
  463.         memset ((void *) &query, 0, sizeof (query));
  464.         query.PropertyId = StorageDeviceProperty;
  465.         query.QueryType = PropertyStandardQuery;
  466.  
  467.         memset (buffer, 0, sizeof (buffer));
  468.  
  469.         if (!(DeviceIoControl(hPhysicalDriveIOCTL, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(query), &buffer, sizeof(buffer), &cbBytesReturned, 0)))
  470.         {
  471.                 CloseHandle(hPhysicalDriveIOCTL);
  472.                 return false;
  473.         }
  474.  
  475.         STORAGE_DEVICE_DESCRIPTOR * descrip = (STORAGE_DEVICE_DESCRIPTOR *) & buffer;
  476.  
  477.         sprintf_s(serialNumber, 1000, "%02X%02X", flipAndCodeBytes(buffer, descrip->SerialNumberOffset, 1, serialNumber));
  478.  
  479.         mbstowcs_s(0, str, 1000, serialNumber, 1000);
  480.  
  481.         return true;
  482. }
  483.  
  484. bool getHwGuid(wchar_t *str)
  485. {
  486.         HW_PROFILE_INFOA HwProfInfo;
  487.         char HWID[1024];
  488.  
  489.         if (GetCurrentHwProfileA(&HwProfInfo) == 0)
  490.                 return false;
  491.  
  492.         sprintf_s(HWID, 1000, "%02X%02X", HwProfInfo.szHwProfileGuid);
  493.  
  494.         mbstowcs_s(0, str, 1000, HWID, 1000);
  495.  
  496.         return true;
  497. }
  498.  
  499. void __cdecl new_SendPacket(unsigned int This, char *Format, ...)
  500. {
  501. //      if ((*(unsigned int*) (KiUserExceptDispADR + 10) + KiUserExceptDispADR < hNtDllStart) || (*(unsigned int*) (KiUserExceptDispADR + 10) + KiUserExceptDispADR > hNtDllEnd))
  502. //              ErrorExit("Bot Program Detected #2!");
  503.  
  504.         unsigned int retAddr = *((unsigned int*) &This - 1);
  505.  
  506.         if ((retAddr < hEngineStart) || (retAddr > hEngineEnd))
  507.         {
  508.                 true_SendPacket(This, "cc", 0xA1, 0x01);
  509.                 ErrorExit("Bot Program Detected #3!");
  510.         }
  511.  
  512.         if (((unsigned int) Format < hEngineStart) || ( (unsigned int) Format > hEngineEnd))
  513.         {
  514.                 true_SendPacket(This, "cc", 0xA1, 0x02);
  515.                 ErrorExit("Bot Program Detected #4!");
  516.         }
  517.  
  518.         if (GetCurrentThreadId() != mainThread)
  519.         {
  520.                 true_SendPacket(This, "cc", 0xA1, 0x03);
  521.                 ErrorExit("Bot Program Detected #5!");
  522.         }
  523.        
  524.         unsigned char buf[10240];
  525.         int size = 0, len;
  526.         wchar_t *wstr;
  527.  
  528.     va_list args;
  529.         va_start(args, Format);
  530.  
  531.         while (*Format != 0)
  532.         {
  533.                 switch (*Format)
  534.                 {
  535.                         case 'c':
  536.                                 *(unsigned char*) (buf + size) = va_arg(args, unsigned char);
  537.                                 size++;
  538.                                 break;
  539.                         case 'h':
  540.                                 *(unsigned short int*) (buf + size) = va_arg(args, unsigned short int);
  541.                                 size += 2;
  542.                                 break;
  543.                         case 'd':
  544.                                 *(unsigned int*) (buf + size) = va_arg(args, unsigned int);
  545.                                 size += 4;
  546.                                 break;
  547.                         case 'Q':
  548.                                 *(unsigned __int64*) (buf + size) = va_arg(args, unsigned __int64);
  549.                                 size += 8;
  550.                                 break;
  551.                         case 'b':
  552.                                 len = va_arg(args, unsigned int);
  553.                                 memcpy(buf + size, va_arg(args, void*), len);
  554.                                 size += len;
  555.                                 break;                 
  556.                         case 'S':
  557.                                 wstr = va_arg(args, wchar_t*);
  558.                                 if (wstr == 0)
  559.                                 {
  560.                                         len = 2;
  561.                                         *(unsigned short int*) (buf + size) = 0;
  562.                                 }
  563.                                 else
  564.                                 {
  565.                                         len = wcslen(wstr) * 2 + 2;
  566.                                         memcpy(buf + size, wstr, len);
  567.                                 }
  568.                                 size += len;
  569.                                 break;
  570.                         default:
  571.                                 true_SendPacket(This, "cc", 0xA1, 0x04);
  572.                                 ErrorExit("Send Packet Unknown Format!");
  573.                                 break;
  574.                 }
  575.                 Format++;      
  576.         }
  577.  
  578.         va_end(args);
  579.  
  580.         switch(buf[0])
  581.         {
  582.                 case 0x0E:
  583.                         wchar_t serialNumber[1024], MAC[1024], HwGuid[1024];
  584.                         memset(serialNumber, 0, 1024 * 2);
  585.                         memset(MAC, 0, 1024 * 2);
  586.                         if (!getHDDSerialNumber(serialNumber))
  587.                         {
  588.                                 true_SendPacket(This, "cc", 0xA1, 0x05);
  589.                                 ErrorExit("Get HDD Serial Number Fail!");
  590.                                 return;
  591.                         }
  592.                         if (!getMAC(MAC))
  593.                         {
  594.                                 true_SendPacket(This, "cc", 0xA1, 0x06);
  595.                                 ErrorExit("Get MAC Fail!");
  596.                                 return;
  597.                         }
  598.                         if (!getHwGuid(HwGuid))
  599.                         {
  600.                                 true_SendPacket(This, "cc", 0xA1, 0x07);
  601.                                 ErrorExit("Get HWID Fail!\n");
  602.                         }
  603.                         if ((wcslen(MAC) == 0) || (wcslen(serialNumber) == 0) || (wcslen(HwGuid) == 0))
  604.                         {
  605.                                 true_SendPacket(This, "cc", 0xA1, 0x08);
  606.                                 ErrorExit("Wrong MAC / Serial Number / HWID!");
  607.                                 return;
  608.                         }
  609.  
  610.                         memcpy(buf + size, serialNumber, wcslen(serialNumber) * 2 + 2);
  611.                         size += wcslen(serialNumber) * 2 + 2;
  612.                         memcpy(buf + size, MAC, wcslen(MAC) * 2 + 2);
  613.                         size += wcslen(MAC) * 2 + 2;
  614.                         memcpy(buf + size, HwGuid, wcslen(HwGuid) * 2 + 2);
  615.                         size += wcslen(HwGuid) * 2 + 2;
  616.                         break;
  617.         }
  618.         true_SendPacket(This, "b", size, (int)buf);
  619. }
  620.  
  621.  
  622. void _fastcall new_Render(unsigned int This, unsigned int EDX, unsigned int FRenderInterface)
  623. {
  624.         mainThread = GetCurrentThreadId();
  625.  
  626.         RECT L2Rect;
  627.         HWND *L2hWND = (HWND*) GetProcAddress(LoadLibraryA("core.dll"), "?GTopWnd@@3PAUHWND__@@A");
  628.  
  629.         true_Render(This, EDX, FRenderInterface);
  630.  
  631.         GetClientRect(*L2hWND, &L2Rect);
  632.  
  633.         for (int i = 0; i < 16; i++)
  634.         {
  635.                 if (SpecialStrings[i].isDraw)
  636.                 {
  637.                         if (i == 15)
  638.                         {
  639.                                 time_t rawtime;
  640.                                 struct tm timeinfo;
  641.                                 wchar_t exstr[16], newstr[64];
  642.  
  643.                                 time(&rawtime);
  644.                                 localtime_s(&timeinfo, &rawtime);
  645.                                 wcsftime(exstr, 15, L"%H:%M", &timeinfo);
  646.                                 wcscpy_s(newstr, SpecialStrings[i].text);
  647.                                 wcscat_s(newstr, exstr);
  648.  
  649.                                 true_DrawTextTTFToCanvas(Canvas, 0, L2Rect.right - SpecialStrings[i].x, L2Rect.top + SpecialStrings[i].y, newstr, &SpecialStrings[i].FontDrawInfo, 0xFF, 0, 0, 0);
  650.                         }
  651.                         else
  652.                                 true_DrawTextTTFToCanvas(Canvas, 0, L2Rect.right - SpecialStrings[i].x, L2Rect.top + SpecialStrings[i].y, SpecialStrings[i].text, &SpecialStrings[i].FontDrawInfo, 0xFF, 0, 0, 0);
  653.                 }
  654.         }
  655. }
  656.  
  657. void _fastcall new_MasterProcessPreRender(unsigned int This, unsigned int EDX, unsigned int UCanvas)
  658. {
  659.         Canvas = UCanvas;
  660.  
  661.         true_MasterProcessPreRender(This, EDX, UCanvas);
  662. }
  663.  
  664. bool DisableGameGuard(void)
  665. {
  666.         unsigned long oldProtect;
  667.         unsigned char *GL2UseGameGuard;
  668.  
  669.         GL2UseGameGuard = (unsigned char *) GetProcAddress(LoadLibraryA("core.dll"), "?GL2UseGameGuard@@3HA");
  670.  
  671.         if(GL2UseGameGuard == 0)
  672.                 return false;
  673.        
  674.         if(!VirtualProtect(GL2UseGameGuard, 1, PAGE_READWRITE, &oldProtect))
  675.                 return false;
  676.  
  677.         *GL2UseGameGuard = 0;
  678.  
  679.         if(!VirtualProtect(GL2UseGameGuard, 1, oldProtect, &oldProtect))
  680.                 return false;
  681.  
  682.         return true;
  683. }
  684.  
  685. unsigned int GetSendPacketAddress(void)
  686. {
  687.         HMODULE hEngine = LoadLibraryA("engine.dll");
  688.  
  689.         unsigned int startVMT = (unsigned int) hEngine + 0x51F658;
  690.         unsigned int AddNetworkQueue = (unsigned int) GetProcAddress(hEngine, "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPacket@@@Z");
  691.         unsigned int currVMT = startVMT;
  692.  
  693.         if (AddNetworkQueue == 0)
  694.         {
  695.                 return 0;
  696.         }
  697.  
  698.         while (true)
  699.         {
  700.                 if (*(unsigned int*) currVMT == AddNetworkQueue)
  701.                 {
  702.                         return *(unsigned int*) (currVMT - 0xA4);
  703.                 }
  704.  
  705.                 currVMT++;
  706.                 if (currVMT - startVMT > 10000)
  707.                 {
  708.                         return 0;
  709.                 }
  710.         }
  711.         return 0;
  712. }
  713.  
  714. void TitleReplaceHookThread(void *param)
  715. {
  716.         while(true)
  717.         {
  718.                 Sleep(50);
  719.                 HWND hWnd = FindWindow(NULL, L"Lineage II");
  720.                 if(hWnd)
  721.                 {
  722.                         SetWindowText(hWnd, L" ");
  723.                         break;
  724.                 }
  725.         }
  726. }
  727.  
  728. void TitleReplaceHook()
  729. {
  730.         _beginthread(TitleReplaceHookThread, 0, NULL);
  731.         CloseHandle(TitleReplaceHookThread);
  732. }
  733.  
  734. bool SetHooks(void)
  735. {
  736.         FARPROC addr;
  737.         HMODULE hEngine = LoadLibraryA("engine.dll"), hNtDlll = LoadLibraryA("ntdll.dll");
  738.         MODULEINFO modinfo;
  739.  
  740.         GetModuleInformation(GetCurrentProcess(), hEngine, &modinfo, sizeof(MODULEINFO));
  741.  
  742.         hEngineStart = (unsigned int) hEngine;
  743.         hEngineEnd = hEngineStart + modinfo.SizeOfImage - 1;
  744.  
  745.         GetModuleInformation(GetCurrentProcess(), hNtDlll, &modinfo, sizeof(MODULEINFO));
  746.  
  747.         hNtDllStart = (unsigned int) hNtDlll;
  748.         hNtDllEnd = hNtDllStart + modinfo.SizeOfImage - 1;
  749.  
  750.         if ((KiUserExceptDispADR = (unsigned int) GetProcAddress(LoadLibraryA("ntdll.dll"), "KiUserExceptionDispatcher")) == 0)
  751.                 return false;
  752.  
  753.         if (*(unsigned char*) (KiUserExceptDispADR) == 0xFC)
  754.                 KiUserExceptDispADR++;
  755.  
  756.         if ((addr = GetProcAddress(LoadLibraryA("ws2_32.dll"), "connect")) == 0)
  757.                 return false;
  758.  
  759.         true_connect = (_connect) splice((unsigned char*) addr, new_connect);
  760.  
  761.         if ((addr = GetProcAddress(hEngine, "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPacket@@@Z")) == 0)
  762.                 return false;
  763.  
  764.         true_AddNetworkQueue = (_AddNetworkQueue) splice((unsigned char*) addr, new_AddNetworkQueue);
  765.  
  766.         if ((addr = (FARPROC) GetSendPacketAddress()) == 0)
  767.                 return false;
  768.  
  769.         true_SendPacket = (_SendPacket) splice((unsigned char*) addr, new_SendPacket);
  770.  
  771.         if ((addr = GetProcAddress(hEngine, "?MasterProcessPreRender@UInteractionMaster@@QAEXPAVUCanvas@@@Z")) == 0)
  772.                 return false;
  773.  
  774.         true_MasterProcessPreRender = (_MasterProcessPreRender) splice((unsigned char*) addr, new_MasterProcessPreRender);
  775.  
  776.         if ((addr = GetProcAddress(hEngine, "?DrawTextTTFToCanvas@UCanvas@@QAEHHHPB_WPBVFontDrawInfo@@EHHPBV?$TArray@PAVFontDrawInfoSection@@@@@Z")) == 0)
  777.                 return false;
  778.  
  779.         true_DrawTextTTFToCanvas = (_DrawTextTTFToCanvas) addr;
  780.  
  781.         if ((addr = GetProcAddress(hEngine, "?Render@FPlayerSceneNode@@UAEXPAVFRenderInterface@@@Z")) == 0)
  782.                 return false;
  783.  
  784.         true_Render = (_Render) splice((unsigned char*) addr, new_Render);
  785.  
  786.         TitleReplaceHook();
  787.         return true;
  788. }
  789.  
  790. LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  791. {
  792.         return DefWindowProc(hWnd, uMsg, wParam, lParam);
  793. }
  794.  
  795. DWORD GetCurrentIP()
  796. {
  797.         WSADATA wsaData;
  798.         WSAStartup(MAKEWORD(1,1), &wsaData);
  799.  
  800.         char HostName[1024];
  801.         DWORD m_HostIP = 0;
  802.  
  803.         if(!gethostname(HostName, 1024))
  804.         {
  805.                 if(LPHOSTENT lphost = gethostbyname(HostName))
  806.                         m_HostIP = ((LPIN_ADDR)lphost->h_addr)->s_addr;
  807.         }
  808.         WSACleanup();
  809.         return m_HostIP;
  810. }
  811. bool LoadTrayIcon(HINSTANCE hInst, unsigned int ID)
  812. {
  813.         ghMutex = CreateMutexA(0, false, "Protected on "/*+GetCurrentIP()*/);
  814.         if (GetLastError() == ERROR_ALREADY_EXISTS)
  815.         {
  816.                 CloseHandle(ghMutex);
  817.                 return true;
  818.         }
  819.  
  820.         WNDCLASSEXA wcx;
  821.         NOTIFYICONDATAA niData;
  822.  
  823.         memset(&wcx, 0, sizeof(WNDCLASSEXA));
  824.  
  825.         wcx.cbSize = sizeof(wcx);
  826.         wcx.lpfnWndProc = WndProc;
  827.         wcx.hInstance = hInst;
  828.         wcx.lpszClassName = "tray_icon";
  829.         if ((RegisterClassExA(&wcx) == 0) && (GetLastError() != ERROR_CLASS_ALREADY_EXISTS))
  830.                 return false;
  831.  
  832.         if ((hWND = CreateWindowExA(0, "tray_icon", 0, 0, 0, 0, 0, 0, 0, 0, hInst, 0)) == 0)
  833.                 return false;
  834.  
  835.         memset(&niData, 0, sizeof(NOTIFYICONDATAA));
  836.  
  837.         niData.cbSize = sizeof(NOTIFYICONDATAA);
  838.         niData.uID = ID;
  839.         niData.uFlags = NIF_ICON | NIF_TIP;
  840.         niData.hWnd = hWND;
  841.         strcpy_s(niData.szTip, "Protected on "/*+GetCurrentIP()*/);
  842.         niData.hIcon = (HICON) LoadImageA(hInst, MAKEINTRESOURCEA(IDI_TRAYICON), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
  843.         if (!Shell_NotifyIconA(NIM_ADD, &niData))
  844.                 return false;
  845.  
  846.         return true;
  847. }
  848.  
  849. void FreeTrayIcon(unsigned int ID)
  850. {
  851.         NOTIFYICONDATAA niData;
  852.  
  853.         memset(&niData, 0, sizeof(NOTIFYICONDATAA));
  854.         niData.cbSize = sizeof(NOTIFYICONDATAA);
  855.         niData.hWnd = hWND;
  856.         niData.uID = ID;
  857.  
  858.         Shell_NotifyIconA(NIM_DELETE, &niData);
  859.  
  860.         CloseHandle(ghMutex);
  861. }
  862.  
  863. int DirectXSetupGetVersion(void)
  864. {
  865.         return 0;
  866. }
  867.  
  868. void InitConsole(void)
  869. {
  870.         AllocConsole();
  871.  
  872.         HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
  873.         int hCrt = _open_osfhandle((long)handle_out, 0);
  874.         FILE* hf_out = _fdopen(hCrt, "w");
  875.         setvbuf(hf_out, NULL, _IONBF, 1);
  876.         *stdout = *hf_out;
  877.  
  878.         HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);
  879.         hCrt = _open_osfhandle((long)handle_in, 0);
  880.         FILE* hf_in = _fdopen(hCrt, "r");
  881.         setvbuf(hf_in, NULL, _IONBF, 128);
  882.         *stdin = *hf_in;
  883. }
  884.  
  885. BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
  886. {
  887.         if (fdwReason == DLL_PROCESS_ATTACH)
  888.         {
  889.  
  890.                 HBITMAP hBmp = LoadBitmap(hinstDLL,MAKEINTRESOURCE(102)); //Load bitmap
  891.                 if(hBmp)
  892.                 {
  893.                         CSplash splash; //Init class
  894.                         splash.SetBitmap(hBmp); //Set image(BMP + alpha)
  895.                         splash.SetTransparentColor(RGB(255, 255, 255)); //Select color for mask
  896.                         splash.ShowSplash(); //Show splash window and image
  897.                         Sleep(2000); //Sleep for freeze window
  898.                         splash.CloseSplash(); //Close class handler
  899.                 }
  900.  
  901.                 DisableThreadLibraryCalls(hinstDLL);
  902.  
  903.                 LoadTrayIcon(hinstDLL, 1);
  904.  
  905.                 if (!DisableGameGuard())
  906.                 {
  907.                         ErrorExit("Game Guard is not allow this client!");
  908.                         Sleep(INFINITE);
  909.                 }
  910.  
  911.                 if (!SetHooks())
  912.                 {
  913.                         ErrorExit("Protection is not attached this client!");
  914.                         Sleep(INFINITE);
  915.                 }
  916.         }
  917.  
  918.         if (fdwReason == DLL_PROCESS_DETACH)
  919.         {
  920.                 FreeTrayIcon(1);
  921.         }
  922.        
  923.         return true;
  924. }
Raw Paste

Login or Register to edit or fork this paste. It's free.