123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699 |
- // OGCAssist.cpp : 定义 DLL 应用程序的导出函数。
- //
- #include "stdafx.h"
- #include "OGCAssist.h"
- #include <process.h>
- namespace Assist
- {
- // 全局Call Data;
- 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;
- // 调试耗时值ms;
- DWORD dwElapsed = 0;
- TCHAR g_szGoSN[32] = {0};
- DWORD dwCallAddr = 0;
- // 8组全局寄存器存储;
- 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:需要程序启动时注入;
- // 00401EB8 | E8 7BCB0C00 | call demo.4CEA38 |
- _cd_Initial_failed.myCall = Call_MyInitial_Failed;
- // 00401EBD | FF4D CC | dec dword ptr ss:[ebp-34] |
- _cd_Initial_failed.dwBack2Addr = 0x00401EBD;
- // 00401EB8 | E8 7BCB0C00 | call demo.4CEA38 |
- _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; // 汇编硬编码:jmp [4字节地址];
- *(LPDWORD)(&_cd_Initial_failed.szMyCallData[1]) = (DWORD)_cd_Initial_failed.myCall - _cd_Initial_failed.dwOriginalAddr - JMP_DLEN;
- #pragma endregion
- #pragma region Connect按钮劫持
- //00415ECB | 0F84 6A040000 | je demo.41633B
- _cd_Connect.myCall = Call_MyConnect;
- // 00415ED1 | 6A 00 | push 0
- _cd_Connect.dwBack2Addr = 0x00415ED1;
- _cd_Connect.dwOriginalAddr = 0x00415ECB;
- _cd_Connect.dwOriginalCallAddr = 0x0041633B; // 此处是JMP,注意注入时不要调用为Call
- _cd_Connect.nMyCallDataLen = JMP_DLEN;
- memset(_cd_Connect.szMyCallData, 0x90, CALL_LEN);
- _cd_Connect.szMyCallData[0] = 0xE9; // 汇编硬编码:jmp [4字节地址];
- *(LPDWORD)(&_cd_Connect.szMyCallData[1]) = (DWORD)_cd_Connect.myCall - _cd_Connect.dwOriginalAddr - JMP_DLEN;
- #pragma endregion
- #pragma region Disconnect按钮劫持
- // 0043790B | E8 E4C90900 | call demo.4D42F4 | # 此处可能用于SetWindowText之类处理
- // 00437910 | FF4D F4 | dec dword ptr ss:[ebp-C] |
- _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; // 汇编硬编码:jmp [4字节地址];
- *(LPDWORD)(&_cd_Disconnect.szMyCallData[1]) = (DWORD)_cd_Disconnect.myCall - _cd_Disconnect.dwOriginalAddr - JMP_DLEN;
- #pragma endregion
- #pragma region ExternalException
- // 必须获取模块地址:ca210ctrl.dll
- HMODULE hModule = GetModuleHandle(_T("Ca210Ctrl.dll"));
- // 044D677C | FF15 78645404 | call dword ptr ds:[<&RaiseException>] |
- _cd_ExternalException.myCall = Call_MyExternalException;
- // 044D6782 | 5F | pop edi |
- _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; // 汇编硬编码:jmp [4字节地址];
- *(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;
- // 004376AB | E8 50A30C00 | call demo.501A00
- _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; // 汇编硬编码:jmp [4字节地址];
- *(LPDWORD)(&_cd_Go.szMyCallData[1]) = (DWORD)_cd_Go.myCall - _cd_Go.dwOriginalAddr - JMP_DLEN;
- // 获取SN字符串;
- // 00417AEC | E8 9BA5FEFF | call demo.40208C |
- // 00417AF1 | E8 722C0700 | call demo.48A768 |
- _cd_Go_SN.myCall = Call_MyGoSN;
- _cd_Go_SN.dwBack2Addr = 0x00417AF1;
- // 004376AB | E8 50A30C00 | call demo.501A00
- _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; // 汇编硬编码:jmp [4字节地址];
- *(LPDWORD)(&_cd_Go_SN.szMyCallData[1]) = (DWORD)_cd_Go_SN.myCall - _cd_Go_SN.dwOriginalAddr - JMP_DLEN;
- // 消除 Set Communication Error 弹框;
- // 00417FCD | E8 666A0B00 | call demo.4CEA38 |
- _cd_Go_SetCommunicationError.myCall = Call_MyGoSetCommunicationError;
- _cd_Go_SetCommunicationError.dwBack2Addr = 0x00417FD2;
- // 00417FD2 | FF8D F4E8FFFF| dec dword ptr ss:[ebp-170C]|
- _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; // 汇编硬编码:jmp [4字节地址];
- *(LPDWORD)(&_cd_Go_SetCommunicationError.szMyCallData[1]) = (DWORD)_cd_Go_SetCommunicationError.myCall - _cd_Go_SetCommunicationError.dwOriginalAddr - JMP_DLEN;
- // 消除Communication Error弹框;
- // 00404408 | E8 2BA60C00| call demo.4CEA38|
- _cd_Go_CommunicationError.myCall = Call_MyGoCommunicationError;
- _cd_Go_CommunicationError.dwBack2Addr = 0x0040440D;
- // 0040440D | FF4D BC | dec dword ptr ss:[ebp-44] |
- _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; // 汇编硬编码:jmp [4字节地址];
- *(LPDWORD)(&_cd_Go_CommunicationError.szMyCallData[1]) = (DWORD)_cd_Go_CommunicationError.myCall - _cd_Go_CommunicationError.dwOriginalAddr - JMP_DLEN;
- #pragma endregion
- #pragma region CheckFW按钮处理
- // 00404458 | E8 E7F70400 | call demo.453C44 | # 此处应该是执行I2CReadEx
- _cd_CheckFW.myCall = Call_MyCheckFW; // 成功获取版本后跳转处理;
- // 0040445D | 83C4 1C | add esp,1C |
- _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; // 汇编硬编码:jmp [4字节地址];
- *(LPDWORD)(&_cd_CheckFW.szMyCallData[1]) = (DWORD)_cd_CheckFW.myCall - _cd_CheckFW.dwOriginalAddr - JMP_DLEN;
- /* 针对弹框Communication Error的消除处理 */
- // 00404408 | E8 2BA60C00 | call demo.4CEA38 | # Dailogs::ShowMessage(string) 弹出提示框:Communication Error
- _cd_CheckFW_CommunicationError.myCall = Call_MyCheckFWCommunicationError; // 成功获取版本后跳转处理;
- // 0040440D | FF4D BC | dec dword ptr ss:[ebp-44] | [ebp-44]:&"脥I"
- _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; // 汇编硬编码:jmp [4字节地址];
- *(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; // 汇编硬编码:jmp [4字节地址];
- *(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;
- }
- // 将我们的Call地址指令写入目标地址;
- 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; // 汇编硬编码:jmp [4字节地址];
- *(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;
- }
- // 将我们的Call地址指令写入目标地址;
- 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;
- // 将我们的Call地址指令写入目标地址;
- 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;
- // 不执行原call:原Call是Messagebox弹框,需要消除掉它;
- // __asm call _cd_Initial_failed.dwOriginalCallAddr;
- __asm jmp _cd_Initial_failed.dwBack2Addr;
- }
- void __declspec(naked) Call_MySaveAsOutputData()
- {
- //004AB3FC
- __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;
- // my call
- 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;
- call _cd_Go.dwOriginalCallAddr
- // 返回劫持地址下一行;
- jmp _cd_Go.dwBack2Addr
- }
- }
- void MyGoSN()
- {
- CHAR szMsg[MAX_PATH];
- DWORD dwSNAddr = dwEBP - 0x5D0;
- //_stprintf_s(szMsg, _T("MyGo %08X, %08X, %08X, %s"), dwEAX, dwSNAddr, DWORD(*(LPDWORD)dwSNAddr), (TCHAR*)(*(LPDWORD)dwSNAddr));
- 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;
- 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;
- // 执行原Call;
- //call _cd_Go_SetCommunicationError.dwOriginalCallAddr // 经验证,即使不执行原call,也会弹异常框;
- // 返回劫持地址下一行;
- 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;
- // 执行原Call;
- //call _cd_Go_CommunicationError.dwOriginalCallAddr
- // 返回劫持地址下一行;
- jmp _cd_Go_CommunicationError.dwBack2Addr
- }
- }
- BOOL MyConnect()
- {
- // 读取AL的值; 0表示Connect失败;1表示成功;
- 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到出错处理;
- 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;
- // 失败:JMP到出错处理;
- 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;
- call _cd_CheckFW.dwOriginalCallAddr;
- // 最后返回原Call地址下一行;
- jmp _cd_CheckFW.dwBack2Addr;
- }
- }
- void __declspec(naked) Call_MyCheckFWCommunicationError()
- {
- // 备份寄存器;
- __asm pushad;
- MessageBox(NULL, _T("Call_MyCheckFWCommunicationError"), _T("MyCheckFWCommunicationError"), MB_OK);
- __asm{
- // 恢复寄存器;
- popad;
- // 消除原call;
- // call _cd_CheckFW.dwOriginalCallAddr;
- // 最后返回原Call地址下一行;
- 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;
- // 最后返回原Call地址下一行;
- jmp _cd_Go.dwBack2Addr;
- }
- }
- void SetSN(LPCTSTR lpSN)
- {
- }
- void ChangeSDK(int nSDK) // 0=410SDK, 1=310SDK;
- {
- }
- void __declspec(naked) Call_Connect()
- {
- //dwCallAddr = 0x004D5864;//0x004378B0;
- /*dwCallAddr = 0x004378B0;
- __asm {
- pushad;
- mov eax,0x02393F78;
- mov ebx,0x024856CC;
- mov ecx,0x004AB16C;
- mov edx,0x024156CC;
- call dwCallAddr;
- popad;
- }*/
- dwCallAddr = 0x00415DFC;
- __asm call dwCallAddr;
- }
- };
|