|
@@ -0,0 +1,699 @@
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+#include "stdafx.h"
|
|
|
+#include "OGCAssist.h"
|
|
|
+#include <process.h>
|
|
|
+
|
|
|
+namespace Assist
|
|
|
+{
|
|
|
+
|
|
|
+ CALLDATA _cd_Go;
|
|
|
+ CALLDATA _cd_Connect;
|
|
|
+ CALLDATA _cd_Disconnect;
|
|
|
+ CALLDATA _cd_CheckFW;
|
|
|
+ CALLDATA _cd_CheckFW_CommunicationError;
|
|
|
+ CALLDATA _cd_SaveAsOutputData;
|
|
|
+ CALLDATA _cd_Go_SN;
|
|
|
+ CALLDATA _cd_Go_CommunicationError;
|
|
|
+ CALLDATA _cd_Go_SetCommunicationError;
|
|
|
+ CALLDATA _cd_Initial_failed;
|
|
|
+ CALLDATA _cd_ExternalException;
|
|
|
+
|
|
|
+
|
|
|
+ DWORD dwElapsed = 0;
|
|
|
+
|
|
|
+ TCHAR g_szGoSN[32] = {0};
|
|
|
+
|
|
|
+ DWORD dwCallAddr = 0;
|
|
|
+
|
|
|
+
|
|
|
+ DWORD dwEAX = 0;
|
|
|
+ DWORD dwEBX = 0;
|
|
|
+ DWORD dwECX = 0;
|
|
|
+ DWORD dwEDX = 0;
|
|
|
+ DWORD dwEBP = 0;
|
|
|
+ DWORD dwESP = 0;
|
|
|
+ DWORD dwESI = 0;
|
|
|
+ DWORD dwEDI = 0;
|
|
|
+
|
|
|
+ BOOL HijackedCall(CALLDATA *pCallData);
|
|
|
+
|
|
|
+ void Call_MyDisconnect();
|
|
|
+ void Call_MyConnect();
|
|
|
+ void Call_MyGo();
|
|
|
+ void Call_MyGoSN();
|
|
|
+ void Call_MyCheckFW();
|
|
|
+ void Call_MyCheckFWCommunicationError();
|
|
|
+ void Call_MySaveAsOutputData();
|
|
|
+ void Call_MyInitial_Failed();
|
|
|
+ void Call_MyGoCommunicationError();
|
|
|
+ void Call_MyGoSetCommunicationError();
|
|
|
+ void Call_MyExternalException();
|
|
|
+
|
|
|
+
|
|
|
+ void InitCallData()
|
|
|
+ {
|
|
|
+#pragma region 启动时Initial Communication:需要程序启动时注入;
|
|
|
+
|
|
|
+ _cd_Initial_failed.myCall = Call_MyInitial_Failed;
|
|
|
+
|
|
|
+ _cd_Initial_failed.dwBack2Addr = 0x00401EBD;
|
|
|
+
|
|
|
+ _cd_Initial_failed.dwOriginalAddr = 0x00401EB8;
|
|
|
+ _cd_Initial_failed.dwOriginalCallAddr = 0x004CEA38;
|
|
|
+
|
|
|
+ _cd_Initial_failed.nMyCallDataLen = JMP_DLEN;
|
|
|
+ memset(_cd_Initial_failed.szMyCallData, 0x90, CALL_LEN);
|
|
|
+ _cd_Initial_failed.szMyCallData[0] = 0xE9;
|
|
|
+ *(LPDWORD)(&_cd_Initial_failed.szMyCallData[1]) = (DWORD)_cd_Initial_failed.myCall - _cd_Initial_failed.dwOriginalAddr - JMP_DLEN;
|
|
|
+#pragma endregion
|
|
|
+
|
|
|
+#pragma region Connect按钮劫持
|
|
|
+
|
|
|
+ _cd_Connect.myCall = Call_MyConnect;
|
|
|
+
|
|
|
+ _cd_Connect.dwBack2Addr = 0x00415ED1;
|
|
|
+ _cd_Connect.dwOriginalAddr = 0x00415ECB;
|
|
|
+ _cd_Connect.dwOriginalCallAddr = 0x0041633B;
|
|
|
+
|
|
|
+ _cd_Connect.nMyCallDataLen = JMP_DLEN;
|
|
|
+ memset(_cd_Connect.szMyCallData, 0x90, CALL_LEN);
|
|
|
+ _cd_Connect.szMyCallData[0] = 0xE9;
|
|
|
+ *(LPDWORD)(&_cd_Connect.szMyCallData[1]) = (DWORD)_cd_Connect.myCall - _cd_Connect.dwOriginalAddr - JMP_DLEN;
|
|
|
+#pragma endregion
|
|
|
+
|
|
|
+#pragma region Disconnect按钮劫持
|
|
|
+
|
|
|
+
|
|
|
+ _cd_Disconnect.myCall = Call_MyDisconnect;
|
|
|
+ _cd_Disconnect.dwBack2Addr = 0x00437910;
|
|
|
+ _cd_Disconnect.dwOriginalAddr = 0x0043790B;
|
|
|
+ _cd_Disconnect.dwOriginalCallAddr = 0x004D42F4;
|
|
|
+
|
|
|
+ _cd_Disconnect.nMyCallDataLen = JMP_DLEN;
|
|
|
+ memset(_cd_Disconnect.szMyCallData, 0x90, CALL_LEN);
|
|
|
+ _cd_Disconnect.szMyCallData[0] = 0xE9;
|
|
|
+ *(LPDWORD)(&_cd_Disconnect.szMyCallData[1]) = (DWORD)_cd_Disconnect.myCall - _cd_Disconnect.dwOriginalAddr - JMP_DLEN;
|
|
|
+#pragma endregion
|
|
|
+
|
|
|
+#pragma region ExternalException
|
|
|
+
|
|
|
+ HMODULE hModule = GetModuleHandle(_T("Ca210Ctrl.dll"));
|
|
|
+
|
|
|
+ _cd_ExternalException.myCall = Call_MyExternalException;
|
|
|
+
|
|
|
+ _cd_ExternalException.dwBack2Addr = (DWORD)hModule + 0x106782;
|
|
|
+ _cd_ExternalException.dwOriginalAddr = (DWORD)hModule + 0x10677C;
|
|
|
+ _cd_ExternalException.dwOriginalCallAddr = 0x769F05B0;
|
|
|
+
|
|
|
+ _cd_ExternalException.nMyCallDataLen = JMP_DLEN;
|
|
|
+ memset(_cd_ExternalException.szMyCallData, 0x90, CALL_LEN);
|
|
|
+ _cd_ExternalException.szMyCallData[0] = 0xE9;
|
|
|
+ *(LPDWORD)(&_cd_ExternalException.szMyCallData[1]) = (DWORD)_cd_ExternalException.myCall - _cd_ExternalException.dwOriginalAddr - JMP_DLEN;
|
|
|
+#pragma endregion
|
|
|
+
|
|
|
+#pragma region Go按钮劫持
|
|
|
+
|
|
|
+ _cd_Go.myCall = Call_MyGo;
|
|
|
+ _cd_Go.dwBack2Addr = 0x004376B0;
|
|
|
+
|
|
|
+ _cd_Go.dwOriginalAddr = 0x004376AB;
|
|
|
+ _cd_Go.dwOriginalCallAddr = 0x00501A00;
|
|
|
+
|
|
|
+ _cd_Go.nMyCallDataLen = JMP_DLEN;
|
|
|
+ memset(_cd_Go.szMyCallData, 0x90, CALL_LEN);
|
|
|
+ _cd_Go.szMyCallData[0] = 0xE9;
|
|
|
+ *(LPDWORD)(&_cd_Go.szMyCallData[1]) = (DWORD)_cd_Go.myCall - _cd_Go.dwOriginalAddr - JMP_DLEN;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ _cd_Go_SN.myCall = Call_MyGoSN;
|
|
|
+ _cd_Go_SN.dwBack2Addr = 0x00417AF1;
|
|
|
+
|
|
|
+ _cd_Go_SN.dwOriginalAddr = 0x00417AEC;
|
|
|
+ _cd_Go_SN.dwOriginalCallAddr = 0x0040208C;
|
|
|
+
|
|
|
+ _cd_Go_SN.nMyCallDataLen = JMP_DLEN;
|
|
|
+ memset(_cd_Go_SN.szMyCallData, 0x90, CALL_LEN);
|
|
|
+ _cd_Go_SN.szMyCallData[0] = 0xE9;
|
|
|
+ *(LPDWORD)(&_cd_Go_SN.szMyCallData[1]) = (DWORD)_cd_Go_SN.myCall - _cd_Go_SN.dwOriginalAddr - JMP_DLEN;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ _cd_Go_SetCommunicationError.myCall = Call_MyGoSetCommunicationError;
|
|
|
+ _cd_Go_SetCommunicationError.dwBack2Addr = 0x00417FD2;
|
|
|
+
|
|
|
+ _cd_Go_SetCommunicationError.dwOriginalAddr = 0x00417FCD;
|
|
|
+ _cd_Go_SetCommunicationError.dwOriginalCallAddr = 0x004CEA38;
|
|
|
+
|
|
|
+ _cd_Go_SetCommunicationError.nMyCallDataLen = JMP_DLEN;
|
|
|
+ memset(_cd_Go_SetCommunicationError.szMyCallData, 0x90, CALL_LEN);
|
|
|
+ _cd_Go_SetCommunicationError.szMyCallData[0] = 0xE9;
|
|
|
+ *(LPDWORD)(&_cd_Go_SetCommunicationError.szMyCallData[1]) = (DWORD)_cd_Go_SetCommunicationError.myCall - _cd_Go_SetCommunicationError.dwOriginalAddr - JMP_DLEN;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ _cd_Go_CommunicationError.myCall = Call_MyGoCommunicationError;
|
|
|
+ _cd_Go_CommunicationError.dwBack2Addr = 0x0040440D;
|
|
|
+
|
|
|
+ _cd_Go_CommunicationError.dwOriginalAddr = 0x00404408;
|
|
|
+ _cd_Go_CommunicationError.dwOriginalCallAddr = 0x004CEA38;
|
|
|
+
|
|
|
+ _cd_Go_CommunicationError.nMyCallDataLen = JMP_DLEN;
|
|
|
+ memset(_cd_Go_CommunicationError.szMyCallData, 0x90, CALL_LEN);
|
|
|
+ _cd_Go_CommunicationError.szMyCallData[0] = 0xE9;
|
|
|
+ *(LPDWORD)(&_cd_Go_CommunicationError.szMyCallData[1]) = (DWORD)_cd_Go_CommunicationError.myCall - _cd_Go_CommunicationError.dwOriginalAddr - JMP_DLEN;
|
|
|
+#pragma endregion
|
|
|
+
|
|
|
+#pragma region CheckFW按钮处理
|
|
|
+
|
|
|
+ _cd_CheckFW.myCall = Call_MyCheckFW;
|
|
|
+
|
|
|
+ _cd_CheckFW.dwBack2Addr = 0x0040445D;
|
|
|
+ _cd_CheckFW.dwOriginalAddr = 0x00404458;
|
|
|
+ _cd_CheckFW.dwOriginalCallAddr = 0x453C44;
|
|
|
+
|
|
|
+ _cd_CheckFW.nMyCallDataLen = JMP_DLEN;
|
|
|
+ memset(_cd_CheckFW.szMyCallData, 0x90, CALL_LEN);
|
|
|
+ _cd_CheckFW.szMyCallData[0] = 0xE9;
|
|
|
+ *(LPDWORD)(&_cd_CheckFW.szMyCallData[1]) = (DWORD)_cd_CheckFW.myCall - _cd_CheckFW.dwOriginalAddr - JMP_DLEN;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ _cd_CheckFW_CommunicationError.myCall = Call_MyCheckFWCommunicationError;
|
|
|
+
|
|
|
+ _cd_CheckFW_CommunicationError.dwBack2Addr = 0x0040440D;
|
|
|
+ _cd_CheckFW_CommunicationError.dwOriginalAddr = 0x00404408;
|
|
|
+ _cd_CheckFW_CommunicationError.dwOriginalCallAddr = 0x4CEA38;
|
|
|
+
|
|
|
+ _cd_CheckFW_CommunicationError.nMyCallDataLen = JMP_DLEN;
|
|
|
+ memset(_cd_CheckFW_CommunicationError.szMyCallData, 0x90, CALL_LEN);
|
|
|
+ _cd_CheckFW_CommunicationError.szMyCallData[0] = 0xE9;
|
|
|
+ *(LPDWORD)(&_cd_CheckFW_CommunicationError.szMyCallData[1]) = (DWORD)_cd_CheckFW_CommunicationError.myCall - _cd_CheckFW_CommunicationError.dwOriginalAddr - JMP_DLEN;
|
|
|
+#pragma endregion
|
|
|
+ }
|
|
|
+
|
|
|
+ BOOL HijackedAllCall()
|
|
|
+ {
|
|
|
+ BOOL bHijack=FALSE;
|
|
|
+ if ( !(bHijack = HijackedCall(&_cd_Connect)) )
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ if ( !(bHijack = HijackedCall(&_cd_Disconnect)) )
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ if ( !(bHijack = HijackedCall(&_cd_Go)) )
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ if ( !(bHijack = HijackedCall(&_cd_Go_SN)) )
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ if ( !(bHijack = HijackedCall(&_cd_Go_CommunicationError)) )
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ if ( !(bHijack = HijackedCall(&_cd_Go_SetCommunicationError)) )
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ if ( !(bHijack = HijackedCall(&_cd_ExternalException)) )
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ if ( !(bHijack = HijackedCall(&_cd_CheckFW)) )
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ if ( !(bHijack = HijackedCall(&_cd_CheckFW_CommunicationError)) )
|
|
|
+ goto end;
|
|
|
+
|
|
|
+end:
|
|
|
+ return bHijack;
|
|
|
+ }
|
|
|
+
|
|
|
+ void RestoreAllCall()
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ BOOL HijackedCall(CALLDATA *pCallData)
|
|
|
+ {
|
|
|
+ if ( !pCallData )
|
|
|
+ return FALSE;
|
|
|
+
|
|
|
+ memset(pCallData->szMyCallData, 0, CALL_LEN);
|
|
|
+ pCallData->szMyCallData[0] = 0xE9;
|
|
|
+ *(LPDWORD)(&pCallData->szMyCallData[1]) = (DWORD)pCallData->myCall - pCallData->dwOriginalAddr - CALL_LEN;
|
|
|
+
|
|
|
+ HANDLE hProc = GetCurrentProcess();
|
|
|
+
|
|
|
+ memset(pCallData->szOriginalAddrData, 0, CALL_LEN);
|
|
|
+ if ( !ReadProcessMemory(hProc, (LPVOID)pCallData->dwOriginalAddr, pCallData->szOriginalAddrData, CALL_LEN, NULL) )
|
|
|
+ {
|
|
|
+ MessageBox(NULL, _T("读取内存失败"), _T("提示"),MB_OK);
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if ( !WriteProcessMemory(hProc, (LPVOID)pCallData->dwOriginalAddr, pCallData->szMyCallData, CALL_LEN, NULL) )
|
|
|
+ {
|
|
|
+ MessageBox(NULL, _T("写入内存失败"), _T("提示"),MB_OK);
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ return TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ BOOL HijackedCall(LPVOID MyCall, LPVOID OriginalCall, BYTE (&szOriginalCallData)[CALL_LEN])
|
|
|
+ {
|
|
|
+ BYTE szMyCallData[CALL_LEN] = {0};
|
|
|
+ szMyCallData[0] = 0xE9;
|
|
|
+ *(LPDWORD)(&szMyCallData[1]) = (DWORD)MyCall - (DWORD)OriginalCall - CALL_LEN;
|
|
|
+
|
|
|
+ HANDLE hProc = GetCurrentProcess();
|
|
|
+
|
|
|
+ if ( !ReadProcessMemory(hProc, OriginalCall, szOriginalCallData, CALL_LEN, NULL) )
|
|
|
+ {
|
|
|
+ MessageBox(NULL, _T("读取内存失败"), _T("提示"),MB_OK);
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if ( !WriteProcessMemory(hProc, OriginalCall, szMyCallData, CALL_LEN, NULL) )
|
|
|
+ {
|
|
|
+ MessageBox(NULL, _T("写入内存失败"), _T("提示"),MB_OK);
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ return TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ BOOL RecoveryCall(CALLDATA *pCallData)
|
|
|
+ {
|
|
|
+ if ( !pCallData )
|
|
|
+ return FALSE;
|
|
|
+
|
|
|
+
|
|
|
+ if ( !WriteProcessMemory(GetCurrentProcess(), (LPVOID)pCallData->dwOriginalAddr, pCallData->szOriginalAddrData, CALL_LEN, NULL) )
|
|
|
+ {
|
|
|
+ MessageBox(NULL, _T("写入内存失败"), _T("提示"),MB_OK);
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ return TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ void MyInitialFailed()
|
|
|
+ {
|
|
|
+ MessageBox(NULL, _T("MyInitialFailed"), _T("MyInitialFailed"), MB_OK);
|
|
|
+ }
|
|
|
+
|
|
|
+ void __declspec(naked) Call_MyInitial_Failed()
|
|
|
+ {
|
|
|
+ __asm pushad;
|
|
|
+ MyInitialFailed();
|
|
|
+ __asm popad;
|
|
|
+
|
|
|
+
|
|
|
+ __asm jmp _cd_Initial_failed.dwBack2Addr;
|
|
|
+ }
|
|
|
+
|
|
|
+ void __declspec(naked) Call_MySaveAsOutputData()
|
|
|
+ {
|
|
|
+
|
|
|
+ __asm {
|
|
|
+
|
|
|
+ mov dwEAX, EAX;
|
|
|
+ mov dwEBX, EBX;
|
|
|
+ mov dwECX, ECX;
|
|
|
+ mov dwEDX, EDX;
|
|
|
+ mov dwEBP, EBP;
|
|
|
+ mov dwESP, ESP;
|
|
|
+ mov dwESI, ESI;
|
|
|
+ mov dwEDI, EDI;
|
|
|
+
|
|
|
+ mov eax,0x004AB3FC
|
|
|
+ mov dl,1
|
|
|
+ call dword ptr[eax]
|
|
|
+
|
|
|
+ mov EAX, dwEAX;
|
|
|
+ mov EBX, dwEBX;
|
|
|
+ mov ECX, dwECX;
|
|
|
+ mov EDX, dwEDX;
|
|
|
+ mov EBP, dwEBP;
|
|
|
+ mov ESP, dwESP;
|
|
|
+ mov ESI, dwESI;
|
|
|
+ mov EDI, dwEDI;
|
|
|
+
|
|
|
+ ret
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void MyGo()
|
|
|
+ {
|
|
|
+ CHAR szMsg[MAX_PATH];
|
|
|
+ DWORD dwElapsedAddr = 0x0052DF54;
|
|
|
+ DWORD dwSNAddr = dwEBP - 0x5D0;
|
|
|
+ sprintf_s(szMsg, "MyGo耗时:%ldms, SN:%08X, %s", *(LPDWORD)dwElapsedAddr, dwSNAddr, (CHAR*)(*(LPDWORD)dwSNAddr));
|
|
|
+ MessageBoxA(NULL, szMsg, "MyGo", MB_OK);
|
|
|
+ }
|
|
|
+
|
|
|
+ void __declspec(naked) Call_MyGo()
|
|
|
+ {
|
|
|
+
|
|
|
+ __asm{
|
|
|
+
|
|
|
+ mov dwEAX, EAX;
|
|
|
+ mov dwEBX, EBX;
|
|
|
+ mov dwECX, ECX;
|
|
|
+ mov dwEDX, EDX;
|
|
|
+ mov dwEBP, EBP;
|
|
|
+ mov dwESP, ESP;
|
|
|
+ mov dwESI, ESI;
|
|
|
+ mov dwEDI, EDI;
|
|
|
+ }
|
|
|
+
|
|
|
+ MyGo();
|
|
|
+
|
|
|
+ __asm{
|
|
|
+
|
|
|
+ mov EAX, dwEAX;
|
|
|
+ mov EBX, dwEBX;
|
|
|
+ mov ECX, dwECX;
|
|
|
+ mov EDX, dwEDX;
|
|
|
+ mov EBP, dwEBP;
|
|
|
+ mov ESP, dwESP;
|
|
|
+ mov ESI, dwESI;
|
|
|
+ mov EDI, dwEDI;
|
|
|
+
|
|
|
+ call _cd_Go.dwOriginalCallAddr
|
|
|
+
|
|
|
+ jmp _cd_Go.dwBack2Addr
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void MyGoSN()
|
|
|
+ {
|
|
|
+ CHAR szMsg[MAX_PATH];
|
|
|
+ DWORD dwSNAddr = dwEBP - 0x5D0;
|
|
|
+
|
|
|
+ sprintf_s(szMsg, "MyGo %08X, %08X, %08X, %s", dwEAX, dwSNAddr, DWORD(*(LPDWORD)dwSNAddr), (CHAR*)(*(LPDWORD)dwSNAddr));
|
|
|
+ MessageBoxA(NULL, szMsg, "MyGoSN", MB_OK);
|
|
|
+ }
|
|
|
+
|
|
|
+ void __declspec(naked) Call_MyGoSN()
|
|
|
+ {
|
|
|
+
|
|
|
+ __asm{
|
|
|
+
|
|
|
+ mov dwEAX, EAX;
|
|
|
+ mov dwEBX, EBX;
|
|
|
+ mov dwECX, ECX;
|
|
|
+ mov dwEDX, EDX;
|
|
|
+ mov dwEBP, EBP;
|
|
|
+ mov dwESP, ESP;
|
|
|
+ mov dwESI, ESI;
|
|
|
+ mov dwEDI, EDI;
|
|
|
+ }
|
|
|
+
|
|
|
+ MyGoSN();
|
|
|
+
|
|
|
+ __asm{
|
|
|
+
|
|
|
+ mov EAX, dwEAX;
|
|
|
+ mov EBX, dwEBX;
|
|
|
+ mov ECX, dwECX;
|
|
|
+ mov EDX, dwEDX;
|
|
|
+ mov EBP, dwEBP;
|
|
|
+ mov ESP, dwESP;
|
|
|
+ mov ESI, dwESI;
|
|
|
+ mov EDI, dwEDI;
|
|
|
+
|
|
|
+ call _cd_Go_SN.dwOriginalCallAddr
|
|
|
+
|
|
|
+ jmp _cd_Go_SN.dwBack2Addr
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void MyGoSetCommunicationError()
|
|
|
+ {
|
|
|
+ MessageBox(NULL, _T("MyGoSetCommunicationError"), _T("劫持"), MB_OK);
|
|
|
+ }
|
|
|
+
|
|
|
+ void __declspec(naked) Call_MyGoSetCommunicationError()
|
|
|
+ {
|
|
|
+
|
|
|
+ __asm{
|
|
|
+
|
|
|
+ mov dwEAX, EAX;
|
|
|
+ mov dwEBX, EBX;
|
|
|
+ mov dwECX, ECX;
|
|
|
+ mov dwEDX, EDX;
|
|
|
+ mov dwEBP, EBP;
|
|
|
+ mov dwESP, ESP;
|
|
|
+ mov dwESI, ESI;
|
|
|
+ mov dwEDI, EDI;
|
|
|
+ }
|
|
|
+
|
|
|
+ MyGoSetCommunicationError();
|
|
|
+
|
|
|
+ __asm{
|
|
|
+
|
|
|
+ mov EAX, dwEAX;
|
|
|
+ mov EBX, dwEBX;
|
|
|
+ mov ECX, dwECX;
|
|
|
+ mov EDX, dwEDX;
|
|
|
+ mov EBP, dwEBP;
|
|
|
+ mov ESP, dwESP;
|
|
|
+ mov ESI, dwESI;
|
|
|
+ mov EDI, dwEDI;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ jmp _cd_Go_SetCommunicationError.dwBack2Addr
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void MyGoCommunicationError()
|
|
|
+ {
|
|
|
+ MessageBox(NULL, _T("MyGoCommunicationError"), _T("劫持"), MB_OK);
|
|
|
+ }
|
|
|
+
|
|
|
+ void __declspec(naked) Call_MyGoCommunicationError()
|
|
|
+ {
|
|
|
+
|
|
|
+ __asm{
|
|
|
+
|
|
|
+ mov dwEAX, EAX;
|
|
|
+ mov dwEBX, EBX;
|
|
|
+ mov dwECX, ECX;
|
|
|
+ mov dwEDX, EDX;
|
|
|
+ mov dwEBP, EBP;
|
|
|
+ mov dwESP, ESP;
|
|
|
+ mov dwESI, ESI;
|
|
|
+ mov dwEDI, EDI;
|
|
|
+ }
|
|
|
+
|
|
|
+ MyGoCommunicationError();
|
|
|
+
|
|
|
+ __asm{
|
|
|
+
|
|
|
+ mov EAX, dwEAX;
|
|
|
+ mov EBX, dwEBX;
|
|
|
+ mov ECX, dwECX;
|
|
|
+ mov EDX, dwEDX;
|
|
|
+ mov EBP, dwEBP;
|
|
|
+ mov ESP, dwESP;
|
|
|
+ mov ESI, dwESI;
|
|
|
+ mov EDI, dwEDI;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ jmp _cd_Go_CommunicationError.dwBack2Addr
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ BOOL MyConnect()
|
|
|
+ {
|
|
|
+
|
|
|
+ BYTE AL = LOBYTE(LOWORD(dwEAX));
|
|
|
+ if ( AL == 0 )
|
|
|
+ {
|
|
|
+ MessageBox(NULL, _T("连接失败"), _T("连接提示"), MB_OK);
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ MessageBox(NULL, _T("连接成功"), _T("连接提示"), MB_OK);
|
|
|
+ }
|
|
|
+ return TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ void __declspec(naked) Call_MyConnect()
|
|
|
+ {
|
|
|
+
|
|
|
+ __asm mov dwEAX, eax;
|
|
|
+ __asm pushad;
|
|
|
+
|
|
|
+ if ( MyConnect() )
|
|
|
+ {
|
|
|
+ __asm{
|
|
|
+
|
|
|
+ popad;
|
|
|
+
|
|
|
+ jmp _cd_Connect.dwBack2Addr;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ __asm{
|
|
|
+
|
|
|
+ popad;
|
|
|
+
|
|
|
+ jmp _cd_Connect.dwOriginalCallAddr;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void MyExternalException()
|
|
|
+ {
|
|
|
+ MessageBox(NULL, _T("MyExternalExceptionE06D7363,重启异常待重启"), _T("提示"), MB_OK);
|
|
|
+ ::exit(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ void __declspec(naked) Call_MyExternalException()
|
|
|
+ {
|
|
|
+
|
|
|
+ __asm {
|
|
|
+ pushad;
|
|
|
+ }
|
|
|
+
|
|
|
+ MyExternalException();
|
|
|
+
|
|
|
+ __asm
|
|
|
+ {
|
|
|
+
|
|
|
+ popad;
|
|
|
+
|
|
|
+ call _cd_ExternalException.dwOriginalCallAddr;
|
|
|
+ jmp _cd_ExternalException.dwBack2Addr;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void MyDisconnect()
|
|
|
+ {
|
|
|
+ MessageBox(NULL, _T("MyDisconnect Function"), _T("MyDisconnect"), MB_OK);
|
|
|
+ }
|
|
|
+
|
|
|
+ void __declspec(naked) Call_MyDisconnect()
|
|
|
+ {
|
|
|
+ __asm pushad;
|
|
|
+ MyDisconnect();
|
|
|
+ __asm
|
|
|
+ {
|
|
|
+ popad;
|
|
|
+ call _cd_Disconnect.dwOriginalCallAddr;
|
|
|
+ jmp _cd_Disconnect.dwBack2Addr;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void __declspec(naked) Call_MyCheckFW()
|
|
|
+ {
|
|
|
+
|
|
|
+ __asm pushad;
|
|
|
+
|
|
|
+
|
|
|
+ MessageBox(NULL, _T("Call_MyCheckFW"), _T("MyCheckFW"), MB_OK);
|
|
|
+
|
|
|
+
|
|
|
+ __asm{
|
|
|
+
|
|
|
+ popad;
|
|
|
+
|
|
|
+ call _cd_CheckFW.dwOriginalCallAddr;
|
|
|
+
|
|
|
+ jmp _cd_CheckFW.dwBack2Addr;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void __declspec(naked) Call_MyCheckFWCommunicationError()
|
|
|
+ {
|
|
|
+
|
|
|
+ __asm pushad;
|
|
|
+
|
|
|
+
|
|
|
+ MessageBox(NULL, _T("Call_MyCheckFWCommunicationError"), _T("MyCheckFWCommunicationError"), MB_OK);
|
|
|
+
|
|
|
+
|
|
|
+ __asm{
|
|
|
+
|
|
|
+ popad;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ jmp _cd_CheckFW_CommunicationError.dwBack2Addr;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void __declspec(naked) SetChannel()
|
|
|
+ {
|
|
|
+
|
|
|
+ __asm{
|
|
|
+
|
|
|
+ mov dwEAX, EAX;
|
|
|
+ mov dwEBX, EBX;
|
|
|
+ mov dwECX, ECX;
|
|
|
+ mov dwEDX, EDX;
|
|
|
+ mov dwEBP, EBP;
|
|
|
+ mov dwESP, ESP;
|
|
|
+ mov dwESI, ESI;
|
|
|
+ mov dwEDI, EDI;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ MessageBox(NULL, _T("MyGo Function"), _T("MyGo"), MB_OK);
|
|
|
+
|
|
|
+
|
|
|
+ __asm{
|
|
|
+
|
|
|
+ mov EAX, dwEAX;
|
|
|
+ mov EBX, dwEBX;
|
|
|
+ mov ECX, dwECX;
|
|
|
+ mov EDX, dwEDX;
|
|
|
+ mov EBP, dwEBP;
|
|
|
+ mov ESP, dwESP;
|
|
|
+ mov ESI, dwESI;
|
|
|
+ mov EDI, dwEDI;
|
|
|
+
|
|
|
+ jmp _cd_Go.dwBack2Addr;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void SetSN(LPCTSTR lpSN)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ void ChangeSDK(int nSDK)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ void __declspec(naked) Call_Connect()
|
|
|
+ {
|
|
|
+
|
|
|
+
|
|
|
+ __asm {
|
|
|
+ pushad;
|
|
|
+ mov eax,0x02393F78;
|
|
|
+ mov ebx,0x024856CC;
|
|
|
+ mov ecx,0x004AB16C;
|
|
|
+ mov edx,0x024156CC;
|
|
|
+ call dwCallAddr;
|
|
|
+ popad;
|
|
|
+ }*/
|
|
|
+ dwCallAddr = 0x00415DFC;
|
|
|
+ __asm call dwCallAddr;
|
|
|
+ }
|
|
|
+};
|