• C++ 内存共享/软件守护


    功能描述:在无人看守的情况下,防止软件意外退出。

    接口调用简单,只需要简单声明就行:

    1. int main(int argc, char **argv)
    2. {
    3. QShareProcess shareProcess("共享内存名称随意");
    4. // 下面实现自己的主体代码即可
    5. ......
    6. }

    类声明:

    1. #if !defined(AFX_SHAREMEMORY_H_INCLUDED)
    2. #define AFX_SHAREMEMORY_H_INCLUDED
    3. class QShareProcess
    4. {
    5. public:
    6. QShareProcess(const char *name, size_t memsize = 32) ;
    7. virtual ~QShareProcess();
    8. private:
    9. int startShared();
    10. void *getMemPointer();
    11. void write(unsigned long dwData, long lOffset = 0);
    12. void write(char *pData, long lSize, long lOffset = 0);
    13. void read(char *pData, long lSize, long lOffset = 0);
    14. void close();
    15. bool isLive();
    16. bool isTerminated();
    17. protected:
    18. bool createFile(const char *name, size_t size);
    19. bool mapViewOfFile();
    20. bool setAllAccess(void* objHandle);
    21. void freeRes();
    22. void* m_hToMap;
    23. void *m_memory;
    24. };
    25. #endif // !defined(AFX_SHAREMEMORY_H_INCLUDED)

    类定义:

    1. #include "ShareProcess.h"
    2. #include
    3. #pragma comment(lib,"Advapi32.lib")
    4. QShareProcess::QShareProcess(const char *name, size_t memsize)
    5. : m_hToMap(0),
    6. m_memory(0)
    7. {
    8. try {
    9. bool needToInit = createFile(name, memsize);
    10. mapViewOfFile();
    11. if (needToInit) {
    12. memset(m_memory, 0, memsize);
    13. }
    14. }
    15. catch (...) {
    16. freeRes();
    17. throw;
    18. }
    19. startShared();
    20. }
    21. QShareProcess::~QShareProcess()
    22. {
    23. freeRes();
    24. }
    25. #include
    26. #include
    27. #include
    28. int QShareProcess::startShared()
    29. {
    30. auto getCurrentModulePath = [] ()-> std::string
    31. {
    32. std::vector<char> buffer;
    33. DWORD size = MAX_PATH;
    34. while (true) {
    35. buffer.resize(size + 1);
    36. DWORD ret = GetModuleFileName(NULL, &buffer[0], size);
    37. if (ret == 0) {
    38. return false;
    39. }
    40. else if (ret == size || GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
    41. size += 128;
    42. }
    43. else {
    44. break;
    45. }
    46. } // while
    47. std::string out = &buffer[0];
    48. return out;
    49. }; // void
    50. bool slient = false;
    51. for (int i = 0; i < __argc; i++) {
    52. if (_stricmp(__argv[i], "/Slient") == 0) {
    53. slient = true;
    54. break;
    55. }
    56. } // for
    57. if (slient) {
    58. // 互斥 上线地址:端口:服务名
    59. char strMutex[100];
    60. wsprintfA(strMutex, "{4EB9E321-8C12-478F-BC53-9920E7BFE114}");
    61. HANDLE m_hMutex = CreateMutex(NULL, FALSE, strMutex);
    62. if (m_hMutex && GetLastError() == ERROR_ALREADY_EXISTS) {
    63. ReleaseMutex(m_hMutex);
    64. CloseHandle(m_hMutex);
    65. ExitProcess(0);
    66. return 0;
    67. }
    68. this->write((DWORD)GetCurrentProcessId(), 12);
    69. this->write((DWORD)GetTickCount(), 16);
    70. while (!this->isTerminated()) {
    71. if (!this->isLive()) {
    72. TCHAR szCommandline[_MAX_PATH] = { 0 };
    73. sprintf(szCommandline, "\"%s\"", getCurrentModulePath().c_str());
    74. for (int i = 1; i < __argc; i++) {
    75. if (_stricmp(__argv[i], "/Slient") != 0) {
    76. strcat_s(szCommandline, " ");
    77. strcat_s(szCommandline, __argv[i]);
    78. }
    79. }
    80. STARTUPINFO si;
    81. ZeroMemory(&si, sizeof(STARTUPINFO));
    82. si.cb = sizeof(STARTUPINFO);
    83. si.dwFlags = STARTF_USESHOWWINDOW;
    84. si.wShowWindow = TRUE;
    85. PROCESS_INFORMATION pi;
    86. CreateProcess(NULL, (LPTSTR)szCommandline,
    87. NULL, NULL, FALSE, 0/*CREATE_NEW_CONSOLE*/, NULL, NULL,
    88. &si, &pi);
    89. } // if
    90. this->write((DWORD)GetCurrentProcessId(), 12);
    91. this->write((DWORD)GetTickCount(), 16);
    92. std::this_thread::sleep_for(std::chrono::milliseconds(5000));
    93. }
    94. ExitProcess(0);
    95. return 1;
    96. } // if
    97. this->write((DWORD)0xABCD);
    98. this->write((DWORD)GetCurrentProcessId(), 4);
    99. this->write((DWORD)GetTickCount(), 8);
    100. TCHAR szCommandline[_MAX_PATH] = { 0 };
    101. sprintf(szCommandline, "\"%s\" ", getCurrentModulePath().c_str());
    102. for (int i = 1; i < __argc; i++) {
    103. if (_stricmp(__argv[i], "/Slient") != 0) {
    104. strcat_s(szCommandline, " ");
    105. strcat_s(szCommandline, __argv[i]);
    106. }
    107. }
    108. strcat_s(szCommandline, " /Slient");
    109. STARTUPINFO si;
    110. ZeroMemory(&si, sizeof(STARTUPINFO));
    111. si.cb = sizeof(STARTUPINFO);
    112. si.dwFlags = STARTF_USESHOWWINDOW;
    113. si.wShowWindow = TRUE;
    114. PROCESS_INFORMATION pi;
    115. if (CreateProcess(NULL, (LPTSTR)szCommandline,
    116. NULL, NULL, FALSE, 0/*CREATE_NEW_CONSOLE*/, NULL, NULL,
    117. &si, &pi) == 0) {
    118. return -1;
    119. }
    120. return 1;
    121. }
    122. void *QShareProcess::getMemPointer()
    123. {
    124. return m_memory;
    125. }
    126. bool QShareProcess::createFile(const char *name, size_t size)
    127. {
    128. DWORD lowSize = size & 0xffffffff;
    129. DWORD highSize = (DWORD64)size >> 32 & 0xffffffff;
    130. //创建共享文件句柄
    131. m_hToMap = CreateFileMapping(INVALID_HANDLE_VALUE, //物理文件句柄
    132. NULL,
    133. PAGE_READWRITE, // 可读可写
    134. highSize, // 地址偏移:高位
    135. lowSize, // 地址偏移:地位
    136. name); // 共享内存名称
    137. if (m_hToMap == NULL) {
    138. return false;
    139. }
    140. bool needToInit = GetLastError() != ERROR_ALREADY_EXISTS;
    141. if (needToInit) {
    142. setAllAccess(m_hToMap);
    143. }
    144. return needToInit;
    145. }
    146. #include
    147. bool QShareProcess::mapViewOfFile()
    148. {
    149. //映射缓存区视图,得到共享内存的指针
    150. m_memory = MapViewOfFile(m_hToMap, //已经创建的文件映射对象的句柄
    151. FILE_MAP_ALL_ACCESS, //可读可写
    152. 0, // 地址偏移:高位
    153. 0, // 地址偏移:地位
    154. 0); // 映射视图的大小
    155. if (m_memory == NULL) {
    156. return false;
    157. }
    158. printf("ShareMemory addr: 0x%08x\n", *(DWORD*)m_memory);
    159. return true;
    160. }
    161. bool QShareProcess::setAllAccess(void* objHandle)
    162. {
    163. DWORD errorCode = SetSecurityInfo(objHandle, SE_FILE_OBJECT,
    164. DACL_SECURITY_INFORMATION,
    165. NULL,
    166. NULL,
    167. NULL,
    168. NULL);
    169. if (errorCode != ERROR_SUCCESS) {
    170. return false;
    171. }
    172. return true;
    173. }
    174. void QShareProcess::freeRes()
    175. {
    176. if (m_memory) {
    177. UnmapViewOfFile(m_memory);
    178. m_memory = 0;
    179. }
    180. if (m_hToMap) {
    181. CloseHandle(m_hToMap);
    182. m_hToMap = 0;
    183. }
    184. }
    185. void QShareProcess::write(unsigned long dwData, long lOffset)
    186. {
    187. write((char*)&dwData, sizeof(unsigned long), lOffset);
    188. }
    189. void QShareProcess::write(char *pData, long lSize, long lOffset)
    190. {
    191. if (m_memory == NULL)
    192. return ;
    193. ::memcpy((char*)m_memory + lOffset, pData, lSize);
    194. }
    195. void QShareProcess::read(char *pData, long lSize, long lOffset)
    196. {
    197. if (m_memory == NULL)
    198. return ;
    199. ::memcpy(pData, (char*)m_memory + lOffset, lSize);
    200. }
    201. void QShareProcess::close()
    202. {
    203. write(0);
    204. }
    205. bool QShareProcess::isTerminated()
    206. {
    207. DWORD dwValue = 0;
    208. read((char*)&dwValue, 4);
    209. if (dwValue = 0xABCD)
    210. return false;
    211. else
    212. return true;
    213. }
    214. #include
    215. bool QShareProcess::isLive()
    216. {
    217. DWORD dwProcessID;
    218. read((char*)&dwProcessID, sizeof(DWORD), 4);
    219. bool bFind = false;
    220. HANDLE hSnapShot = INVALID_HANDLE_VALUE;
    221. PROCESSENTRY32 pe;
    222. //获取系统快照(hSnapShot)
    223. pe.dwSize = sizeof(PROCESSENTRY32);
    224. hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
    225. //查找进程
    226. Process32First(hSnapShot, &pe);
    227. do {
    228. if (pe.th32ProcessID == dwProcessID) {
    229. bFind = true;
    230. break;
    231. }
    232. } while (Process32Next(hSnapShot, &pe));
    233. CloseHandle(hSnapShot);
    234. return bFind;
    235. }
  • 相关阅读:
    2023年中国功效护肤品市场发展概况分析:行业市场成熟度高[图]
    Apache HTTPD 漏洞复现
    # 注解------01
    基于图像字典学习的去噪技术研究与实践
    VulnHub DC-7
    Wireshark TS | 消失的 TCP DUP ACK
    零基础学python之列表
    计算机毕业设计Java妇女健康保健系统(源码+系统+mysql数据库+lw文档)
    (三)行为模式:10、策略模式(Strategy Pattern)(C++示例)
    如何在Mac上启用蓝牙,这里提供几个方法
  • 原文地址:https://blog.csdn.net/u012156872/article/details/126153505