TSMemoryAPI.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #pragma once
  2. #include "ASM/MgAsmCom.h"
  3. #include "ASM/MgAsmComDef.h"
  4. #include <string>
  5. #define FINDDATATYPE_FINDDATAEX 1
  6. #define FINDDATATYPE_FINDDOUBLEEX 2
  7. #define FINDDATATYPE_FINDFLOATEX 3
  8. #define FINDDATATYPE_FINDINTEX 4
  9. #define FINDDATATYPE_FINDSTRINGEX 5
  10. typedef struct _FindDataInfo //线程传参数结构体
  11. {
  12. HANDLE hprocess;
  13. DWORD dwncount; //要找的地址数据个数
  14. int count;//记录个数
  15. double double_value_min;
  16. double double_value_max;
  17. float float_value_min;
  18. float float_value_max;
  19. LONG int_value_min;
  20. LONG int_value_max;
  21. BYTE FindIntType;//找0:32位,1:16位,2:8位
  22. LONG FindDataType;//找数据的类型
  23. wchar_t Findstring[MAX_PATH];
  24. DWORD Finddata[MAX_PATH]; //要找的数据字符串
  25. DWORD dwbegin[MAX_PATH * 10];
  26. DWORD dwend[MAX_PATH * 10];
  27. bool bfindindex[MAX_PATH * 10];//做地址标志位,标识多线程要处理的地址
  28. wchar_t* retstr;
  29. CRITICAL_SECTION m_mutex;//多线程临界区
  30. _FindDataInfo()
  31. {
  32. hprocess = NULL;
  33. retstr = NULL;
  34. dwncount = 0;
  35. count = 0;
  36. double_value_min = 0;
  37. double_value_max = 0;
  38. float_value_min = 0;
  39. float_value_max = 0;
  40. int_value_min = 0;
  41. int_value_max = 0;
  42. FindIntType = -1;//找0:32位,1:16位,2:8位
  43. FindDataType = -1;//找数据的类型
  44. memset(Finddata, 0, MAX_PATH * sizeof(DWORD));
  45. memset(Findstring, 0, MAX_PATH);
  46. memset(dwbegin, 0, MAX_PATH * 10);
  47. memset(dwend, 0, MAX_PATH * 10);
  48. memset(bfindindex, 0, MAX_PATH * 10); //模式为false
  49. }
  50. }FindDataInfo, * PFindDataInfo;
  51. typedef struct {
  52. unsigned short Length;
  53. unsigned short MaximumLength;
  54. unsigned short* Buffer;
  55. } UNICODE_STRING;
  56. typedef UNICODE_STRING* PUNICODE_STRING;
  57. typedef struct _CLIENT_ID {
  58. HANDLE UniqueProcess;
  59. HANDLE UniqueThread;
  60. } CLIENT_ID;
  61. typedef CLIENT_ID* PCLIENT_ID;
  62. typedef struct _OBJECT_ATTRIBUTES {
  63. ULONG Length;
  64. HANDLE RootDirectory;
  65. PUNICODE_STRING ObjectName;
  66. ULONG Attributes;
  67. PVOID SecurityDescriptor;
  68. PVOID SecurityQualityOfService;
  69. } OBJECT_ATTRIBUTES, * POBJECT_ATTRIBUTES;
  70. typedef CONST OBJECT_ATTRIBUTES* PCOBJECT_ATTRIBUTES;
  71. typedef struct {
  72. unsigned long AllocationSize;
  73. unsigned long ActualSize;
  74. unsigned long Flags;
  75. unsigned long Unknown1;
  76. UNICODE_STRING Unknown2;
  77. void* InputHandle;
  78. void* OutputHandle;
  79. void* ErrorHandle;
  80. UNICODE_STRING CurrentDirectory;
  81. void* CurrentDirectoryHandle;
  82. UNICODE_STRING SearchPaths;
  83. UNICODE_STRING ApplicationName;
  84. UNICODE_STRING CommandLine;
  85. void* EnvironmentBlock;
  86. unsigned long Unknown[9];
  87. UNICODE_STRING Unknown3;
  88. UNICODE_STRING Unknown4;
  89. UNICODE_STRING Unknown5;
  90. UNICODE_STRING Unknown6;
  91. } PROCESS_PARAMETERS;
  92. typedef struct {
  93. unsigned long AllocationSize;
  94. unsigned long Unknown1;
  95. void* ProcessHinstance;
  96. void* ListDlls;
  97. PROCESS_PARAMETERS* ProcessParameters;
  98. unsigned long Unknown2;
  99. void* Heap;
  100. } PEB;
  101. typedef struct {
  102. unsigned int ExitStatus;
  103. PEB* PebBaseAddress;
  104. unsigned int AffinityMask;
  105. unsigned int BasePriority;
  106. unsigned long UniqueProcessId;
  107. unsigned long InheritedFromUniqueProcessId;
  108. } PROCESS_BASIC_INFORMATION;
  109. class TSMemoryAPI
  110. {
  111. public:
  112. TSMemoryAPI(void);
  113. ~TSMemoryAPI(void);
  114. CMgAsmBase tsasm;
  115. CMgDisasmBase tsdsm;
  116. public:
  117. bool TSValueTypeToData(int type, wchar_t* retstr, double dvalue = NULL, float fvalue = NULL, int ivalue = 0, wchar_t* svalue = NULL, int type1 = 0);
  118. bool TSFindData(LONG hwnd, wchar_t* addr_range, wchar_t* data, wchar_t* retstr, bool threadtype = false);
  119. bool TSFindDouble(LONG hwnd, wchar_t* addr_range, wchar_t* retstr, double double_value_min, double double_value_max, bool threadtype = false);
  120. bool TSFindFloat(LONG hwnd, wchar_t* addr_range, wchar_t* retstr, FLOAT float_value_min, FLOAT float_value_max, bool threadtype = false);
  121. bool TSFindInt(LONG hwnd, wchar_t* addr_range, wchar_t* retstr, LONG int_value_min, LONG int_value_max, LONG type, bool threadtype = false);
  122. bool TSFindString(LONG hwnd, wchar_t* addr_range, wchar_t* retstr, wchar_t* string_value, LONG type, bool threadtype = false);
  123. bool TSReadData(LONG hwnd, wchar_t* addr, wchar_t* retstr, LONG len);
  124. bool TSReadDouble(LONG hwnd, wchar_t* addr, double& dvalue, float& fvalue, int type = 0); //type0:DOUBLE,1:FLOAT
  125. bool TSReadInt(LONG hwnd, wchar_t* addr, int& ivalue, short& svalue, BYTE& bvalue, int type);
  126. bool TSReadString(LONG hwnd, wchar_t* addr, wchar_t* retstr, LONG len, int type);
  127. bool TSTerminateProcess(LONG pid);
  128. bool TSVirtualAllocEx(LONG hwnd, LONG& addr, LONG size, LONG type);
  129. bool TSVirtualFreeEx(LONG hwnd, LONG addr);
  130. bool TSWriteData(LONG hwnd, wchar_t* addr, wchar_t* data);
  131. bool TSWriteDouble(LONG hwnd, wchar_t* addr, DOUBLE dvalue = 0, FLOAT fvlaue = 0);
  132. bool TSWriteInt(LONG hwnd, wchar_t* addr, int ivalue = 0, short svalue = 0, BYTE bvalue = 0);
  133. bool TSWriteString(LONG hwnd, wchar_t* addr, wchar_t* strvalue, LONG type);
  134. bool TSGetCmdLine(LONG hwnd, wchar_t* retstr);
  135. bool TSAsmAdd(wchar_t* asm_ins);
  136. bool TSAsmCall(LONG hwnd, LONG mode);
  137. bool TSAsmClear();
  138. bool TSAsmCode(LONG base_addr, wchar_t* retstr);
  139. bool TSAssemble(wchar_t* asm_code, LONG base_addr, LONG is_upper, wchar_t* retstr);
  140. bool TSFreeProcessMemory(LONG hwnd);
  141. private:
  142. DWORD nPid;
  143. int retstringlen;//线程函数返回地址的长度
  144. CMgAsmBase::t_asmmodel am;
  145. std::string asmcodearry;//存储AsmAdd的指令
  146. char Asmcalladdr[MAX_PATH]; //记录保存CALL指令
  147. LPVOID allocatememory;
  148. DWORD TSGetFindDataAddr(wchar_t* strs, DWORD pid);//读取要读写的多层级别的地址指针
  149. bool TSGetaddr_range(wchar_t* strs, LONG& begin, LONG& end, DWORD* addr_range, int& nconut); //读取要找的地址集合
  150. bool TSGetDataValue(wchar_t* strs, DWORD* Data_range, int& nconut);
  151. //void FindDataThread(void *para);
  152. bool GetFindaddr(HANDLE hprocess, PVOID lpbegin, PVOID lpend, DWORD* ibegin, DWORD* ipend, int& ncount);
  153. DWORD GetCallstartData(DWORD Allocaddr, DWORD* startaddr, char* code = NULL);//获取CALL地址前的汇编指令
  154. };