⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 allmycode.cpp

📁 让传奇3服务端支持动态域名的插件。VS2005的工程。这个是LOGINSER的插件。要和DBSER插件一起使用。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -