OGCAssist.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699
  1. // OGCAssist.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "stdafx.h"
  4. #include "OGCAssist.h"
  5. #include <process.h>
  6. namespace Assist
  7. {
  8. // 全局Call Data;
  9. CALLDATA _cd_Go;
  10. CALLDATA _cd_Connect;
  11. CALLDATA _cd_Disconnect;
  12. CALLDATA _cd_CheckFW;
  13. CALLDATA _cd_CheckFW_CommunicationError;
  14. CALLDATA _cd_SaveAsOutputData;
  15. CALLDATA _cd_Go_SN;
  16. CALLDATA _cd_Go_CommunicationError;
  17. CALLDATA _cd_Go_SetCommunicationError;
  18. CALLDATA _cd_Initial_failed;
  19. CALLDATA _cd_ExternalException;
  20. // 调试耗时值ms;
  21. DWORD dwElapsed = 0;
  22. TCHAR g_szGoSN[32] = {0};
  23. DWORD dwCallAddr = 0;
  24. // 8组全局寄存器存储;
  25. DWORD dwEAX = 0;
  26. DWORD dwEBX = 0;
  27. DWORD dwECX = 0;
  28. DWORD dwEDX = 0;
  29. DWORD dwEBP = 0;
  30. DWORD dwESP = 0;
  31. DWORD dwESI = 0;
  32. DWORD dwEDI = 0;
  33. BOOL HijackedCall(CALLDATA *pCallData);
  34. // 自定义跳转函数;
  35. void Call_MyDisconnect();
  36. void Call_MyConnect();
  37. void Call_MyGo();
  38. void Call_MyGoSN();
  39. void Call_MyCheckFW();
  40. void Call_MyCheckFWCommunicationError();
  41. void Call_MySaveAsOutputData();
  42. void Call_MyInitial_Failed();
  43. void Call_MyGoCommunicationError();
  44. void Call_MyGoSetCommunicationError();
  45. void Call_MyExternalException();
  46. void InitCallData()
  47. {
  48. #pragma region 启动时Initial Communication:需要程序启动时注入;
  49. // 00401EB8 | E8 7BCB0C00 | call demo.4CEA38 |
  50. _cd_Initial_failed.myCall = Call_MyInitial_Failed;
  51. // 00401EBD | FF4D CC | dec dword ptr ss:[ebp-34] |
  52. _cd_Initial_failed.dwBack2Addr = 0x00401EBD;
  53. // 00401EB8 | E8 7BCB0C00 | call demo.4CEA38 |
  54. _cd_Initial_failed.dwOriginalAddr = 0x00401EB8;
  55. _cd_Initial_failed.dwOriginalCallAddr = 0x004CEA38;
  56. _cd_Initial_failed.nMyCallDataLen = JMP_DLEN;
  57. memset(_cd_Initial_failed.szMyCallData, 0x90, CALL_LEN);
  58. _cd_Initial_failed.szMyCallData[0] = 0xE9; // 汇编硬编码:jmp [4字节地址];
  59. *(LPDWORD)(&_cd_Initial_failed.szMyCallData[1]) = (DWORD)_cd_Initial_failed.myCall - _cd_Initial_failed.dwOriginalAddr - JMP_DLEN;
  60. #pragma endregion
  61. #pragma region Connect按钮劫持
  62. //00415ECB | 0F84 6A040000 | je demo.41633B
  63. _cd_Connect.myCall = Call_MyConnect;
  64. // 00415ED1 | 6A 00 | push 0
  65. _cd_Connect.dwBack2Addr = 0x00415ED1;
  66. _cd_Connect.dwOriginalAddr = 0x00415ECB;
  67. _cd_Connect.dwOriginalCallAddr = 0x0041633B; // 此处是JMP,注意注入时不要调用为Call
  68. _cd_Connect.nMyCallDataLen = JMP_DLEN;
  69. memset(_cd_Connect.szMyCallData, 0x90, CALL_LEN);
  70. _cd_Connect.szMyCallData[0] = 0xE9; // 汇编硬编码:jmp [4字节地址];
  71. *(LPDWORD)(&_cd_Connect.szMyCallData[1]) = (DWORD)_cd_Connect.myCall - _cd_Connect.dwOriginalAddr - JMP_DLEN;
  72. #pragma endregion
  73. #pragma region Disconnect按钮劫持
  74. // 0043790B | E8 E4C90900 | call demo.4D42F4 | # 此处可能用于SetWindowText之类处理
  75. // 00437910 | FF4D F4 | dec dword ptr ss:[ebp-C] |
  76. _cd_Disconnect.myCall = Call_MyDisconnect;
  77. _cd_Disconnect.dwBack2Addr = 0x00437910;
  78. _cd_Disconnect.dwOriginalAddr = 0x0043790B;
  79. _cd_Disconnect.dwOriginalCallAddr = 0x004D42F4;
  80. _cd_Disconnect.nMyCallDataLen = JMP_DLEN;
  81. memset(_cd_Disconnect.szMyCallData, 0x90, CALL_LEN);
  82. _cd_Disconnect.szMyCallData[0] = 0xE9; // 汇编硬编码:jmp [4字节地址];
  83. *(LPDWORD)(&_cd_Disconnect.szMyCallData[1]) = (DWORD)_cd_Disconnect.myCall - _cd_Disconnect.dwOriginalAddr - JMP_DLEN;
  84. #pragma endregion
  85. #pragma region ExternalException
  86. // 必须获取模块地址:ca210ctrl.dll
  87. HMODULE hModule = GetModuleHandle(_T("Ca210Ctrl.dll"));
  88. // 044D677C | FF15 78645404 | call dword ptr ds:[<&RaiseException>] |
  89. _cd_ExternalException.myCall = Call_MyExternalException;
  90. // 044D6782 | 5F | pop edi |
  91. _cd_ExternalException.dwBack2Addr = (DWORD)hModule + 0x106782;
  92. _cd_ExternalException.dwOriginalAddr = (DWORD)hModule + 0x10677C;
  93. _cd_ExternalException.dwOriginalCallAddr = 0x769F05B0;
  94. _cd_ExternalException.nMyCallDataLen = JMP_DLEN;
  95. memset(_cd_ExternalException.szMyCallData, 0x90, CALL_LEN);
  96. _cd_ExternalException.szMyCallData[0] = 0xE9; // 汇编硬编码:jmp [4字节地址];
  97. *(LPDWORD)(&_cd_ExternalException.szMyCallData[1]) = (DWORD)_cd_ExternalException.myCall - _cd_ExternalException.dwOriginalAddr - JMP_DLEN;
  98. #pragma endregion
  99. #pragma region Go按钮劫持
  100. /* 成功执行后的处理 */
  101. _cd_Go.myCall = Call_MyGo;
  102. _cd_Go.dwBack2Addr = 0x004376B0;
  103. // 004376AB | E8 50A30C00 | call demo.501A00
  104. _cd_Go.dwOriginalAddr = 0x004376AB;
  105. _cd_Go.dwOriginalCallAddr = 0x00501A00;
  106. _cd_Go.nMyCallDataLen = JMP_DLEN;
  107. memset(_cd_Go.szMyCallData, 0x90, CALL_LEN);
  108. _cd_Go.szMyCallData[0] = 0xE9; // 汇编硬编码:jmp [4字节地址];
  109. *(LPDWORD)(&_cd_Go.szMyCallData[1]) = (DWORD)_cd_Go.myCall - _cd_Go.dwOriginalAddr - JMP_DLEN;
  110. // 获取SN字符串;
  111. // 00417AEC | E8 9BA5FEFF | call demo.40208C |
  112. // 00417AF1 | E8 722C0700 | call demo.48A768 |
  113. _cd_Go_SN.myCall = Call_MyGoSN;
  114. _cd_Go_SN.dwBack2Addr = 0x00417AF1;
  115. // 004376AB | E8 50A30C00 | call demo.501A00
  116. _cd_Go_SN.dwOriginalAddr = 0x00417AEC;
  117. _cd_Go_SN.dwOriginalCallAddr = 0x0040208C;
  118. _cd_Go_SN.nMyCallDataLen = JMP_DLEN;
  119. memset(_cd_Go_SN.szMyCallData, 0x90, CALL_LEN);
  120. _cd_Go_SN.szMyCallData[0] = 0xE9; // 汇编硬编码:jmp [4字节地址];
  121. *(LPDWORD)(&_cd_Go_SN.szMyCallData[1]) = (DWORD)_cd_Go_SN.myCall - _cd_Go_SN.dwOriginalAddr - JMP_DLEN;
  122. // 消除 Set Communication Error 弹框;
  123. // 00417FCD | E8 666A0B00 | call demo.4CEA38 |
  124. _cd_Go_SetCommunicationError.myCall = Call_MyGoSetCommunicationError;
  125. _cd_Go_SetCommunicationError.dwBack2Addr = 0x00417FD2;
  126. // 00417FD2 | FF8D F4E8FFFF| dec dword ptr ss:[ebp-170C]|
  127. _cd_Go_SetCommunicationError.dwOriginalAddr = 0x00417FCD;
  128. _cd_Go_SetCommunicationError.dwOriginalCallAddr = 0x004CEA38;
  129. _cd_Go_SetCommunicationError.nMyCallDataLen = JMP_DLEN;
  130. memset(_cd_Go_SetCommunicationError.szMyCallData, 0x90, CALL_LEN);
  131. _cd_Go_SetCommunicationError.szMyCallData[0] = 0xE9; // 汇编硬编码:jmp [4字节地址];
  132. *(LPDWORD)(&_cd_Go_SetCommunicationError.szMyCallData[1]) = (DWORD)_cd_Go_SetCommunicationError.myCall - _cd_Go_SetCommunicationError.dwOriginalAddr - JMP_DLEN;
  133. // 消除Communication Error弹框;
  134. // 00404408 | E8 2BA60C00| call demo.4CEA38|
  135. _cd_Go_CommunicationError.myCall = Call_MyGoCommunicationError;
  136. _cd_Go_CommunicationError.dwBack2Addr = 0x0040440D;
  137. // 0040440D | FF4D BC | dec dword ptr ss:[ebp-44] |
  138. _cd_Go_CommunicationError.dwOriginalAddr = 0x00404408;
  139. _cd_Go_CommunicationError.dwOriginalCallAddr = 0x004CEA38;
  140. _cd_Go_CommunicationError.nMyCallDataLen = JMP_DLEN;
  141. memset(_cd_Go_CommunicationError.szMyCallData, 0x90, CALL_LEN);
  142. _cd_Go_CommunicationError.szMyCallData[0] = 0xE9; // 汇编硬编码:jmp [4字节地址];
  143. *(LPDWORD)(&_cd_Go_CommunicationError.szMyCallData[1]) = (DWORD)_cd_Go_CommunicationError.myCall - _cd_Go_CommunicationError.dwOriginalAddr - JMP_DLEN;
  144. #pragma endregion
  145. #pragma region CheckFW按钮处理
  146. // 00404458 | E8 E7F70400 | call demo.453C44 | # 此处应该是执行I2CReadEx
  147. _cd_CheckFW.myCall = Call_MyCheckFW; // 成功获取版本后跳转处理;
  148. // 0040445D | 83C4 1C | add esp,1C |
  149. _cd_CheckFW.dwBack2Addr = 0x0040445D;
  150. _cd_CheckFW.dwOriginalAddr = 0x00404458;
  151. _cd_CheckFW.dwOriginalCallAddr = 0x453C44;
  152. _cd_CheckFW.nMyCallDataLen = JMP_DLEN;
  153. memset(_cd_CheckFW.szMyCallData, 0x90, CALL_LEN);
  154. _cd_CheckFW.szMyCallData[0] = 0xE9; // 汇编硬编码:jmp [4字节地址];
  155. *(LPDWORD)(&_cd_CheckFW.szMyCallData[1]) = (DWORD)_cd_CheckFW.myCall - _cd_CheckFW.dwOriginalAddr - JMP_DLEN;
  156. /* 针对弹框Communication Error的消除处理 */
  157. // 00404408 | E8 2BA60C00 | call demo.4CEA38 | # Dailogs::ShowMessage(string) 弹出提示框:Communication Error
  158. _cd_CheckFW_CommunicationError.myCall = Call_MyCheckFWCommunicationError; // 成功获取版本后跳转处理;
  159. // 0040440D | FF4D BC | dec dword ptr ss:[ebp-44] | [ebp-44]:&"脥I"
  160. _cd_CheckFW_CommunicationError.dwBack2Addr = 0x0040440D;
  161. _cd_CheckFW_CommunicationError.dwOriginalAddr = 0x00404408;
  162. _cd_CheckFW_CommunicationError.dwOriginalCallAddr = 0x4CEA38;
  163. _cd_CheckFW_CommunicationError.nMyCallDataLen = JMP_DLEN;
  164. memset(_cd_CheckFW_CommunicationError.szMyCallData, 0x90, CALL_LEN);
  165. _cd_CheckFW_CommunicationError.szMyCallData[0] = 0xE9; // 汇编硬编码:jmp [4字节地址];
  166. *(LPDWORD)(&_cd_CheckFW_CommunicationError.szMyCallData[1]) = (DWORD)_cd_CheckFW_CommunicationError.myCall - _cd_CheckFW_CommunicationError.dwOriginalAddr - JMP_DLEN;
  167. #pragma endregion
  168. }
  169. BOOL HijackedAllCall()
  170. {
  171. BOOL bHijack=FALSE;
  172. if ( !(bHijack = HijackedCall(&_cd_Connect)) )
  173. goto end;
  174. if ( !(bHijack = HijackedCall(&_cd_Disconnect)) )
  175. goto end;
  176. if ( !(bHijack = HijackedCall(&_cd_Go)) )
  177. goto end;
  178. if ( !(bHijack = HijackedCall(&_cd_Go_SN)) )
  179. goto end;
  180. if ( !(bHijack = HijackedCall(&_cd_Go_CommunicationError)) )
  181. goto end;
  182. if ( !(bHijack = HijackedCall(&_cd_Go_SetCommunicationError)) )
  183. goto end;
  184. if ( !(bHijack = HijackedCall(&_cd_ExternalException)) )
  185. goto end;
  186. if ( !(bHijack = HijackedCall(&_cd_CheckFW)) )
  187. goto end;
  188. if ( !(bHijack = HijackedCall(&_cd_CheckFW_CommunicationError)) )
  189. goto end;
  190. end:
  191. return bHijack;
  192. }
  193. void RestoreAllCall()
  194. {
  195. }
  196. // 劫持原始地址;
  197. BOOL HijackedCall(CALLDATA *pCallData)
  198. {
  199. if ( !pCallData )
  200. return FALSE;
  201. memset(pCallData->szMyCallData, 0, CALL_LEN);
  202. pCallData->szMyCallData[0] = 0xE9; // 汇编硬编码:jmp [4字节地址];
  203. *(LPDWORD)(&pCallData->szMyCallData[1]) = (DWORD)pCallData->myCall - pCallData->dwOriginalAddr - CALL_LEN;
  204. HANDLE hProc = GetCurrentProcess();
  205. // 将要劫持的地址指令备份下来;
  206. memset(pCallData->szOriginalAddrData, 0, CALL_LEN);
  207. if ( !ReadProcessMemory(hProc, (LPVOID)pCallData->dwOriginalAddr, pCallData->szOriginalAddrData, CALL_LEN, NULL) )
  208. {
  209. MessageBox(NULL, _T("读取内存失败"), _T("提示"),MB_OK);
  210. return FALSE;
  211. }
  212. // 将我们的Call地址指令写入目标地址;
  213. if ( !WriteProcessMemory(hProc, (LPVOID)pCallData->dwOriginalAddr, pCallData->szMyCallData, CALL_LEN, NULL) )
  214. {
  215. MessageBox(NULL, _T("写入内存失败"), _T("提示"),MB_OK);
  216. return FALSE;
  217. }
  218. return TRUE;
  219. }
  220. // 劫持原始地址;
  221. BOOL HijackedCall(LPVOID MyCall, LPVOID OriginalCall, BYTE (&szOriginalCallData)[CALL_LEN])
  222. {
  223. BYTE szMyCallData[CALL_LEN] = {0};
  224. szMyCallData[0] = 0xE9; // 汇编硬编码:jmp [4字节地址];
  225. *(LPDWORD)(&szMyCallData[1]) = (DWORD)MyCall - (DWORD)OriginalCall - CALL_LEN;
  226. HANDLE hProc = GetCurrentProcess();
  227. // 将要劫持的地址指令备份下来;
  228. if ( !ReadProcessMemory(hProc, OriginalCall, szOriginalCallData, CALL_LEN, NULL) )
  229. {
  230. MessageBox(NULL, _T("读取内存失败"), _T("提示"),MB_OK);
  231. return FALSE;
  232. }
  233. // 将我们的Call地址指令写入目标地址;
  234. if ( !WriteProcessMemory(hProc, OriginalCall, szMyCallData, CALL_LEN, NULL) )
  235. {
  236. MessageBox(NULL, _T("写入内存失败"), _T("提示"),MB_OK);
  237. return FALSE;
  238. }
  239. return TRUE;
  240. }
  241. BOOL RecoveryCall(CALLDATA *pCallData)
  242. {
  243. if ( !pCallData )
  244. return FALSE;
  245. // 将我们的Call地址指令写入目标地址;
  246. if ( !WriteProcessMemory(GetCurrentProcess(), (LPVOID)pCallData->dwOriginalAddr, pCallData->szOriginalAddrData, CALL_LEN, NULL) )
  247. {
  248. MessageBox(NULL, _T("写入内存失败"), _T("提示"),MB_OK);
  249. return FALSE;
  250. }
  251. return TRUE;
  252. }
  253. void MyInitialFailed()
  254. {
  255. MessageBox(NULL, _T("MyInitialFailed"), _T("MyInitialFailed"), MB_OK);
  256. }
  257. void __declspec(naked) Call_MyInitial_Failed()
  258. {
  259. __asm pushad;
  260. MyInitialFailed();
  261. __asm popad;
  262. // 不执行原call:原Call是Messagebox弹框,需要消除掉它;
  263. // __asm call _cd_Initial_failed.dwOriginalCallAddr;
  264. __asm jmp _cd_Initial_failed.dwBack2Addr;
  265. }
  266. void __declspec(naked) Call_MySaveAsOutputData()
  267. {
  268. //004AB3FC
  269. __asm {
  270. // 保存寄存器;
  271. mov dwEAX, EAX;
  272. mov dwEBX, EBX;
  273. mov dwECX, ECX;
  274. mov dwEDX, EDX;
  275. mov dwEBP, EBP;
  276. mov dwESP, ESP;
  277. mov dwESI, ESI;
  278. mov dwEDI, EDI;
  279. // my call
  280. mov eax,0x004AB3FC
  281. mov dl,1
  282. call dword ptr[eax]
  283. // 恢复寄存器;
  284. mov EAX, dwEAX;
  285. mov EBX, dwEBX;
  286. mov ECX, dwECX;
  287. mov EDX, dwEDX;
  288. mov EBP, dwEBP;
  289. mov ESP, dwESP;
  290. mov ESI, dwESI;
  291. mov EDI, dwEDI;
  292. // 返回
  293. ret
  294. }
  295. }
  296. void MyGo()
  297. {
  298. CHAR szMsg[MAX_PATH];
  299. DWORD dwElapsedAddr = 0x0052DF54;
  300. DWORD dwSNAddr = dwEBP - 0x5D0;
  301. sprintf_s(szMsg, "MyGo耗时:%ldms, SN:%08X, %s", *(LPDWORD)dwElapsedAddr, dwSNAddr, (CHAR*)(*(LPDWORD)dwSNAddr));
  302. MessageBoxA(NULL, szMsg, "MyGo", MB_OK);
  303. }
  304. void __declspec(naked) Call_MyGo()
  305. {
  306. // 备份寄存器;
  307. __asm{
  308. // 保存寄存器;
  309. mov dwEAX, EAX;
  310. mov dwEBX, EBX;
  311. mov dwECX, ECX;
  312. mov dwEDX, EDX;
  313. mov dwEBP, EBP;
  314. mov dwESP, ESP;
  315. mov dwESI, ESI;
  316. mov dwEDI, EDI;
  317. }
  318. MyGo();
  319. __asm{
  320. // 恢复寄存器;
  321. mov EAX, dwEAX;
  322. mov EBX, dwEBX;
  323. mov ECX, dwECX;
  324. mov EDX, dwEDX;
  325. mov EBP, dwEBP;
  326. mov ESP, dwESP;
  327. mov ESI, dwESI;
  328. mov EDI, dwEDI;
  329. // 执行原Call;
  330. call _cd_Go.dwOriginalCallAddr
  331. // 返回劫持地址下一行;
  332. jmp _cd_Go.dwBack2Addr
  333. }
  334. }
  335. void MyGoSN()
  336. {
  337. CHAR szMsg[MAX_PATH];
  338. DWORD dwSNAddr = dwEBP - 0x5D0;
  339. //_stprintf_s(szMsg, _T("MyGo %08X, %08X, %08X, %s"), dwEAX, dwSNAddr, DWORD(*(LPDWORD)dwSNAddr), (TCHAR*)(*(LPDWORD)dwSNAddr));
  340. sprintf_s(szMsg, "MyGo %08X, %08X, %08X, %s", dwEAX, dwSNAddr, DWORD(*(LPDWORD)dwSNAddr), (CHAR*)(*(LPDWORD)dwSNAddr));
  341. MessageBoxA(NULL, szMsg, "MyGoSN", MB_OK);
  342. }
  343. void __declspec(naked) Call_MyGoSN()
  344. {
  345. // 备份寄存器;
  346. __asm{
  347. // 保存寄存器;
  348. mov dwEAX, EAX;
  349. mov dwEBX, EBX;
  350. mov dwECX, ECX;
  351. mov dwEDX, EDX;
  352. mov dwEBP, EBP;
  353. mov dwESP, ESP;
  354. mov dwESI, ESI;
  355. mov dwEDI, EDI;
  356. }
  357. MyGoSN();
  358. __asm{
  359. // 恢复寄存器;
  360. mov EAX, dwEAX;
  361. mov EBX, dwEBX;
  362. mov ECX, dwECX;
  363. mov EDX, dwEDX;
  364. mov EBP, dwEBP;
  365. mov ESP, dwESP;
  366. mov ESI, dwESI;
  367. mov EDI, dwEDI;
  368. // 执行原Call;
  369. call _cd_Go_SN.dwOriginalCallAddr
  370. // 返回劫持地址下一行;
  371. jmp _cd_Go_SN.dwBack2Addr
  372. }
  373. }
  374. void MyGoSetCommunicationError()
  375. {
  376. MessageBox(NULL, _T("MyGoSetCommunicationError"), _T("劫持"), MB_OK);
  377. }
  378. void __declspec(naked) Call_MyGoSetCommunicationError()
  379. {
  380. // 备份寄存器;
  381. __asm{
  382. // 保存寄存器;
  383. mov dwEAX, EAX;
  384. mov dwEBX, EBX;
  385. mov dwECX, ECX;
  386. mov dwEDX, EDX;
  387. mov dwEBP, EBP;
  388. mov dwESP, ESP;
  389. mov dwESI, ESI;
  390. mov dwEDI, EDI;
  391. }
  392. MyGoSetCommunicationError();
  393. __asm{
  394. // 恢复寄存器;
  395. mov EAX, dwEAX;
  396. mov EBX, dwEBX;
  397. mov ECX, dwECX;
  398. mov EDX, dwEDX;
  399. mov EBP, dwEBP;
  400. mov ESP, dwESP;
  401. mov ESI, dwESI;
  402. mov EDI, dwEDI;
  403. // 执行原Call;
  404. //call _cd_Go_SetCommunicationError.dwOriginalCallAddr // 经验证,即使不执行原call,也会弹异常框;
  405. // 返回劫持地址下一行;
  406. jmp _cd_Go_SetCommunicationError.dwBack2Addr
  407. }
  408. }
  409. void MyGoCommunicationError()
  410. {
  411. MessageBox(NULL, _T("MyGoCommunicationError"), _T("劫持"), MB_OK);
  412. }
  413. void __declspec(naked) Call_MyGoCommunicationError()
  414. {
  415. // 备份寄存器;
  416. __asm{
  417. // 保存寄存器;
  418. mov dwEAX, EAX;
  419. mov dwEBX, EBX;
  420. mov dwECX, ECX;
  421. mov dwEDX, EDX;
  422. mov dwEBP, EBP;
  423. mov dwESP, ESP;
  424. mov dwESI, ESI;
  425. mov dwEDI, EDI;
  426. }
  427. MyGoCommunicationError();
  428. __asm{
  429. // 恢复寄存器;
  430. mov EAX, dwEAX;
  431. mov EBX, dwEBX;
  432. mov ECX, dwECX;
  433. mov EDX, dwEDX;
  434. mov EBP, dwEBP;
  435. mov ESP, dwESP;
  436. mov ESI, dwESI;
  437. mov EDI, dwEDI;
  438. // 执行原Call;
  439. //call _cd_Go_CommunicationError.dwOriginalCallAddr
  440. // 返回劫持地址下一行;
  441. jmp _cd_Go_CommunicationError.dwBack2Addr
  442. }
  443. }
  444. BOOL MyConnect()
  445. {
  446. // 读取AL的值; 0表示Connect失败;1表示成功;
  447. BYTE AL = LOBYTE(LOWORD(dwEAX));
  448. if ( AL == 0 )
  449. {
  450. MessageBox(NULL, _T("连接失败"), _T("连接提示"), MB_OK);
  451. return FALSE;
  452. }
  453. else
  454. {
  455. MessageBox(NULL, _T("连接成功"), _T("连接提示"), MB_OK);
  456. }
  457. return TRUE;
  458. }
  459. void __declspec(naked) Call_MyConnect()
  460. {
  461. // 备份寄存器;
  462. __asm mov dwEAX, eax;
  463. __asm pushad;
  464. if ( MyConnect() )
  465. {
  466. __asm{
  467. // 恢复寄存器;
  468. popad;
  469. // 成功:则继续正常的流程;
  470. jmp _cd_Connect.dwBack2Addr;
  471. }
  472. }
  473. else
  474. {
  475. __asm{
  476. // 恢复寄存器;
  477. popad;
  478. // 失败:JMP到出错处理;
  479. jmp _cd_Connect.dwOriginalCallAddr;
  480. }
  481. }
  482. }
  483. void MyExternalException()
  484. {
  485. MessageBox(NULL, _T("MyExternalExceptionE06D7363,重启异常待重启"), _T("提示"), MB_OK);
  486. ::exit(0);
  487. }
  488. void __declspec(naked) Call_MyExternalException()
  489. {
  490. // 备份寄存器;
  491. __asm {
  492. pushad;
  493. }
  494. MyExternalException();
  495. __asm
  496. {
  497. // 恢复寄存器;
  498. popad;
  499. // 失败:JMP到出错处理;
  500. call _cd_ExternalException.dwOriginalCallAddr;
  501. jmp _cd_ExternalException.dwBack2Addr;
  502. }
  503. }
  504. void MyDisconnect()
  505. {
  506. MessageBox(NULL, _T("MyDisconnect Function"), _T("MyDisconnect"), MB_OK);
  507. }
  508. void __declspec(naked) Call_MyDisconnect()
  509. {
  510. __asm pushad;
  511. MyDisconnect();
  512. __asm
  513. {
  514. popad;
  515. call _cd_Disconnect.dwOriginalCallAddr;
  516. jmp _cd_Disconnect.dwBack2Addr;
  517. }
  518. }
  519. void __declspec(naked) Call_MyCheckFW()
  520. {
  521. // 备份寄存器;
  522. __asm pushad;
  523. MessageBox(NULL, _T("Call_MyCheckFW"), _T("MyCheckFW"), MB_OK);
  524. __asm{
  525. // 恢复寄存器;
  526. popad;
  527. // 执行原call;
  528. call _cd_CheckFW.dwOriginalCallAddr;
  529. // 最后返回原Call地址下一行;
  530. jmp _cd_CheckFW.dwBack2Addr;
  531. }
  532. }
  533. void __declspec(naked) Call_MyCheckFWCommunicationError()
  534. {
  535. // 备份寄存器;
  536. __asm pushad;
  537. MessageBox(NULL, _T("Call_MyCheckFWCommunicationError"), _T("MyCheckFWCommunicationError"), MB_OK);
  538. __asm{
  539. // 恢复寄存器;
  540. popad;
  541. // 消除原call;
  542. // call _cd_CheckFW.dwOriginalCallAddr;
  543. // 最后返回原Call地址下一行;
  544. jmp _cd_CheckFW_CommunicationError.dwBack2Addr;
  545. }
  546. }
  547. void __declspec(naked) SetChannel()
  548. {
  549. // 备份寄存器;
  550. __asm{
  551. // 保存寄存器;
  552. mov dwEAX, EAX;
  553. mov dwEBX, EBX;
  554. mov dwECX, ECX;
  555. mov dwEDX, EDX;
  556. mov dwEBP, EBP;
  557. mov dwESP, ESP;
  558. mov dwESI, ESI;
  559. mov dwEDI, EDI;
  560. }
  561. MessageBox(NULL, _T("MyGo Function"), _T("MyGo"), MB_OK);
  562. __asm{
  563. // 恢复寄存器;
  564. mov EAX, dwEAX;
  565. mov EBX, dwEBX;
  566. mov ECX, dwECX;
  567. mov EDX, dwEDX;
  568. mov EBP, dwEBP;
  569. mov ESP, dwESP;
  570. mov ESI, dwESI;
  571. mov EDI, dwEDI;
  572. // 最后返回原Call地址下一行;
  573. jmp _cd_Go.dwBack2Addr;
  574. }
  575. }
  576. void SetSN(LPCTSTR lpSN)
  577. {
  578. }
  579. void ChangeSDK(int nSDK) // 0=410SDK, 1=310SDK;
  580. {
  581. }
  582. void __declspec(naked) Call_Connect()
  583. {
  584. //dwCallAddr = 0x004D5864;//0x004378B0;
  585. /*dwCallAddr = 0x004378B0;
  586. __asm {
  587. pushad;
  588. mov eax,0x02393F78;
  589. mov ebx,0x024856CC;
  590. mov ecx,0x004AB16C;
  591. mov edx,0x024156CC;
  592. call dwCallAddr;
  593. popad;
  594. }*/
  595. dwCallAddr = 0x00415DFC;
  596. __asm call dwCallAddr;
  597. }
  598. };