CPP 170
Untitled Guest on 11th February 2020 07:39:56 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 0xF6: //case 0x74:
  260.                                 true_SendPacket(This, "cd", 0xcb, 104);
  261.                                 break;
  262.                         case 0x2E:
  263.                         //      decodeKey(NetworkPacket->data + 1);
  264.                                 break;
  265.                         case 0xB0:
  266.                                 memset(&SpecialStrings[NetworkPacket->data[0]].FontDrawInfo, 0, sizeof(TFontDrawInfo));
  267.                                 SpecialStrings[NetworkPacket->data[0]].isDraw = (NetworkPacket->data[1] == 1) ? true : false;
  268.                                 SpecialStrings[NetworkPacket->data[0]].FontDrawInfo.font = (char) NetworkPacket->data[2];
  269.                                 SpecialStrings[NetworkPacket->data[0]].x = *(int*) (NetworkPacket->data + 3);
  270.                                 SpecialStrings[NetworkPacket->data[0]].y = *(int*) (NetworkPacket->data + 7);
  271.                                 SpecialStrings[NetworkPacket->data[0]].FontDrawInfo.color = *(unsigned int*) (NetworkPacket->data + 11);
  272.                                 wcscpy_s(SpecialStrings[NetworkPacket->data[0]].text, (wchar_t*) (NetworkPacket->data + 15));
  273.                                 if (NetworkPacket->data[0] == 14)
  274.                                 {
  275.                                         HANDLE hIcmpFile = IcmpCreateFile();
  276.                                         ICMP_ECHO_REPLY Reply;
  277.                                         if (hIcmpFile != 0)
  278.                                         {
  279.                                                 if (IcmpSendEcho(hIcmpFile, inet_addr("127.0.0.1"), 0, 0, 0, &Reply, sizeof(ICMP_ECHO_REPLY), 500) != 0)
  280.                                                         lastPing = Reply.RoundTripTime;
  281.                                                 IcmpCloseHandle(hIcmpFile);
  282.                                         }
  283.                                         wsprintf(SpecialStrings[NetworkPacket->data[0]].text, L"%ls%d", (wchar_t*) (NetworkPacket->data + 15), lastPing);
  284.                                 }
  285.                                 break;
  286.                 }
  287.         }
  288.  
  289.         return true_AddNetworkQueue(This, EDX, NetworkPacket);
  290. }
  291.  
  292. bool getHWID(wchar_t *str)
  293. {
  294.         HW_PROFILE_INFO   HwProfInfo;
  295.         char HWID[1024];
  296.  
  297.         if (!GetCurrentHwProfile(&HwProfInfo))
  298.         {
  299.                 return false;
  300.         }
  301.         sprintf_s(HWID, 1000, "%02X%02X%02X%02X", HwProfInfo.szHwProfileGuid);
  302.         mbstowcs_s(0, str, 1000, HWID, 1000);
  303.  
  304.         return true;
  305. }
  306.  
  307. bool getMAC(wchar_t *str)
  308. {
  309.         IP_ADAPTER_INFO AdapterInfo[16];
  310.         PIP_ADAPTER_INFO pAdapterInfo;
  311.         unsigned long dwBufLen;
  312.         char MAC[1024];
  313.  
  314.         dwBufLen = sizeof(AdapterInfo);
  315.  
  316.         if (GetAdaptersInfo(AdapterInfo, &dwBufLen) != ERROR_SUCCESS)
  317.                 return false;
  318.  
  319.         pAdapterInfo = AdapterInfo;
  320.  
  321.         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))
  322.                 pAdapterInfo = pAdapterInfo->Next;
  323.  
  324.         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]);
  325.  
  326.         mbstowcs_s(0, str, 1000, MAC, 1000);
  327.  
  328.         return true;
  329. }
  330.  
  331. char *flipAndCodeBytes (const char *str, int pos, int flip, char *buf)
  332. {
  333.         int i;
  334.         int j = 0;
  335.         int k = 0;
  336.  
  337.         buf[0] = '\0';
  338.  
  339.         if (pos <= 0)
  340.                 return buf;
  341.  
  342.         if (!j)
  343.         {
  344.                 char p = 0;
  345.  
  346.                 j = 1;
  347.                 k = 0;
  348.                 buf[k] = 0;
  349.  
  350.                 for (i = pos; j && str[i] != '\0'; ++i)
  351.                 {
  352.                         char c = tolower(str[i]);
  353.  
  354.                         if (isspace(c))
  355.                                 c = '0';
  356.  
  357.                         ++p;
  358.                         buf[k] <<= 4;
  359.  
  360.                         if (c >= '0' && c <= '9')
  361.                                 buf[k] |= (unsigned char) (c - '0');
  362.                         else if (c >= 'a' && c <= 'f')
  363.                                 buf[k] |= (unsigned char) (c - 'a' + 10);
  364.                         else
  365.                         {
  366.                                 j = 0;
  367.                                 break;
  368.                         }
  369.  
  370.                         if (p == 2)
  371.                         {
  372.                                 if (buf[k] != '\0' && ! isprint(buf[k]))
  373.                                 {
  374.                                         j = 0;
  375.                                         break;
  376.                                 }
  377.  
  378.                                 ++k;
  379.                                 p = 0;
  380.                                 buf[k] = 0;
  381.                         }
  382.                 }
  383.         }
  384.  
  385.         if (!j)
  386.         {
  387.                 j = 1;
  388.                 k = 0;
  389.  
  390.                 for (i = pos; j && str[i] != '\0'; ++i)
  391.                 {
  392.                         char c = str[i];
  393.  
  394.                         if ( ! isprint(c))
  395.                         {
  396.                                 j = 0;
  397.                                 break;
  398.                         }
  399.  
  400.                         buf[k++] = c;
  401.                 }
  402.         }
  403.  
  404.         if (!j)
  405.         {
  406.                 k = 0;
  407.         }
  408.  
  409.         buf[k] = '\0';
  410.  
  411.         if (flip)
  412.                 for (j = 0; j < k; j += 2)
  413.                 {
  414.                         char t = buf[j];
  415.                         buf[j] = buf[j + 1];
  416.                         buf[j + 1] = t;
  417.                 }
  418.  
  419.                 i = j = -1;
  420.  
  421.                 for (k = 0; buf[k] != '\0'; ++k)
  422.                 {
  423.                         if (! isspace(buf[k]))
  424.                         {
  425.                                 if (i < 0)
  426.                                         i = k;
  427.  
  428.                                 j = k;
  429.                         }
  430.                 }
  431.  
  432.                 if ((i >= 0) && (j >= 0))
  433.                 {
  434.                         for (k = i; (k <= j) && (buf[k] != '\0'); ++k)
  435.                                 buf[k - i] = buf[k];
  436.  
  437.                         buf[k - i] = '\0';
  438.                 }
  439.  
  440.                 return buf;
  441. }
  442.  
  443. bool getHDDSerialNumber(wchar_t *str)
  444. {
  445.         HANDLE hPhysicalDriveIOCTL = 0;
  446.         char serialNumber[1024], windir[256], filename[256];
  447.  
  448.         if (GetWindowsDirectoryA(windir, 256) == 0)
  449.                 return false;
  450.  
  451.         memset(filename, 0, 256);
  452.  
  453.         strcpy_s(filename, "\\\\.\\\\");
  454.         windir[2] = 0;
  455.         strcat_s(filename, windir);
  456.  
  457.         hPhysicalDriveIOCTL = CreateFileA(filename, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
  458.  
  459.         if (hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE)
  460.                 return false;
  461.  
  462.         STORAGE_PROPERTY_QUERY query;
  463.         unsigned long cbBytesReturned = 0;
  464.         char buffer[10000];
  465.  
  466.         memset ((void *) &query, 0, sizeof (query));
  467.         query.PropertyId = StorageDeviceProperty;
  468.         query.QueryType = PropertyStandardQuery;
  469.  
  470.         memset (buffer, 0, sizeof (buffer));
  471.  
  472.         if (!(DeviceIoControl(hPhysicalDriveIOCTL, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(query), &buffer, sizeof(buffer), &cbBytesReturned, 0)))
  473.         {
  474.                 CloseHandle(hPhysicalDriveIOCTL);
  475.                 return false;
  476.         }
  477.  
  478.         STORAGE_DEVICE_DESCRIPTOR * descrip = (STORAGE_DEVICE_DESCRIPTOR *) & buffer;
  479.  
  480.         sprintf_s(serialNumber, 1000, "%02X%02X", flipAndCodeBytes(buffer, descrip->SerialNumberOffset, 1, serialNumber));
  481.  
  482.         mbstowcs_s(0, str, 1000, serialNumber, 1000);
  483.  
  484.         return true;
  485. }
  486.  
  487. bool getHwGuid(wchar_t *str)
  488. {
  489.         HW_PROFILE_INFOA HwProfInfo;
  490.         char HWID[1024];
  491.  
  492.         if (GetCurrentHwProfileA(&HwProfInfo) == 0)
  493.                 return false;
  494.  
  495.         sprintf_s(HWID, 1000, "%02X%02X", HwProfInfo.szHwProfileGuid);
  496.  
  497.         mbstowcs_s(0, str, 1000, HWID, 1000);
  498.  
  499.         return true;
  500. }
  501.  
  502. void __cdecl new_SendPacket(unsigned int This, char *Format, ...)
  503. {
  504. //      if ((*(unsigned int*) (KiUserExceptDispADR + 10) + KiUserExceptDispADR < hNtDllStart) || (*(unsigned int*) (KiUserExceptDispADR + 10) + KiUserExceptDispADR > hNtDllEnd))
  505. //              ErrorExit("Bot Program Detected #2!");
  506.  
  507.         unsigned int retAddr = *((unsigned int*) &This - 1);
  508.  
  509.         if ((retAddr < hEngineStart) || (retAddr > hEngineEnd))
  510.         {
  511.                 true_SendPacket(This, "cc", 0xA1, 0x01);
  512.                 ErrorExit("Bot Program Detected #3!");
  513.         }
  514.  
  515.         if (((unsigned int) Format < hEngineStart) || ( (unsigned int) Format > hEngineEnd))
  516.         {
  517.                 true_SendPacket(This, "cc", 0xA1, 0x02);
  518.                 ErrorExit("Bot Program Detected #4!");
  519.         }
  520.  
  521.         if (GetCurrentThreadId() != mainThread)
  522.         {
  523.                 true_SendPacket(This, "cc", 0xA1, 0x03);
  524.                 ErrorExit("Bot Program Detected #5!");
  525.         }
  526.        
  527.         unsigned char buf[10240];
  528.         int size = 0, len;
  529.         wchar_t *wstr;
  530.  
  531.     va_list args;
  532.         va_start(args, Format);
  533.  
  534.         while (*Format != 0)
  535.         {
  536.                 switch (*Format)
  537.                 {
  538.                         case 'c':
  539.                                 *(unsigned char*) (buf + size) = va_arg(args, unsigned char);
  540.                                 size++;
  541.                                 break;
  542.                         case 'h':
  543.                                 *(unsigned short int*) (buf + size) = va_arg(args, unsigned short int);
  544.                                 size += 2;
  545.                                 break;
  546.                         case 'd':
  547.                                 *(unsigned int*) (buf + size) = va_arg(args, unsigned int);
  548.                                 size += 4;
  549.                                 break;
  550.                         case 'Q':
  551.                                 *(unsigned __int64*) (buf + size) = va_arg(args, unsigned __int64);
  552.                                 size += 8;
  553.                                 break;
  554.                         case 'b':
  555.                                 len = va_arg(args, unsigned int);
  556.                                 memcpy(buf + size, va_arg(args, void*), len);
  557.                                 size += len;
  558.                                 break;                 
  559.                         case 'S':
  560.                                 wstr = va_arg(args, wchar_t*);
  561.                                 if (wstr == 0)
  562.                                 {
  563.                                         len = 2;
  564.                                         *(unsigned short int*) (buf + size) = 0;
  565.                                 }
  566.                                 else
  567.                                 {
  568.                                         len = wcslen(wstr) * 2 + 2;
  569.                                         memcpy(buf + size, wstr, len);
  570.                                 }
  571.                                 size += len;
  572.                                 break;
  573.                         default:
  574.                                 true_SendPacket(This, "cc", 0xA1, 0x04);
  575.                                 ErrorExit("Send Packet Unknown Format!");
  576.                                 break;
  577.                 }
  578.                 Format++;      
  579.         }
  580.  
  581.         va_end(args);
  582.  
  583.         switch(buf[0])
  584.         {
  585.                 case 0x0E:
  586.                         wchar_t serialNumber[1024], MAC[1024], HwGuid[1024];
  587.                         memset(serialNumber, 0, 1024 * 2);
  588.                         memset(MAC, 0, 1024 * 2);
  589.                         if (!getHDDSerialNumber(serialNumber))
  590.                         {
  591.                                 true_SendPacket(This, "cc", 0xA1, 0x05);
  592.                                 ErrorExit("Get HDD Serial Number Fail!");
  593.                                 return;
  594.                         }
  595.                         if (!getMAC(MAC))
  596.                         {
  597.                                 true_SendPacket(This, "cc", 0xA1, 0x06);
  598.                                 ErrorExit("Get MAC Fail!");
  599.                                 return;
  600.                         }
  601.                         if (!getHwGuid(HwGuid))
  602.                         {
  603.                                 true_SendPacket(This, "cc", 0xA1, 0x07);
  604.                                 ErrorExit("Get HWID Fail!\n");
  605.                         }
  606.                         if ((wcslen(MAC) == 0) || (wcslen(serialNumber) == 0) || (wcslen(HwGuid) == 0))
  607.                         {
  608.                                 true_SendPacket(This, "cc", 0xA1, 0x08);
  609.                                 ErrorExit("Wrong MAC / Serial Number / HWID!");
  610.                                 return;
  611.                         }
  612.  
  613.                         memcpy(buf + size, serialNumber, wcslen(serialNumber) * 2 + 2);
  614.                         size += wcslen(serialNumber) * 2 + 2;
  615.                         memcpy(buf + size, MAC, wcslen(MAC) * 2 + 2);
  616.                         size += wcslen(MAC) * 2 + 2;
  617.                         memcpy(buf + size, HwGuid, wcslen(HwGuid) * 2 + 2);
  618.                         size += wcslen(HwGuid) * 2 + 2;
  619.                         break;
  620.         }
  621.         true_SendPacket(This, "b", size, (int)buf);
  622. }
  623.  
  624.  
  625. void _fastcall new_Render(unsigned int This, unsigned int EDX, unsigned int FRenderInterface)
  626. {
  627.         mainThread = GetCurrentThreadId();
  628.  
  629.         RECT L2Rect;
  630.         HWND *L2hWND = (HWND*) GetProcAddress(LoadLibraryA("core.dll"), "?GTopWnd@@3PAUHWND__@@A");
  631.  
  632.         true_Render(This, EDX, FRenderInterface);
  633.  
  634.         GetClientRect(*L2hWND, &L2Rect);
  635.  
  636.         for (int i = 0; i < 16; i++)
  637.         {
  638.                 if (SpecialStrings[i].isDraw)
  639.                 {
  640.                         if (i == 15)
  641.                         {
  642.                                 time_t rawtime;
  643.                                 struct tm timeinfo;
  644.                                 wchar_t exstr[16], newstr[64];
  645.  
  646.                                 time(&rawtime);
  647.                                 localtime_s(&timeinfo, &rawtime);
  648.                                 wcsftime(exstr, 15, L"%H:%M", &timeinfo);
  649.                                 wcscpy_s(newstr, SpecialStrings[i].text);
  650.                                 wcscat_s(newstr, exstr);
  651.  
  652.                                 true_DrawTextTTFToCanvas(Canvas, 0, L2Rect.right - SpecialStrings[i].x, L2Rect.top + SpecialStrings[i].y, newstr, &SpecialStrings[i].FontDrawInfo, 0xFF, 0, 0, 0);
  653.                         }
  654.                         else
  655.                                 true_DrawTextTTFToCanvas(Canvas, 0, L2Rect.right - SpecialStrings[i].x, L2Rect.top + SpecialStrings[i].y, SpecialStrings[i].text, &SpecialStrings[i].FontDrawInfo, 0xFF, 0, 0, 0);
  656.                 }
  657.         }
  658. }
  659.  
  660. void _fastcall new_MasterProcessPreRender(unsigned int This, unsigned int EDX, unsigned int UCanvas)
  661. {
  662.         Canvas = UCanvas;
  663.  
  664.         true_MasterProcessPreRender(This, EDX, UCanvas);
  665. }
  666.  
  667. bool DisableGameGuard(void)
  668. {
  669.         unsigned long oldProtect;
  670.         unsigned char *GL2UseGameGuard;
  671.  
  672.         GL2UseGameGuard = (unsigned char *) GetProcAddress(LoadLibraryA("core.dll"), "?GL2UseGameGuard@@3HA");
  673.  
  674.         if(GL2UseGameGuard == 0)
  675.                 return false;
  676.        
  677.         if(!VirtualProtect(GL2UseGameGuard, 1, PAGE_READWRITE, &oldProtect))
  678.                 return false;
  679.  
  680.         *GL2UseGameGuard = 0;
  681.  
  682.         if(!VirtualProtect(GL2UseGameGuard, 1, oldProtect, &oldProtect))
  683.                 return false;
  684.  
  685.         return true;
  686. }
  687.  
  688. unsigned int GetSendPacketAddress(void)
  689. {
  690.         HMODULE hEngine = LoadLibraryA("engine.dll");
  691.  
  692.         unsigned int startVMT = (unsigned int) hEngine + 0x51F658;
  693.         unsigned int AddNetworkQueue = (unsigned int) GetProcAddress(hEngine, "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPacket@@@Z");
  694.         unsigned int currVMT = startVMT;
  695.  
  696.         if (AddNetworkQueue == 0)
  697.         {
  698.                 return 0;
  699.         }
  700.  
  701.         while (true)
  702.         {
  703.                 if (*(unsigned int*) currVMT == AddNetworkQueue)
  704.                 {
  705.                         return *(unsigned int*) (currVMT - 0xA4);
  706.                 }
  707.  
  708.                 currVMT++;
  709.                 if (currVMT - startVMT > 10000)
  710.                 {
  711.                         return 0;
  712.                 }
  713.         }
  714.         return 0;
  715. }
  716.  
  717. void TitleReplaceHookThread(void *param)
  718. {
  719.         while(true)
  720.         {
  721.                 Sleep(50);
  722.                 HWND hWnd = FindWindow(NULL, L"Lineage II");
  723.                 if(hWnd)
  724.                 {
  725.                         SetWindowText(hWnd, L" ");
  726.                         break;
  727.                 }
  728.         }
  729. }
  730.  
  731. void TitleReplaceHook()
  732. {
  733.         _beginthread(TitleReplaceHookThread, 0, NULL);
  734.         CloseHandle(TitleReplaceHookThread);
  735. }
  736.  
  737. bool SetHooks(void)
  738. {
  739.         FARPROC addr;
  740.         HMODULE hEngine = LoadLibraryA("engine.dll"), hNtDlll = LoadLibraryA("ntdll.dll");
  741.         MODULEINFO modinfo;
  742.  
  743.         GetModuleInformation(GetCurrentProcess(), hEngine, &modinfo, sizeof(MODULEINFO));
  744.  
  745.         hEngineStart = (unsigned int) hEngine;
  746.         hEngineEnd = hEngineStart + modinfo.SizeOfImage - 1;
  747.  
  748.         GetModuleInformation(GetCurrentProcess(), hNtDlll, &modinfo, sizeof(MODULEINFO));
  749.  
  750.         hNtDllStart = (unsigned int) hNtDlll;
  751.         hNtDllEnd = hNtDllStart + modinfo.SizeOfImage - 1;
  752.  
  753.         if ((KiUserExceptDispADR = (unsigned int) GetProcAddress(LoadLibraryA("ntdll.dll"), "KiUserExceptionDispatcher")) == 0)
  754.                 return false;
  755.  
  756.         if (*(unsigned char*) (KiUserExceptDispADR) == 0xFC)
  757.                 KiUserExceptDispADR++;
  758.  
  759.         if ((addr = GetProcAddress(LoadLibraryA("ws2_32.dll"), "connect")) == 0)
  760.                 return false;
  761.  
  762.         true_connect = (_connect) splice((unsigned char*) addr, new_connect);
  763.  
  764.         if ((addr = GetProcAddress(hEngine, "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPacket@@@Z")) == 0)
  765.                 return false;
  766.  
  767.         true_AddNetworkQueue = (_AddNetworkQueue) splice((unsigned char*) addr, new_AddNetworkQueue);
  768.  
  769.         if ((addr = (FARPROC) GetSendPacketAddress()) == 0)
  770.                 return false;
  771.  
  772.         true_SendPacket = (_SendPacket) splice((unsigned char*) addr, new_SendPacket);
  773.  
  774.         if ((addr = GetProcAddress(hEngine, "?MasterProcessPreRender@UInteractionMaster@@QAEXPAVUCanvas@@@Z")) == 0)
  775.                 return false;
  776.  
  777.         true_MasterProcessPreRender = (_MasterProcessPreRender) splice((unsigned char*) addr, new_MasterProcessPreRender);
  778.  
  779.         if ((addr = GetProcAddress(hEngine, "?DrawTextTTFToCanvas@UCanvas@@QAEHHHPB_WPBVFontDrawInfo@@EHHPBV?$TArray@PAVFontDrawInfoSection@@@@@Z")) == 0)
  780.                 return false;
  781.  
  782.         true_DrawTextTTFToCanvas = (_DrawTextTTFToCanvas) addr;
  783.  
  784.         if ((addr = GetProcAddress(hEngine, "?Render@FPlayerSceneNode@@UAEXPAVFRenderInterface@@@Z")) == 0)
  785.                 return false;
  786.  
  787.         true_Render = (_Render) splice((unsigned char*) addr, new_Render);
  788.  
  789.         TitleReplaceHook();
  790.         return true;
  791. }
  792.  
  793. LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  794. {
  795.         return DefWindowProc(hWnd, uMsg, wParam, lParam);
  796. }
  797.  
  798. DWORD GetCurrentIP()
  799. {
  800.         WSADATA wsaData;
  801.         WSAStartup(MAKEWORD(1,1), &wsaData);
  802.  
  803.         char HostName[1024];
  804.         DWORD m_HostIP = 0;
  805.  
  806.         if(!gethostname(HostName, 1024))
  807.         {
  808.                 if(LPHOSTENT lphost = gethostbyname(HostName))
  809.                         m_HostIP = ((LPIN_ADDR)lphost->h_addr)->s_addr;
  810.         }
  811.         WSACleanup();
  812.         return m_HostIP;
  813. }
  814. bool LoadTrayIcon(HINSTANCE hInst, unsigned int ID)
  815. {
  816.         ghMutex = CreateMutexA(0, false, "Protected on "/*+GetCurrentIP()*/);
  817.         if (GetLastError() == ERROR_ALREADY_EXISTS)
  818.         {
  819.                 CloseHandle(ghMutex);
  820.                 return true;
  821.         }
  822.  
  823.         WNDCLASSEXA wcx;
  824.         NOTIFYICONDATAA niData;
  825.  
  826.         memset(&wcx, 0, sizeof(WNDCLASSEXA));
  827.  
  828.         wcx.cbSize = sizeof(wcx);
  829.         wcx.lpfnWndProc = WndProc;
  830.         wcx.hInstance = hInst;
  831.         wcx.lpszClassName = "tray_icon";
  832.         if ((RegisterClassExA(&wcx) == 0) && (GetLastError() != ERROR_CLASS_ALREADY_EXISTS))
  833.                 return false;
  834.  
  835.         if ((hWND = CreateWindowExA(0, "tray_icon", 0, 0, 0, 0, 0, 0, 0, 0, hInst, 0)) == 0)
  836.                 return false;
  837.  
  838.         memset(&niData, 0, sizeof(NOTIFYICONDATAA));
  839.  
  840.         niData.cbSize = sizeof(NOTIFYICONDATAA);
  841.         niData.uID = ID;
  842.         niData.uFlags = NIF_ICON | NIF_TIP;
  843.         niData.hWnd = hWND;
  844.         strcpy_s(niData.szTip, "Protected on "/*+GetCurrentIP()*/);
  845.         niData.hIcon = (HICON) LoadImageA(hInst, MAKEINTRESOURCEA(IDI_TRAYICON), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
  846.         if (!Shell_NotifyIconA(NIM_ADD, &niData))
  847.                 return false;
  848.  
  849.         return true;
  850. }
  851.  
  852. void FreeTrayIcon(unsigned int ID)
  853. {
  854.         NOTIFYICONDATAA niData;
  855.  
  856.         memset(&niData, 0, sizeof(NOTIFYICONDATAA));
  857.         niData.cbSize = sizeof(NOTIFYICONDATAA);
  858.         niData.hWnd = hWND;
  859.         niData.uID = ID;
  860.  
  861.         Shell_NotifyIconA(NIM_DELETE, &niData);
  862.  
  863.         CloseHandle(ghMutex);
  864. }
  865.  
  866. int DirectXSetupGetVersion(void)
  867. {
  868.         return 0;
  869. }
  870.  
  871. void InitConsole(void)
  872. {
  873.         AllocConsole();
  874.  
  875.         HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
  876.         int hCrt = _open_osfhandle((long)handle_out, 0);
  877.         FILE* hf_out = _fdopen(hCrt, "w");
  878.         setvbuf(hf_out, NULL, _IONBF, 1);
  879.         *stdout = *hf_out;
  880.  
  881.         HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);
  882.         hCrt = _open_osfhandle((long)handle_in, 0);
  883.         FILE* hf_in = _fdopen(hCrt, "r");
  884.         setvbuf(hf_in, NULL, _IONBF, 128);
  885.         *stdin = *hf_in;
  886. }
  887.  
  888. BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
  889. {
  890.         if (fdwReason == DLL_PROCESS_ATTACH)
  891.         {
  892.                 HBITMAP hBmp = LoadBitmap(hinstDLL,MAKEINTRESOURCE(102)); //Load bitmap
  893.                 if(hBmp)
  894.                 {
  895.                         CSplash splash; //Init class
  896.                         splash.SetBitmap(hBmp); //Set image(BMP + alpha)
  897.                         splash.SetTransparentColor(RGB(255, 255, 255)); //Select color for mask
  898.                         splash.ShowSplash(); //Show splash window and image
  899.                         Sleep(2000); //Sleep for freeze window
  900.                         splash.CloseSplash(); //Close class handler
  901.                 }
  902.  
  903.                 DisableThreadLibraryCalls(hinstDLL);
  904.  
  905.                 LoadTrayIcon(hinstDLL, 1);
  906.  
  907.                 if (!DisableGameGuard())
  908.                 {
  909.                         ErrorExit("Game Guard is not allow this client!");
  910.                         Sleep(INFINITE);
  911.                 }
  912.  
  913.                 if (!SetHooks())
  914.                 {
  915.                         ErrorExit("Protection is not attached this client!");
  916.                         Sleep(INFINITE);
  917.                 }
  918.         }
  919.  
  920.         if (fdwReason == DLL_PROCESS_DETACH)
  921.         {
  922.                 FreeTrayIcon(1);
  923.         }
  924.        
  925.         return true;
  926. }
Raw Paste

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