dllmain.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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. }