📄 allmycode.cpp
字号:
#include "stdafx.h"
#include "AllMyInclude.h"
#include "iniConfig.h"
CString DomainName;
BOOL DomainName_SaveFlag = true;//默认需要获得IP并修改
static LPSTR lpDomainName = NULL;
static LPSTR lpClientIP = NULL;
static CString CClientIP;
HANDLE Write_Mutex = NULL;
BYTE LeaClientIPToEbx[] = { 0x8D,0x5D,0x36 };//将需要的值存入EBX
void GetClientIP()
{
__asm
{
mov lpClientIP, ebx;//获得客户端IP地址
}
TCHAR TClientIP[16] = {0};
CharToWchar( TClientIP, lpClientIP);
CClientIP.Empty();
CClientIP.Format( _T("%s"),TClientIP );
}
BYTE LeaMovSelGateSerIPToEbx[] = {0x8D,0x53,0x15,0x8B,0xDA};
//8D53 15 lea edx,dword ptr ds:[ebx+15]
//8BDA mov ebx,edx
void GetSelGateIPAddr()
{
__asm
{
mov lpDomainName,ebx;//获得原始地址
}
/*
ebx - 0x15 = 服务器名 char* size 21
ebx = 选人服务器IP char* size 19
ebx + 0x13 = 选人服务器端口 DWORD
*/
if( lpDomainName )
DomainName_SaveFlag = true;//获得地址以后设置存储标志
}
void CallWaitMutex()//调用等待互斥对象 必须在使用全局变量前 调用高函数
{
::WaitForSingleObject( Write_Mutex, 100 );//等待其他线程访问完成
}
void ReleaseExMutex()//释放 必须在使用完全局变量以后调用该函数
{
::ReleaseMutex( Write_Mutex );//释放互斥对象以便于其他线程访问
}
void DomainToIP()//域名转IP
{
//------------------------------------
TCHAR TlpDomainName[32] = {0};
CString SelGateIP, CNowDomainName;
char lpSelGateIP[32] = {0};
CString tCClientIP = CClientIP;
CallWaitMutex();
if(lpDomainName != NULL)
{
if( DomainName_SaveFlag )
{
CharToWchar( TlpDomainName, lpDomainName);
DomainName.Format(_T("%s"), TlpDomainName);
CNowDomainName = DomainName;
DomainName_SaveFlag = false;
}
else
{
CharToWchar( TlpDomainName, lpDomainName);
CNowDomainName.Format(_T("%s"), TlpDomainName);
}
//------------------------------------------------------------------
if( ! CClientIP.IsEmpty() )
{
if( IsPrivateIP( tCClientIP ) )
{
if( LocalHostToIP( &SelGateIP ) )
{
SelGateIP.Trim();//去除空白字符
CNowDomainName.Trim();
//-------------------------------------------------------------------
//WcharToChar( SelGateIP.AllocSysString(), lpSelGateIP );
//
// 修改SELGATE IP
//
if( SelGateIP.Compare( CNowDomainName ) != 0)//比较字符串是否相同 不同修改
{
ZeroMemory((LPVOID)lpDomainName,19);
//memcpy_s( (LPVOID)lpDomainName,19,lpSelGateIP, strlen(lpSelGateIP));//复制内存到目标地址
WcharToChar( SelGateIP.AllocSysString(), lpDomainName );
}
}
}
else
{
if( HostToIP( DomainName, &SelGateIP ) )
{
SelGateIP.Trim();//去除空白字符
CNowDomainName.Trim();
//-------------------------------------------------------------------
//WcharToChar( SelGateIP.AllocSysString(), lpSelGateIP );
//
// 修改SELGATE IP
//
if( SelGateIP.Compare( CNowDomainName ) != 0)//比较字符串是否相同 不同修改
{
ZeroMemory((LPVOID)lpDomainName,19);
//memcpy_s( (LPVOID)lpDomainName,19,lpSelGateIP, strlen(lpSelGateIP));//复制内存到目标地址
WcharToChar( SelGateIP.AllocSysString(), lpDomainName );
}
}
}
}
}
ReleaseExMutex();
}
//在宿主程序中的任意代码处插入调用我们DLL中函数的代码
DWORD DetourGame( DWORD targetCodeAddress, DWORD targetCodeLength, DWORD ourFunctionAddress )//,int Flag = false)//需要自动还原代码为FALSE,否则为true
{
// 目标处代码长度小于 5 则太短不足以填充跳转代码
if ( targetCodeLength < 5 )
return 0x01;//代码太小
//
// 修改权限, 分配相关资源
//
DWORD oldAttr = 0, tmpAttr = 0, tmpIdx = 0;
// 修改目标代码区权限为可执行可读写
if ( !VirtualProtect( (void *)(DWORD_PTR)targetCodeAddress, targetCodeLength, PAGE_EXECUTE_READWRITE, &oldAttr ) )
{
MessageBox(NULL, _T("内存权限设置失败!"),_T("提示"),NULL);
return 0x02;
}
BYTE *backupCode;
// 在堆上分配内存用以备份原目标代码
backupCode = new BYTE[ targetCodeLength ];
if ( backupCode == NULL )
return 0x03;
// 在堆上分配内存用以存放构造的跳转代码
BYTE *jumpCode = new BYTE[ targetCodeLength ];
if ( jumpCode == NULL )
{
delete[] backupCode;
return 0x04;
}
// 在堆上分配内存用以存放构造的"门"代码, 并修改其权限为可执行可读写
BYTE *gatewayCode = new BYTE[ targetCodeLength + 12 ];
if ( gatewayCode == NULL )
{
delete[] backupCode;
delete[] jumpCode;
return 0x05;
}
if ( !VirtualProtect( (void *)gatewayCode, targetCodeLength + 12, PAGE_EXECUTE_READWRITE, &tmpAttr ) )
{
delete[] backupCode;
delete[] jumpCode;
delete[] gatewayCode;
return 0x06;
}
//
// 备份原目标代码
//
memcpy( (void *)backupCode, (const void *)(DWORD_PTR)targetCodeAddress, targetCodeLength );
//
// 构造跳转代码, 覆盖到目标处代码处, 使其转到我们构造的"门"代码处
//
jumpCode[0] = 0xE9;//E8 CALL E9 JMP,原始E8
*(PDWORD)( jumpCode + 1 ) = \
(DWORD)(DWORD_PTR)(&(*gatewayCode)) - targetCodeAddress - 5;
// 将多余字节填充为 nop
DWORD tmp = 5;
while ( tmp < targetCodeLength )
jumpCode[ tmp++ ] = 0x90;
memcpy( (void *)(DWORD_PTR)targetCodeAddress, (const void *)jumpCode, targetCodeLength );
//
// 构造"门"代码, 维护宿主程序现场并调用 ourFuncitonAddr
//
gatewayCode[0] = 0x60;
gatewayCode[1] = 0xE8;
*(PDWORD)(gatewayCode+2) = ourFunctionAddress - (DWORD)(DWORD_PTR)(&(*gatewayCode)) - 1 - 1 - 4;
gatewayCode[6] = 0x61;
memcpy( (void *)(gatewayCode+7), backupCode, targetCodeLength );
gatewayCode[ 7 + targetCodeLength ] = 0xE9;
*(PDWORD)( gatewayCode + 7 + targetCodeLength + 1 )
= targetCodeAddress + targetCodeLength - (DWORD)(DWORD_PTR)(&(*gatewayCode)) - 7 - targetCodeLength - 1 - 4;
//
// 恢复权限, 释放相关资源
//
// 注意, 这里释放 backupCode, jumpCode, 不释放 gatewayCode
// gatewayCode 在我们的目的上生命期相当于静态变量, 所以不用删除, 程
// 序退出时操作系统会将其释放
//
VirtualProtect( (void *)(DWORD_PTR)targetCodeAddress, targetCodeLength, oldAttr, &tmpAttr );
delete[] backupCode;
delete[] jumpCode;
return 0xff;
}
//需要用到的一些自定义函数
inline BOOL IsemptySrt(LPTSTR Str)//empty return true测试字符串是否为空
{
CString StrTmp;
StrTmp.Insert(0, Str );
if( !StrTmp.IsEmpty() )
return false;
return true;
}
//改变指定窗口标题
inline void ChangeWindowTitle(HWND hwnd, LPTSTR DEF_Title,LPTSTR CG_Str )//改变成功 返回 TRUE 否则返回错误代码
{
if( DEF_Title == NULL )
{
::SetWindowText( hwnd, CG_Str);
}
LPTSTR Title_Tmp = new TCHAR[(_tcslen(DEF_Title)+_tcslen(CG_Str)+_tcslen(_T(" - ")) +1 )];
_stprintf_s( Title_Tmp, -1, _T("%s - %s"), DEF_Title, CG_Str);
SetWindowText( hwnd, Title_Tmp);
delete [] Title_Tmp;
}
//-------字 转换函数-----------------转换成功返回 TRUE 失败返回 FALSE
inline BOOL WcharToChar( LPTSTR lpWchar, LPSTR lpStr )
{
if(lpStr == NULL)
return ::WideCharToMultiByte(CP_ACP, 0, lpWchar, -1, NULL, 0, NULL, NULL);
int Str_len = ::WideCharToMultiByte(CP_ACP, 0, lpWchar, -1, NULL, 0, NULL, NULL);
LPSTR lpStr_tmp = new char[(Str_len+1)];
if( !::WideCharToMultiByte(CP_ACP, 0, lpWchar, -1, lpStr_tmp, Str_len+1, NULL, NULL) )
{
delete [] lpStr_tmp;
return false;
}
strcpy_s(lpStr, -1, lpStr_tmp);
delete [] lpStr_tmp;
return true;
}
inline BOOL CharToWchar(LPTSTR lpWchar, LPSTR lpStr)
{
if(lpWchar == NULL)
return ::MultiByteToWideChar( CP_ACP, 0, lpStr, -1, NULL, 0);
int Wchar_len = ::MultiByteToWideChar( CP_ACP, 0, lpStr, -1, NULL, 0);
LPTSTR lpWchar_tmp = new TCHAR[(Wchar_len + 1 )];
if( !::MultiByteToWideChar( CP_ACP, 0, lpStr, -1, lpWchar_tmp, Wchar_len+1) )
{
delete [] lpWchar_tmp;
return false;
}
wcscpy_s( lpWchar , -1 , lpWchar_tmp );
delete [] lpWchar_tmp;
return true;
}
///数字 字符串 转换成 DWORD
inline DWORD StringToDword( LPTSTR num_Str )
{
#ifdef _UNICODE
LPSTR num_Strtmp = NULL;
num_Strtmp = new char[( WcharToChar(num_Str, num_Strtmp) +1 )];
WcharToChar(num_Str, num_Strtmp);
int number = atoi(num_Strtmp);
delete [] num_Strtmp;
return number;
#else
return atoi(num_Str);
#endif
}
//获得本地IP
BOOL LocalHostToIP(CString* HostIp)
{
WORD wVersionRequested;
WSADATA wsaData;
CHAR bHostName[255];
TCHAR tHostIp[255];
HOSTENT* HostEnt;
wVersionRequested = MAKEWORD(2 , 2);
int err = WSAStartup(wVersionRequested , &wsaData );
if( err != 0 )
{
return false;
}
try
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -