|
@@ -4,16 +4,14 @@
|
|
|
#include "stdafx.h"
|
|
|
#include "Assist.h"
|
|
|
|
|
|
-// 8组寄存器存储;
|
|
|
-BYTE byEAX[8] = {0};
|
|
|
-BYTE byEBX[8] = {0};
|
|
|
-BYTE byECX[8] = {0};
|
|
|
-BYTE byEDX[8] = {0};
|
|
|
-BYTE byEBP[8] = {0};
|
|
|
-BYTE byESP[8] = {0};
|
|
|
-BYTE byESI[8] = {0};
|
|
|
-BYTE byEDI[8] = {0};
|
|
|
+// 全局CallData;
|
|
|
+CALLDATA _cd_Go;
|
|
|
+CALLDATA _cd_Connect;
|
|
|
+CALLDATA _cd_Disconnect;
|
|
|
+CALLDATA _cd_CheckFW;
|
|
|
+CALLDATA _cd_SaveAsOutputData;
|
|
|
|
|
|
+// 8组寄存器存储;
|
|
|
DWORD dwEAX = 0;
|
|
|
DWORD dwEBX = 0;
|
|
|
DWORD dwECX = 0;
|
|
@@ -23,11 +21,98 @@ DWORD dwESP = 0;
|
|
|
DWORD dwESI = 0;
|
|
|
DWORD dwEDI = 0;
|
|
|
|
|
|
-// 新的Call;
|
|
|
-BYTE byNewCall[5] = {0};
|
|
|
+// 定义跳转函数;
|
|
|
+void Call_MyDisconnect();
|
|
|
+void Call_MyConnect();
|
|
|
+void Call_MyGo();
|
|
|
+void Call_MyCheckFW();
|
|
|
+void Call_MySaveAsOutputData();
|
|
|
+// 其他函数;
|
|
|
+void SetChannel(int nChannel);
|
|
|
+void SetSN(LPCTSTR lpSN);
|
|
|
+void ChangeSDK(int nSDK); // 0=410SDK, 1=310SDK;
|
|
|
+
|
|
|
+void InitCallData()
|
|
|
+{
|
|
|
+ // Go
|
|
|
+ _cd_Go.myCall = Call_MyGo;
|
|
|
+ _cd_Go.dwBack2Addr = 0x00417B2A;
|
|
|
+ _cd_Go.dwOriginalAddr = 0x00417B25;
|
|
|
+
|
|
|
+ // Connect
|
|
|
+ _cd_Connect.myCall = Call_MyConnect;
|
|
|
+ _cd_Connect.dwBack2Addr = 0x00417B2A;
|
|
|
+ _cd_Connect.dwOriginalAddr = 0x00417B25;
|
|
|
+
|
|
|
+ // Disconnect
|
|
|
+ _cd_Disconnect.myCall = Call_MyDisconnect;
|
|
|
+ _cd_Disconnect.dwBack2Addr = 0x00417B2A;
|
|
|
+ _cd_Disconnect.dwOriginalAddr = 0x00417B25;
|
|
|
+
|
|
|
+ // CheckFW
|
|
|
+ _cd_CheckFW.myCall = Call_MyCheckFW;
|
|
|
+ _cd_CheckFW.dwBack2Addr = 0x00417B2A;
|
|
|
+ _cd_CheckFW.dwOriginalAddr = 0x00417B25;
|
|
|
+
|
|
|
+ // SaveAsOutputData
|
|
|
+ _cd_SaveAsOutputData.myCall = Call_MySaveAsOutputData;
|
|
|
+ _cd_SaveAsOutputData.dwBack2Addr = 0x00417B2A;
|
|
|
+ _cd_SaveAsOutputData.dwOriginalAddr = 0x00417B25;
|
|
|
+}
|
|
|
+
|
|
|
+// 劫持原始地址;
|
|
|
+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;
|
|
|
+}
|
|
|
|
|
|
-// 旧的Call备份;
|
|
|
-BYTE byOldCall[5] = {0};
|
|
|
+// 劫持原始地址;
|
|
|
+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;
|
|
|
+}
|
|
|
|
|
|
void __declspec(naked) Call_MySaveAsOutputData()
|
|
|
{
|
|
@@ -44,8 +129,8 @@ void __declspec(naked) Call_MySaveAsOutputData()
|
|
|
mov dwEDI, EDI;
|
|
|
// my call
|
|
|
mov eax,0x004AB3FC
|
|
|
- mov dl,1
|
|
|
- call dword ptr[eax]
|
|
|
+ mov dl,1
|
|
|
+ call dword ptr[eax]
|
|
|
// 恢复寄存器;
|
|
|
mov EAX, dwEAX;
|
|
|
mov EBX, dwEBX;
|
|
@@ -61,8 +146,7 @@ void __declspec(naked) Call_MySaveAsOutputData()
|
|
|
}
|
|
|
|
|
|
|
|
|
-DWORD dwGoNextAddr = 0x00417B2A;
|
|
|
-void __declspec(naked) MyGo()
|
|
|
+void __declspec(naked) Call_MyGo()
|
|
|
{
|
|
|
// 备份寄存器;
|
|
|
__asm{
|
|
@@ -92,32 +176,152 @@ void __declspec(naked) MyGo()
|
|
|
mov ESI, dwESI;
|
|
|
mov EDI, dwEDI;
|
|
|
// 最后返回原Call地址下一行;
|
|
|
- jmp dwGoNextAddr;
|
|
|
+ jmp _cd_Go.dwBack2Addr;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// 00417A84
|
|
|
-// 00417B25 | E8 FA9F0E00 | call demo.501B24 |
|
|
|
-void Call_MyGo()
|
|
|
+void __declspec(naked) Call_MyConnect()
|
|
|
{
|
|
|
- BYTE szMyCall[5] = {0};
|
|
|
- szMyCall[0] = 0xE9; // 硬编码:jmp或call
|
|
|
- *(LPDWORD)(&szMyCall[1]) = (DWORD)MyGo - 0x00417B25 - 5;
|
|
|
+ // 备份寄存器;
|
|
|
+ __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;
|
|
|
+ }
|
|
|
|
|
|
- HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
|
|
|
- // 将要Hook的地址指令备份下来;
|
|
|
- if ( !ReadProcessMemory(GetCurrentProcess(), (LPVOID)0x00417B25, byOldCall, 5, NULL) )
|
|
|
- {
|
|
|
- MessageBox(NULL, _T("读取内存失败"), _T("提示"),MB_OK);
|
|
|
- return;
|
|
|
+
|
|
|
+ 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;
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
- // 将我们的Call地址指令写入目标地址;
|
|
|
- if ( !WriteProcessMemory(hProc, (LPVOID)0x00417B25, szMyCall, 5, NULL) )
|
|
|
- {
|
|
|
- MessageBox(NULL, _T("写入内存失败"), _T("提示"),MB_OK);
|
|
|
- return;
|
|
|
+void __declspec(naked) Call_MyDisconnect()
|
|
|
+{
|
|
|
+ // 备份寄存器;
|
|
|
+ __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 __declspec(naked) Call_MyCheckFW()
|
|
|
+{
|
|
|
+ // 备份寄存器;
|
|
|
+ __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 __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;
|
|
|
+{
|
|
|
|
|
|
- MessageBox(NULL, _T("替换成功"), _T("提示"), MB_OK);
|
|
|
}
|