设计中的手写识别(输入法)思路 -- 下篇

(本文系转载,原文地址:http://blog.csdn.net/prsniper/article/details/16953403)


1. dump.h

[cpp] view plain copy
  1. #ifndef __SPIDER_DUMP_H_  
  2. #define __SPIDER_DUMP_H_  
  3.   
  4. #if _MSC_VER > 1000  
  5. #pragma once  
  6. #endif // _MSC_VER > 1000  
  7.   
  8. typedef struct _CARDINFO{  
  9.     DWORD dwIndex;      // 牌的序号  
  10.     _CARDINFO *pPrev;   // 前一张指针(NULL为第一张)  
  11.     _CARDINFO *pNext;   // 下一张指针(NULL最后一张)  
  12. } CARDINFO, *PCARDINFO;  
  13.   
  14. typedef struct _CARDPROP{  
  15.     DWORD Class;    // 花色: 梅花=0, 方块=1, 红桃=2, 黑桃=3  
  16.     DWORD Order;    // 序列: A-K, A=0  
  17.     DWORD Opened;   // 状态: 未翻开=0  
  18. } CARDPROP, *PCARDPROP;  
  19.   
  20. typedef struct _GAMEPROP{  
  21.     LPVOID lpCardList[10];  // 链表指针数组  
  22.     DWORD dwCardCount[10];  // 每列牌数数组  
  23.     DWORD dwHideCount[10];  // 未翻牌数数组  
  24. } GAMEPROP, *PGAMEPROP;  
  25.   
  26. typedef struct _GAMEDATA{  
  27.     HWND hWnd;  
  28.     LPVOID lpDifficulty;  
  29.     LPVOID lppTrainList;  
  30. } GAMEDATA, *PGAMEDATA;  
  31.   
  32. #endif  


2.dump.cpp

[cpp] view plain copy
  1. #include <windows.h>  
  2. #include "dump.h"  
  3. #include <stdio.h>  
  4.   
  5. const char *szClass[] = {  
  6.     "梅花",  
  7.     "方块",  
  8.     "红桃",  
  9.     "黑桃"  
  10. };  
  11. const char *szOrder[] = {  
  12.     "A",  
  13.     "2",  
  14.     "3",  
  15.     "4",  
  16.     "5",  
  17.     "6",  
  18.     "7",  
  19.     "8",  
  20.     "9",  
  21.     "10",  
  22.     "J",  
  23.     "Q",  
  24.     "K"  
  25. };  
  26. const char *szOpened[] = {  
  27.     "未翻开",  
  28.     "已翻开"  
  29. };  
  30.   
  31. LPVOID lpBaseAddress = (LPVOID)0x01012008;  // 全局指针  
  32. //LPVOID lpPropAddress = (LPVOID)0x01012008;  
  33. //LPVOID lpViewAddress = (LPVOID)0x01012008;  
  34. //LPVOID lpShowAddress = (LPVOID)0x01012008;  
  35. //LPVOID lpHideAddress = (LPVOID)0x01012008;  
  36.   
  37. GAMEDATA g_Data;  
  38. GAMEPROP g_Prop;  
  39. CARDPROP lpCards[104];  
  40. CARDINFO ci;  
  41.   
  42. int fnDump()  
  43. {  
  44.     HWND hWnd;  
  45.     DWORD dwProcessId;  
  46.     HANDLE hProcess;  
  47.     LPVOID lpAddress;  
  48.     DWORD dwValue;  
  49.     DWORD dwLoop;  
  50.     DWORD dwOrder;  // 12-0循环  
  51.     DWORD dwClass;  //  7-0黑桃*2, 红桃*2, 梅花*2, 方块*2  
  52.   
  53.     int dwRet;  
  54.   
  55.     hWnd = FindWindow(NULL, "蜘蛛");  
  56.     if(hWnd == NULL)  
  57.     {  
  58.         printf("Can not find the spider window!\n");  
  59.         return 0;  
  60.     }  
  61.     GetWindowThreadProcessId(hWnd, &dwProcessId);   // return thread id  
  62.     hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);  
  63.     if(hProcess == NULL)  
  64.     {  
  65.         printf("Can not open process! code: %d.\n", GetLastError());  
  66.         return 0;  
  67.     }  
  68.   
  69.     dwRet = ReadProcessMemory(hProcess, lpBaseAddress, &g_Data, sizeof(GAMEDATA), NULL);  
  70.     if(dwRet == 0)  
  71.     {  
  72.         printf("Can not read global data! code: %d.\n", GetLastError());  
  73.         CloseHandle(hProcess);  
  74.         return 0;  
  75.     }  
  76.     if(g_Data.hWnd != hWnd)  
  77.     {  
  78.         printf("Global data mismatch!\n");  
  79.         CloseHandle(hProcess);  
  80.         return 0;  
  81.     }  
  82.     lpAddress = (LPVOID)((DWORD)lpBaseAddress + 0xF1C);  
  83.     dwRet = ReadProcessMemory(hProcess, lpAddress, &dwValue, sizeof(DWORD), NULL);  
  84.     if(dwRet == 0)  
  85.     {  
  86.         printf("Can not determine whether partially completed or not! code: %d.\n", GetLastError());  
  87.         CloseHandle(hProcess);  
  88.         return 0;  
  89.     }  
  90.     if(dwValue != 0)  
  91.     {  
  92.         printf("Game is partially completed!\n");  
  93.         CloseHandle(hProcess);  
  94.         return 0;  
  95.     }  
  96.     lpAddress = (LPVOID)((DWORD)lpBaseAddress + 0x58);  
  97.     dwRet = ReadProcessMemory(hProcess, lpAddress, &dwValue, sizeof(DWORD), NULL);  
  98.     if(dwRet == 0)  
  99.     {  
  100.         printf("Can not read remaining card count! code: %d.\n", GetLastError());  
  101.         CloseHandle(hProcess);  
  102.         return 0;  
  103.     }  
  104.     dwValue = 5 - dwValue;  // 发完是5次  
  105.     printf("There are(is) %d time(s) remaining.\n", dwValue);  
  106.     if(dwValue > 0)  
  107.     {  
  108.         SetForegroundWindow(hWnd);  
  109.         for(dwLoop = 0; dwLoop < dwValue; dwLoop++)  
  110.         {   // 把所有的牌发完 -> 发送点击发牌菜单的命令  
  111.             dwRet = SendMessage(hWnd, WM_COMMAND, 40016, 0);  
  112.         }  
  113.     }  
  114.     dwRet = ReadProcessMemory(hProcess, g_Data.lpDifficulty, &dwValue, sizeof(DWORD), NULL);  
  115.     if(dwRet == 0)  
  116.     {  
  117.         printf("Can not read difficulty data! code: %d.\n", GetLastError());  
  118.         CloseHandle(hProcess);  
  119.         return 0;  
  120.     }  
  121.     if((dwValue != 1) && (dwValue != 2) && (dwValue != 4))  
  122.     {  
  123.         printf("Difficulty data mismatch!\n");  
  124.         CloseHandle(hProcess);  
  125.         return 0;  
  126.     }  
  127.     dwValue = (DWORD)g_Data.lpDifficulty;  
  128.     dwValue += 0xC;  
  129.     lpAddress = (LPVOID)dwValue;    // 牌属性指针地址  
  130.     dwRet = ReadProcessMemory(hProcess, lpAddress, &dwValue, sizeof(DWORD), NULL);  
  131.     if(dwRet == 0)  
  132.     {  
  133.         printf("Can not read card property pointer! code: %d.\n", GetLastError());  
  134.         CloseHandle(hProcess);  
  135.         return 0;  
  136.     }  
  137.     lpAddress = (LPVOID)dwValue;    // 牌属性指针  
  138.     dwRet = ReadProcessMemory(hProcess, lpAddress, lpCards, sizeof(CARDPROP) * 104, NULL);  
  139.     if(dwRet == 0)  
  140.     {  
  141.         printf("Can not read card property array! code: %d.\n", GetLastError());  
  142.         CloseHandle(hProcess);  
  143.         return 0;  
  144.     }  
  145.     dwRet = ReadProcessMemory(hProcess, g_Data.lppTrainList, &g_Prop, sizeof(GAMEPROP), NULL);  
  146.     if(dwRet == 0)  
  147.     {  
  148.         printf("Can not read train list data! code: %d.\n", GetLastError());  
  149.         CloseHandle(hProcess);  
  150.         return 0;  
  151.     }  
  152.     printf("======== begin dumping card data ========\n");  
  153.     dwOrder = 12;   // ..  
  154.     dwClass = 7;    // ..  
  155.     for(dwLoop = 0; dwLoop < 10; dwLoop++)  
  156.     {   // 遍历每一列  
  157.         dwRet = ReadProcessMemory(hProcess, g_Prop.lpCardList[dwLoop], &dwValue, sizeof(DWORD), NULL);  
  158.         if(dwRet == 0)  
  159.         {   // 此次是根据元素(链表指针读取链表地址)  
  160.             printf("Can not read train %d pointer! code: %d.\n", dwLoop, GetLastError());  
  161.             CloseHandle(hProcess);  
  162.             return 0;  
  163.         }  
  164.         //lpAddress = (LPVOID)dwValue;  
  165.         //dwRet = ReadProcessMemory(hProcess, lpAddress, &dwValue, sizeof(DWORD), NULL);  
  166.         //if(dwRet == 0)  
  167.         //{  
  168.         //  printf("Can not read train %d data! code: %d.\n", dwLoop, GetLastError());  
  169.         //  CloseHandle(hProcess);  
  170.         //  return 0;  
  171.         //}  
  172.         lpAddress = (LPVOID)dwValue;  
  173.         dwRet = ReadProcessMemory(hProcess, lpAddress, &ci, sizeof(CARDINFO), NULL);  
  174.         if(dwRet == 0)  
  175.         {   // 此次读取链表第一个元素(要求游戏一行都没有收起, 也没有空行)  
  176.             printf("Can not read train %d data! code: %d.\n", dwLoop, GetLastError());  
  177.             CloseHandle(hProcess);  
  178.             return 0;  
  179.         }  
  180.         dwValue = 0;  
  181.         // 显示当前实际的卡片属性  
  182.         printf("第 %d 张牌序号为: %d(%s 的 %s%s).\n",  
  183.                 dwValue,  
  184.                 ci.dwIndex,  
  185.                 szOpened[lpCards[ci.dwIndex].Opened],  
  186.                 szClass[lpCards[ci.dwIndex].Class],  
  187.                 szOrder[lpCards[ci.dwIndex].Order]);  
  188.         // 修改为我们想要的属性值  
  189.         lpCards[ci.dwIndex].Opened = 1;             // 已经翻开  
  190.         lpCards[ci.dwIndex].Class = dwClass / 2;    // 花色  
  191.         lpCards[ci.dwIndex].Order = dwOrder;        // 序号  
  192.         if(dwOrder == 0)  
  193.         {   // 已经排到A了  
  194.             if(dwClass == 0) break// 尽头了  
  195.             dwOrder = 12;  
  196.             dwClass--;  
  197.         }else dwOrder--;  
  198.         while(ci.pNext != 0)  
  199.         {  
  200.             lpAddress = (LPVOID)ci.pNext;  
  201.             dwRet = ReadProcessMemory(hProcess, lpAddress, &ci, sizeof(CARDINFO), NULL);  
  202.             if(dwRet == 0)  
  203.             {  
  204.                 printf("Can not read train %d data!! code: %d.\n", dwLoop, GetLastError());  
  205.                 CloseHandle(hProcess);  
  206.                 return 0;  
  207.             }  
  208.             dwValue++;  
  209.             // 显示当前实际的卡片属性  
  210.             printf("第 %d 张牌序号为: %d(%s 的 %s%s).\n",  
  211.                     dwValue,  
  212.                     ci.dwIndex,  
  213.                     szOpened[lpCards[ci.dwIndex].Opened],  
  214.                     szClass[lpCards[ci.dwIndex].Class],  
  215.                     szOrder[lpCards[ci.dwIndex].Order]);  
  216.             // 修改为我们想要的属性值  
  217.             lpCards[ci.dwIndex].Opened = 1;             // 已经翻开  
  218.             lpCards[ci.dwIndex].Class = dwClass / 2;    // 花色  
  219.             lpCards[ci.dwIndex].Order = dwOrder;        // 序号  
  220.             if(dwOrder == 0)  
  221.             {   // 已经排到A了  
  222.                 if(dwClass == 0) break// 尽头了  
  223.                 dwOrder = 12;  
  224.                 dwClass--;  
  225.             }else dwOrder--;  
  226.         }  
  227.         if(ci.pNext) break// 中断跳出的while循环  
  228.         if(dwLoop < 9) printf("\n");  
  229.     }  
  230.     if(dwLoop < 10)  
  231.     {  
  232.         printf("Card count mismatch.\n");  
  233.         CloseHandle(hProcess);  
  234.         return 0;  
  235.     }  
  236.     printf("======== Cracking game memory ========\n");  
  237.     dwValue = (DWORD)g_Data.lpDifficulty;  
  238.     dwValue += 0xC;  
  239.     lpAddress = (LPVOID)dwValue;    // 牌属性指针地址  
  240.     dwRet = ReadProcessMemory(hProcess, lpAddress, &dwValue, sizeof(DWORD), NULL);  
  241.     lpAddress = (LPVOID)dwValue;    // 牌属性指针  
  242.     dwRet = WriteProcessMemory(hProcess, lpAddress, lpCards, sizeof(CARDPROP) * 104, NULL);  
  243.     // 修改已翻开的牌数  
  244.     for(dwLoop = 0; dwLoop < 10; dwLoop++)  
  245.     {  
  246.         g_Prop.dwHideCount[dwLoop] = 0;  
  247.     }  
  248.     dwValue = (DWORD)g_Data.lppTrainList;  
  249.     dwValue += (sizeof(DWORD) * 20);  
  250.     lpAddress = (LPVOID)dwValue;  
  251.     dwRet = WriteProcessMemory(hProcess, lpAddress, g_Prop.dwHideCount, sizeof(DWORD) * 10, NULL);  
  252.     if(dwRet == 0)  
  253.     {  
  254.         printf("Can not crack card view property! code: %d.\n", GetLastError());  
  255.         CloseHandle(hProcess);  
  256.         return 0;  
  257.     }  
  258.     InvalidateRect(hWnd, NULL, TRUE);  
  259.     printf("======== finish dumping card data ========\n");  
  260.     CloseHandle(hProcess);  
  261.     return 1;  
  262. }  
  263.   
  264. int main(int argc, char* argv[])  
  265. {  
  266.     printf("============================================\n");  
  267.     printf("======== 游侠技术研究,请勿非法使用 ========\n");  
  268.     printf("============================================\n");  
  269.     return fnDump();  
  270. }  


至于是干嘛的,看得懂就懂,不懂也就这样了,至于你懂不懂,反正我懂了.

无图有真相...


你可能感兴趣的:(设计中的手写识别(输入法)思路 -- 下篇)