home *** CD-ROM | disk | FTP | other *** search
/ WDR Computer Club Digital 1995 February / CLUB0295.BIN / benchmar / cheat / cheat.c next >
C/C++ Source or Header  |  1995-01-16  |  7KB  |  264 lines

  1. //
  2. // Cheat Demonstration Programm
  3. // (c) 1995, ELSA GmbH, Aachen, Germany
  4. //
  5. // This little tiny program demonstrates how easy some benchmark
  6. // can be cheat.
  7. // After invoking this cheater WinTach (V1.2) and Speedy will calculate
  8. // doubled results.
  9. // To fool other (newer) Benchmarks some more tricky things must be done,
  10. // but it is possible too. For readability such cheats are not handled
  11. // here.
  12. //
  13. // Important:
  14. // This program may not be used without remark, that the currently
  15. // running benchmark is object of cheating!
  16. //
  17. #include <windows.h>
  18.  
  19. //
  20. // pointer to a void function returning DWORD
  21. //
  22. typedef DWORD (CALLBACK*      DWFARPROC)(); 
  23.  
  24. //
  25. // some variables
  26. //
  27. #define JMPFAR 0xea                 // opcode of JMP FAR
  28. DWORD   dwStartTickCount = 0L;      // start time of cheat
  29. DWFARPROC paGetTickCount = NULL;      // pointer to GetTickCount routine
  30. DWFARPROC paGetTickCountJump = NULL;  // pointer where GetTickCount will jump
  31.  
  32. //
  33. // Program identification string
  34. //
  35. static char szAppName[] = "ELSA Cheat Demo 1.00";
  36.  
  37.  
  38. //
  39. // window dimesions (to calc string locations)
  40. //
  41. #define COLUMNS 32
  42. #define LINES 4
  43. static short cxChar, cyChar;
  44. static WindowExtX, WindowExtY;
  45.  
  46. //
  47. // Prototypes
  48. //
  49. long FAR PASCAL _export WndProc (HWND, UINT, UINT, LONG);
  50. static void PaintWindow(HWND, HDC);
  51. DWORD FAR PASCAL _loadds CheatGetTickCount(void);
  52.  
  53. //
  54. // the new and cheating GetTickCount()
  55. //
  56. // methode : The tick count return value will be divided by 2.
  57. //           This causes, that WinTach and Speedy will double the
  58. //           speed result.
  59. //
  60.  
  61. static BOOL CheckBench()  // we will check for speedy or WinTach presence
  62. {
  63.   static char strWinTach[] = "WinTach";
  64.   static char strSpeedy[] = "The quick";
  65.   BOOL Result;
  66. _asm {
  67.     mov   dx,1    ; prepare result value
  68.     mov   ax,ss
  69.     mov   es,ax
  70. ;
  71.     mov   si,offset strWinTach
  72.     mov   di,025h
  73. lop1:
  74.     lodsb
  75.     or    al,al
  76.     jz    Detect
  77.     mov   ah,es:[di]
  78.     inc   di
  79.     cmp   ah,al
  80.     jz    lop1
  81. ;
  82.     mov   si,offset strSpeedy
  83.     mov   di,012h
  84. lop2:
  85.     lodsb
  86.     or    al,al
  87.     jz    Detect
  88.     mov   ah,es:[di]
  89.     inc   di
  90.     cmp   ah,al
  91.     jz    lop2
  92. ;
  93.     xor   dx,dx
  94. Detect:
  95.     mov   Result,dx
  96. }
  97.   return(Result);
  98. }
  99.  
  100.  
  101. DWORD FAR PASCAL _loadds CheatGetTickCount(void)
  102. {
  103.   if (CheckBench())
  104.     return ((paGetTickCountJump() + dwStartTickCount) / 2L);
  105.   else
  106.     return(paGetTickCountJump());
  107. }
  108.  
  109. //*****************************************************************//
  110. //
  111. // main procedure
  112. //
  113. //*****************************************************************//
  114.  
  115. int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
  116.                    LPSTR lpszCmdParam, int nCmdShow)
  117. {
  118.   HWND hwnd;
  119.   MSG msg;
  120.   WNDCLASS wndclass;
  121.   TEXTMETRIC tm;
  122.   HDC hdc;
  123.   UINT uCount;
  124.   HANDLE hLib;
  125.   DWORD FAR * PatchPointer;
  126.   WORD TempSel;
  127.  
  128.   if (hPrevInstance)
  129.     return(0);
  130.   else
  131.   {
  132.     wndclass.style         = CS_HREDRAW | CS_VREDRAW;
  133.     wndclass.lpfnWndProc   = WndProc;
  134.     wndclass.cbClsExtra    = 0;
  135.     wndclass.cbWndExtra    = 0;
  136.     wndclass.hInstance     = hInstance;
  137.     wndclass.hIcon         = NULL;
  138.     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW);
  139.     wndclass.hbrBackground = GetStockObject (WHITE_BRUSH);
  140.     wndclass.lpszMenuName  = NULL;
  141.     wndclass.lpszClassName = szAppName;
  142.     RegisterClass (&wndclass);
  143.   }
  144.  
  145.   hdc = CreateIC ("DISPLAY", NULL, NULL, NULL);
  146.   GetTextMetrics (hdc, &tm);
  147.   cxChar = tm.tmAveCharWidth;
  148.   cyChar = tm.tmHeight + tm.tmExternalLeading;
  149.   ReleaseDC (hwnd, hdc);
  150.   WindowExtX = cxChar * COLUMNS;
  151.   WindowExtY = cyChar * LINES;
  152.  
  153.   hwnd = CreateWindow
  154.          (
  155.            szAppName,                             // window class name
  156.            szAppName,                             // title bar string
  157.            WS_OVERLAPPEDWINDOW,                   // windows style
  158.            CW_USEDEFAULT,                         // window position X
  159.            CW_USEDEFAULT,                         // window position Y
  160.            WindowExtX,                            // horizontal size
  161.            WindowExtY,                            // vertical size
  162.            NULL,                                  // parent window handle
  163.            NULL,                                  // menu handle
  164.            hInstance,                             // program copy handle
  165.            NULL                                   // spezial param
  166.          );
  167.  
  168.   ShowWindow (hwnd, SW_SHOWNORMAL);
  169.   UpdateWindow (hwnd);
  170.  
  171.   //
  172.   // build a pointer to the standard timer services
  173.   //
  174.   if (NULL != (hLib = LoadLibrary("USER.EXE")))
  175.   {
  176.     if (
  177.          NULL !=
  178.          (paGetTickCount = (DWFARPROC)GetProcAddress(hLib, "GETTICKCOUNT"))
  179.        )
  180.       if ((*(BYTE FAR *)paGetTickCount) == JMPFAR)
  181.         paGetTickCountJump = (DWFARPROC)
  182.           *(DWORD FAR*)((BYTE FAR*)paGetTickCount + 1);
  183.     FreeLibrary(hLib);
  184.   }
  185.  
  186.   //
  187.   // Flex GetTickCount() entry to our cheat
  188.   //
  189.   if (paGetTickCount) {
  190.     dwStartTickCount = GetTickCount();
  191.     TempSel = AllocSelector(0);
  192.     TempSel = PrestoChangoSelector( SELECTOROF(paGetTickCount), TempSel);
  193.     PatchPointer = (DWORD FAR *) (
  194.                      ((DWORD)TempSel << 16) |
  195.                      ((DWORD)paGetTickCount + 1 & 0x0000ffffL)
  196.                    );
  197.     *PatchPointer = (DWORD)CheatGetTickCount;
  198.     FreeSelector(TempSel);
  199.   }
  200.  
  201.   //
  202.   // message loop
  203.   //
  204.   while (GetMessage (&msg, NULL, 0, 0))
  205.   {
  206.     TranslateMessage (&msg);
  207.     DispatchMessage (&msg);
  208.   }
  209.  
  210.   //
  211.   // Restore original pointer to GetTickCount()
  212.   //
  213.   if (paGetTickCount) {
  214.     TempSel = AllocSelector(0);
  215.     TempSel = PrestoChangoSelector( SELECTOROF(paGetTickCount), TempSel);
  216.     PatchPointer = (DWORD FAR *) (
  217.                      ((DWORD)TempSel << 16) |
  218.                      ((DWORD)paGetTickCount + 1 & 0x0000ffffL)
  219.                    );
  220.     *PatchPointer = (DWORD)paGetTickCountJump;
  221.     FreeSelector(TempSel);
  222.   }
  223.  
  224.   return msg.wParam;
  225. }
  226.  
  227. //
  228. // window draw routine
  229. //
  230. void PaintWindow(HWND hwnd, HDC hdc)
  231. {
  232.   char TextBuffer[128];
  233.   wsprintf (TextBuffer, "WinTach/Speedy cheater active");
  234.   TextOut (hdc, cxChar, cyChar * (1), TextBuffer, lstrlen(TextBuffer));
  235. }
  236.  
  237. //
  238. // message loop handler
  239. //
  240. long FAR PASCAL _export WndProc (HWND hwnd, UINT message,
  241.                                  UINT wParam, LONG lParam)
  242. {
  243.   HDC hdc;
  244.   PAINTSTRUCT ps;
  245.  
  246.   switch (message)
  247.   {
  248.     case WM_CREATE :
  249.       return (0);
  250.  
  251.     case WM_PAINT :
  252.       hdc = BeginPaint (hwnd, &ps);
  253.       PaintWindow (hwnd, hdc);
  254.       EndPaint (hwnd, &ps);
  255.       return (0);
  256.  
  257.     case WM_DESTROY :
  258.       PostQuitMessage (0);
  259.       return (0);
  260.   }
  261.  
  262.   return (DefWindowProc (hwnd, message, wParam, lParam));
  263. }
  264.