dllmain.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. // dllmain.cpp : DllMain 的实现。
  2. /*本源码由TC简单软件科技有限公司开源,功能可以自由修改、发布、
  3. 长沙简单软件科技有限公司对于源码不做后期维护,,请大家在使用过程中遵循开源协议
  4. */
  5. #include "stdafx.h"
  6. #include "resource.h"
  7. #include "TSPlug_i.h"
  8. #include "dllmain.h"
  9. #include "DXBind.h"
  10. #include "TSRuntime.h"
  11. #include <psapi.h>
  12. #pragma comment ( lib, "psapi.lib" )
  13. CTSPlugModule _AtlModule;
  14. TCHAR gDLLFolder[MAX_PATH + 1];
  15. HHOOK g_hSetWindowsHook = NULL;
  16. HMODULE g_hInstance = NULL;
  17. extern bool g_Unbind;
  18. extern HWND g_InjectHWND;
  19. extern HWND g_currentHwnd;
  20. HANDLE g_hthread = NULL;
  21. extern int SySTpye;
  22. //卸载线程
  23. void IMEUnLoadThread(void* para)
  24. {
  25. while (1)
  26. {
  27. if (TSRuntime::pData->InjectType == 204)//203注入
  28. {
  29. TSRuntime::pData->InjectType = 205;
  30. TSRuntime::MyLoadLibrary();
  31. FreeLibraryAndExitThread(g_hInstance, 0); //卸载DLL
  32. return;
  33. }
  34. if (g_Unbind == true) //等待窗口解绑
  35. {
  36. //TSRuntime::add_log( "卸载DLL,InjectType:%d",TSRuntime::pData->InjectType);
  37. if (TSRuntime::pData->InjectType == 1 || TSRuntime::pData->InjectType == 202 || TSRuntime::pData->InjectType == 205)
  38. {
  39. //TSRuntime::add_log( "卸载DLL,InjectType:%d",TSRuntime::pData->InjectType);
  40. FreeLibraryAndExitThread(g_hInstance, 0); //卸载DLL
  41. }
  42. return;
  43. }
  44. //如果注入方进程异常退出,自我解绑,卸载DLL
  45. if (::IsWindow(g_InjectHWND) == false && g_InjectHWND != NULL)
  46. {
  47. if (TSRuntime::pData->InjectType == 0)
  48. {
  49. //通知自身窗口解绑
  50. SendMessage(g_currentHwnd, TS_UNBIND, 0, 0);
  51. ::UnhookWindowsHookEx(g_hSetWindowsHook);
  52. }
  53. else
  54. {
  55. //通知自身窗口解绑
  56. SendMessage(g_currentHwnd, TS_UNBIND, 0, 0);
  57. FreeLibraryAndExitThread(g_hInstance, 0); //卸载DLL
  58. }
  59. return;
  60. }
  61. Sleep(10);
  62. //CString scd;
  63. }
  64. }
  65. DWORD CALLBACK CBFunA(DWORD calldata1, DWORD calldata2, DWORD calldata3) //输入法注入回调函数
  66. {
  67. HINSTANCE my_hInstance = (HINSTANCE)calldata1; //输入法传入自身DLL基址和自身得到的基址验证后才开启线程
  68. //TSRuntime::add_log( "IME注入");
  69. if (my_hInstance)
  70. {
  71. if (my_hInstance == g_hInstance)
  72. g_hthread = (HANDLE)_beginthread(IMEUnLoadThread, 0, 0);//启动线程等待解绑卸载DLL
  73. }
  74. return 0;
  75. }
  76. static HMODULE ModuleFromAddress(PVOID pv)
  77. {
  78. MEMORY_BASIC_INFORMATION mbi;
  79. if (::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
  80. {
  81. return (HMODULE)mbi.AllocationBase;
  82. }
  83. else
  84. {
  85. return NULL;
  86. }
  87. }
  88. static LRESULT WINAPI GetMsgProc(int code, WPARAM wParam, LPARAM lParam)
  89. {
  90. return ::CallNextHookEx(g_hSetWindowsHook, code, wParam, lParam);
  91. }
  92. BOOL WINAPI CBFunB(BOOL bInstall, DWORD dwThreadId)
  93. {
  94. BOOL bOk = FALSE;
  95. if (bInstall)
  96. {
  97. g_hSetWindowsHook = ::SetWindowsHookEx(WH_CALLWNDPROC, GetMsgProc, ModuleFromAddress(GetMsgProc), dwThreadId);
  98. //TSRuntime::add_log( "g_hSetWindowsHook:%x,PID:%d",GetCurrentProcessId());
  99. if (g_hSetWindowsHook != NULL)
  100. {
  101. bOk = true;
  102. }
  103. }
  104. else
  105. {
  106. if (g_hSetWindowsHook)
  107. {
  108. //::MessageBox(0,L"Dll Main:UnhookWindowsHookEx",L"TS",0);
  109. bOk = ::UnhookWindowsHookEx(g_hSetWindowsHook);
  110. }
  111. }
  112. return bOk;
  113. }
  114. // DLL 入口点
  115. extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
  116. {
  117. switch (dwReason)
  118. {
  119. case DLL_PROCESS_ATTACH:
  120. {
  121. TSRuntime::InitKeyPressCharMap();
  122. TSRuntime::InitVirtualToASCIIMap();
  123. TSRuntime::InitKeyMap();
  124. TSRuntime::InitKeyPressMap();
  125. SySTpye = TSRuntime::InitialWindowsVersion();
  126. g_hInstance = hInstance;
  127. //wcscpy(gDLLFolder,TSRuntime::GetComPath());
  128. TSRuntime::GetComPath(gDLLFolder);
  129. //::MessageBox(0,gDLLFolder,L"TS",0);
  130. char pszMapName[MAX_PATH] = { 0 };
  131. sprintf(pszMapName, "%s%d", TS_MAPVIEW_NAME, GetCurrentProcessId());
  132. HANDLE hFileMap = OpenFileMappingA(FILE_MAP_ALL_ACCESS, FALSE, pszMapName);
  133. //如果hFileMap句柄不为空说明DLL被注入,准备启动注入线程
  134. if (hFileMap != NULL)
  135. {
  136. //::MessageBox(0,L"Dll Main:DLL_PROCESS_ATTACH",L"TS",0);
  137. //// 这里先打开共享内存,共享内存和程序是一对一的关系
  138. CShareMemory* sm = new CShareMemory(pszMapName);
  139. TSRuntime::pData = (CMessageData*)sm->GetBuffer();
  140. //// 共享内存的初始化数据是不能为空的,为空就不正常
  141. if (TSRuntime::pData != NULL)
  142. {
  143. if (TSRuntime::pData->InjectType == BIND_201 || TSRuntime::pData->InjectType == BIND_203)//201模式注入
  144. {
  145. if (TSRuntime::pData->InjectType == BIND_201)
  146. TSRuntime::pData->InjectType = 202;
  147. else if (TSRuntime::pData->InjectType == BIND_203)
  148. TSRuntime::pData->InjectType = 204;
  149. //TSRuntime::add_log("201模式注入");
  150. DWORD InternalCallWinProc_Addr = (DWORD)::GetModuleHandle(L"user32.dll");
  151. if (SySTpye == 1)//WinXP
  152. InternalCallWinProc_Addr += USER32InternalCallWinProcXPoffse;
  153. else if (SySTpye == 2)//Win2003
  154. InternalCallWinProc_Addr += USER32InternalCallWinProcWin2003offse;
  155. else if (SySTpye == 4 && TSRuntime::IsWin7X64)//WIN7X64
  156. InternalCallWinProc_Addr += USER32InternalCallProcWin7x64offse;
  157. else if (SySTpye == 4)//WIN7X86
  158. InternalCallWinProc_Addr += USER32InternalCallProcWin7offse;
  159. else if (SySTpye == 5 && TSRuntime::IsWin8X64)//WIN8X64
  160. InternalCallWinProc_Addr += USER32InternalCallProcWin8x64offse;
  161. else if (SySTpye == 5)//WIN8X86
  162. InternalCallWinProc_Addr += USER32InternalCallProcWin8offse;
  163. BYTE ori[5] = { 0x55,0x8b,0xec,0x56,0x57 };
  164. //注入完成还原钩子
  165. memcpy((void*)InternalCallWinProc_Addr, ori, 5);
  166. FlushInstructionCache(GetCurrentProcess(), (void*)InternalCallWinProc_Addr, 5);
  167. ////TS_BIND201_NAME
  168. wchar_t pszEventName[MAX_PATH] = { 0 };
  169. ::wsprintf(pszEventName, L"%s%d", TS_BIND201_NAME, ::GetCurrentProcessId());
  170. HANDLE picEvent = ::CreateEvent(NULL, TRUE, FALSE, pszEventName);
  171. ::WaitForSingleObject(picEvent, INFINITE);
  172. ::CloseHandle(picEvent);
  173. g_Unbind = false;
  174. _beginthread(IMEUnLoadThread, 0, 0);
  175. if (TSRuntime::pData->InjectType == 202)
  176. TSRuntime::g_DxObj.hookApi();
  177. }
  178. else if (TSRuntime::pData->InjectType != 202 && TSRuntime::pData->InjectType != 204) //// 这里根据传入的模式进行函数拦截,兵起一个检测线程进行检测
  179. {
  180. if (TSRuntime::pData->InjectType == 205)//203绑定
  181. _beginthread(IMEUnLoadThread, 0, 0);
  182. TSRuntime::g_DxObj.hookApi();
  183. }
  184. }
  185. }
  186. break;
  187. }
  188. }
  189. return _AtlModule.DllMain(dwReason, lpReserved);
  190. }
  191. TsMutex::TsMutex(char* pszEventName)
  192. {
  193. //InitializeCriticalSection(&m_mutex);
  194. hEvent = OpenEventA(EVENT_ALL_ACCESS, false, pszEventName);
  195. if (hEvent == NULL)
  196. {
  197. hEvent = CreateEventA(NULL, FALSE, FALSE, pszEventName);
  198. ::SetEvent(hEvent);
  199. }
  200. }
  201. TsMutex::~TsMutex()
  202. {
  203. //DeleteCriticalSection(&m_mutex);
  204. CloseHandle(hEvent);
  205. }
  206. void TsMutex::lock()
  207. {
  208. //::WaitForSingleObject(hEvent,INFINITE);
  209. ::WaitForSingleObject(hEvent, 10000);
  210. //EnterCriticalSection(&m_mutex);
  211. }
  212. void TsMutex::unlock()
  213. {
  214. ::SetEvent(hEvent);
  215. //LeaveCriticalSection(&m_mutex);
  216. }
  217. TsMutexlock::TsMutexlock(TsMutex* ptcmutex)
  218. {
  219. m_ptcmutex = ptcmutex;
  220. m_ptcmutex->lock();
  221. }
  222. TsMutexlock::~TsMutexlock()
  223. {
  224. m_ptcmutex->unlock();
  225. }