TSMemoryAPI.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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. };