ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>
1åQŒåƒæˆ‘这么爱òq²å‡€çš„ähåQŒå½“ç„¶ä¸èƒ½å®¹å¿å’ŒMMèŠå¤©çš„æ—¶å€™ï¼Œçœ‹åˆ°ä¸€ä¸ªå†…衣广告在上é¢ä¸€é—ªä¸€é—ªï¼Œ˜q™ä¸å¼•诱è€çº³ä¹ˆï¼›
2åQŒäؓ什么ä¸ç”¨å…¶å®ƒå¤–挂?çŠç‘šè™«å·²SåQŒå†æ²¡ç”¨˜q‡å…¶å®ƒã€‚çŽ°æœ‰çš„å¤–æŒ‚å®žçŽ°äº†ä¸€äº›æˆ‘ä¸æƒ³è¦çš„功能åQŒçœ‹IP也没必è¦åQŒèŠå¤©çš„都是熟äh。å¦å¤–,ä¸çŸ¥é“它åšäº†äº›ä»€ä¹ˆäº‹æƒ…ï¼›
3åQŒæ‰“å‘è¿™ä¸ªæ— èŠçš„周末ã€?br>
æ€Žæ ·å®žçŽ°åQ?br> 1åQŒä¸‡èƒ½çš„HOOK
现在用到的是全局的SHELL HOOKåQŒHook的是½H—å£åˆ›å¾å®Œæˆçš„æ¶ˆæ¯ï¼›
ShellHook 的实现如�
在收到窗å£åˆ›å»ºåŽçš„æ¶ˆæ¯æ—¶åQŒå°±åˆ¤æ–˜q™ä¸ª½H—壿˜¯ä¸æ˜¯QQçš?˜q™é‡Œç”¨åˆ°äº?GetWindowThreadProcessId åQŒå®ƒ˜q”回½H—å£ç›¸å…³çš„è¿›½E‹ID
ç„¶åŽæžšä‹D它的å窗å£ï¼Œçœ‹å®ƒçš„å½H—壿œ‰æ²¡æœ‰å¹¿å‘пާä»Óž¼Œæœ‰çš„è¯å°±¾l™å控äšgå‘é€ä¸ªWM_CLOSE的消æ?
å…¶ä¸çš„两个硬¾~–ç æ˜¯ç”¨ spy++ 分æžå‡ºæ¥çš„,å¯èƒ½å› äØ“ç‰ˆæœ¬çš„ä¸åŒï¼Œä¼šæœ‰å·®å¼‚。所以我ä¸ç¡®å®šèƒ½ä¸èƒ½å…³é—其它版本的QQòq¿å‘Šã€‚我使用的版本是QQ2008è´ºå²ç‰ˆã€?br>
--------------------------------------------------------------------------
åŽè®°:
ž®½ç®¡å®žçŽ°çš„æŠ€æœ¯å¾ˆ½Ž€å?但还是花了我大åŠå¤©çš„æ—‰™—´. 写完之åŽè§‰å¾—æžšä‹Då窗å£çš„æ–¹å¼å¤ªä½Žæ•? 或者还有其它高效点的方å¼ã€‚å¦å¤–还有全局钩å,å¯èƒ½æ²¡æœ‰å¿…è¦ã€‚如果下åˆå‘¨æœ«æŒ¾læ— èŠï¼Œæˆ‘会ž®è¯•改进一下ã€?br>
QQçš„èŠå¤©å¯¹è¯æ¡†å¾ˆç®€å?ä¸åƒMSNçš„å¯¹è¯æ¡†,铿¿ä¸€å?用spy++啥都看ä¸åˆ?但是å¯ä»¥ç”?AccExplorer 分æž.惛_œ¨MSNçš„å¯¹è¯æ¡†ä¸ŠåŠ ç‚¹ä¸œè¥¿è¿›åŽ»ï¼Œå®žçŽ°èµäh¥å¾ˆå›°éš¾ã€‚对˜q™æ–¹é¢æœ‰ç ”ç©¶çš„åŒå¦ä¸å¦¨ä¸Žæˆ‘讨è®ÞZ¸€ä¸‹å®žçŽŽÍ¼Œä¸€èµ·å¦ä¹ ã€è¿›æ¥ã€?br>
代ç 的行数没敎ͼŒæœ‰æ•ˆä»£ç 估计也就百把行å§åQŒå‘µå‘µï¼Œæˆ‘æ‰¿è®¤æˆ‘æ˜¯æ ‡é¢˜å…šã€?br>
é™? æºä»£ç ?+ bin
Â
class CW32Server
{
 TCHAR  m_szServerName[MAX_PATH];
 SC_HANDLE  m_hService;
 SC_HANDLE  m_hScm;
 SERVICE_STATUS ServiceStatus;
 BYTE  m_cfgBuf[4096];
public:
 CW32Server(void);
 CW32Server(const TCHAR *strServerName);Â
 BOOL   Open(const TCHAR *strServerName); Â
 /** ˜q”回状æ€?
  SERVICE_CONTINUE_PENDING The service continue is pending.
  SERVICE_PAUSE_PENDING The service pause is pending.
  SERVICE_PAUSED The service is paused.
  SERVICE_RUNNING The service is running.
  SERVICE_START_PENDING The service is starting.
  SERVICE_STOP_PENDING The service is stopping.
  SERVICE_STOPPED The service is not running.
 */
 DWORD GetState();    Â
 BOOL   SetState(DWORD state);
 BOOL   Start();
 BOOL   Stop();
 /**
  SERVICE_AUTO_START  A service started automatically by the service control manager during system startup.
  SERVICE_BOOT_START  A device driver started by the system loader. This value is valid only for driver services.
  SERVICE_DEMAND_START A service started by the service control manager when a process calls the StartService function.
  SERVICE_DISABLED  A service that cannot be started. Attempts to start the service result in the error code ERROR_SERVICE_DISABLED.
  SERVICE_SYSTEM_START
 */
 BOOL   GetConfig();   //如果˜q”回真,é…置状æ€å¡«å……在 m_config ä¸?
 SC_HANDLE   GetHandle();  //需è¦ç¦ç”¨ã€å¯åЍæœåŠ¡ï¼Œä½¿ç”¨ ChangeServiceConfig(GetHandle(),...)  查看MSDN
 ~CW32Server(void);
 QUERY_SERVICE_CONFIG *m_config;
};
#endif
/**
W32Server.cpp
http://m.shnenglu.com/lovelypigÂ Š™™å
*/
#include ".\w32server.h"
#include <assert.h>
CW32Server::CW32Server(void)
{
 memset((char*)&m_szServerName,0,sizeof(TCHAR)*MAX_PATH);
 memset((char*)&m_config,0,sizeof(m_config));
 m_hService = 0;
 m_hScm  = 0;
 m_config = (QUERY_SERVICE_CONFIG*)m_cfgBuf;
}
CW32Server::CW32Server(const TCHAR *strServerName)
{Â
 assert(strServerName);
 CW32Server();
 _tcscpy(m_szServerName,strServerName);Â
 m_hScm=OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE);
 if(!m_hScm)
 {
  return ;
 }
 m_hService=OpenService(m_hScm,strServerName,SERVICE_ALL_ACCESS);
 if(!m_hService)
 {
  CloseServiceHandle(m_hScm);
  m_hScm = NULL;
   }
}
CW32Server::~CW32Server(void)
{
 if( m_hScm )
 {
  CloseServiceHandle(m_hScm);
  m_hScm = NULL;
 }
 if( m_hService )
 {
  CloseServiceHandle(m_hService);
  m_hService = NULL;
 }
}
BOOLÂ Â CW32Server:: Open(const TCHAR *strServerName)
{
 assert(strServerName);
 if( m_hScm )
 {
  CloseServiceHandle(m_hScm);
  m_hScm = NULL;
 }
 if( m_hService )
 {
  CloseServiceHandle(m_hService);
  m_hService = NULL;
 }
 _tcscpy(m_szServerName,strServerName);Â
 m_hScm=OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE);
 if(!m_hScm)
 {
  return FALSE;
 }
 m_hService=OpenService(m_hScm,strServerName,SERVICE_ALL_ACCESS);
 if(!m_hService)
 {
  CloseServiceHandle(m_hScm);
  m_hScm = NULL;
  return FALSE;
 }
 return TRUE;
}
DWORDÂ CW32Server::GetState()
{Â
 assert(m_hService);
   if(QueryServiceStatus(m_hService,&ServiceStatus))
 {
  return ServiceStatus.dwCurrentState;
 }
 else
 {
  return 0xffffffff;
 }
}
BOOLÂ Â Â CW32Server::SetState(DWORD state)
{
 assert(m_hService);
 return ControlService(m_hService,state,&ServiceStatus);
}
BOOLÂ Â Â CW32Server::Start()
{
 assert(m_hService);
 return StartService(m_hService,0,NULL);
}
BOOLÂ Â Â CW32Server::Stop()
{
 assert(m_hService);
 return ControlService(m_hService,SERVICE_CONTROL_STOP,&ServiceStatus);
}
BOOLÂ Â Â CW32Server::GetConfig()
{
 assert(m_hService);
Â
 DWORD cbBufSize = 4096;
 DWORD pcbBytesNeeded = 4096;
 return QueryServiceConfig(m_hService,m_config,cbBufSize, &pcbBytesNeeded);
}
SC_HANDLEÂ CW32Server::GetHandle()
{
 assert(m_hService);
 return m_hService;
}
typedef int (CALLBACK* DHCPNOTIFYPROC)(LPWSTR, LPWSTR, BOOL, DWORD, DWORD, DWORD, int);
class CAdapter
{
 private:
  class ADAPTER_INFO
  {
    string strName;   // 适é…器å¿U?br />    string strDriverDesc; // 适é…器æ˜q?br />    string strIP;   // IP地å€
    string strSubnetMask;  // å网掩ç
    string strNetGate;  // ¾|‘å…³
    string strDNS;        //DNS
    string strMAC;
    ::MIB_IFROW IfRow;  //用于‹¹é‡,çŠ¶æ€æ˜¾½C?/p>
    BOOL  RegSetIP();
    BOOL  ChangeSysSet();
   Â
   public:
    void  SetInx(DWORD _dwpIndex) { IfRow.dwIndex = _dwpIndex; }
    //å–å¾—IPä¿¡æ¯
    string& GetName(){  return strName; }
    string& GetDriverDesc(){ return strDriverDesc; }
    string& GetIP(){ return strIP; }
    string& GetSubnetMask(){ return strSubnetMask; }
    string& GetNetGate(){ return strNetGate; }
    string& GetDNS(){ return strDNS; }
    string& GetMAC(){ return strMAC; }
   Â
    //å–得状æ€?‹¹é‡
    DWORD   GetState(){
     if(GetIfEntry(&IfRow) != NO_ERROR)
     {
      return 0;
     }
     /*
     #define MIB_IF_OPER_STATUS_NON_OPERATIONAL     0
     #define MIB_IF_OPER_STATUS_UNREACHABLE         1
     #define MIB_IF_OPER_STATUS_DISCONNECTED        2
     #define MIB_IF_OPER_STATUS_CONNECTING          3
     #define MIB_IF_OPER_STATUS_CONNECTED           4
     #define MIB_IF_OPER_STATUS_OPERATIONAL         5
     */
     return IfRow.dwOperStatus ;
    }
   Â
    DWORD   GetSendBytes(){
     if(GetIfEntry(&IfRow) != NO_ERROR)
     {
      return 0;
     }
     return IfRow.dwOutOctets;
    }
    DWORD   GetReceiveBytes(){
     if(GetIfEntry(&IfRow) != NO_ERROR)
     {
      return 0;
     } Â
     return IfRow.dwInOctets;
    }
    DWORD  GetSpeed(){
     if(GetIfEntry(&IfRow) != NO_ERROR)
     {
      return 0;
     }
     return IfRow.dwSpeed;
    }
    DWORD  GetOutUcastPkts(){
     if(GetIfEntry(&IfRow) != NO_ERROR)
     {
      return 0;
     }
     return IfRow.dwOutUcastPkts;
    }Â
    DWORD  GetOutNUcastPkts(){
     if(GetIfEntry(&IfRow) != NO_ERROR)
     {
      return 0;
     }
     return IfRow.dwOutNUcastPkts;
    }Â
    DWORD  GetInUcastPkts(){
     if(GetIfEntry(&IfRow) != NO_ERROR)
     {
      return 0;
     }
     return IfRow.dwInUcastPkts;
    }Â
    DWORD  GetInNUcastPkts(){
     if(GetIfEntry(&IfRow) != NO_ERROR)
     {
      return 0;
     }
     return IfRow.dwInNUcastPkts;
    }Â
    //讄¡½®IPä¿¡æ¯
    BOOL SetName(string _PstrName ,BOOL bChange = 0)  {Â
     strName = _PstrName ;
     if( bChange)
      return ChangeSysSet();
     return TRUE;
    }
    BOOL SetDriverDesc(string _PstrDriverDesc,BOOL bChange = 0){ Â
     strDriverDesc = _PstrDriverDesc;
     if( bChange)
      ChangeSysSet();
     return TRUE;
    }
    BOOL SetIP(string _PstrIP,BOOL bChange = 0){ Â
     strIP = _PstrIP ;
     if( bChange)
      ChangeSysSet();
     return TRUE;
    }
    BOOL SetSubnetMask(string _PstrSubnetMask,BOOL bChange = 0){ Â
     strSubnetMask = _PstrSubnetMask;
     if( bChange)
      ChangeSysSet();
     return TRUE;
    }
    BOOL SetNetGate(string _PstrNetGate,BOOL bChange = 0){Â
     strNetGate = _PstrNetGate;
     if( bChange)
      ChangeSysSet();
     return TRUE;
    }
    BOOL SetDNS(string strSetDNS = ""){
     if( !strSetDNS.length() )
     {
      HKEY hKey;
      DWORD dwType;
      char szReadBuf[64];
      DWORD cbData = 64;
      string strKeyName ="SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";
      strKeyName += this->strName;
      if(RegOpenKeyExA(HKEY_LOCAL_MACHINE,strKeyName.c_str(),0,
         KEY_READ,&hKey) != ERROR_SUCCESS)
      {
       return FALSE;
      }
      if( RegQueryValueExA(hKey,"NameServer",0,&dwType,(BYTE*)szReadBuf,&cbData) != ERROR_SUCCESS)
      {
       return FALSE;
      }
      RegCloseKey(hKey);
      strDNS = szReadBuf;
     }
     else
     {
      strDNS = strSetDNS;
      return ChangeSysSet();
     }
     return TRUE;
    }
    void SetMAC(BYTE *Address){Â
      char buf[6];
      for(int i= 0;i< 6;i++)
      {
       sprintf( buf,"%02x",Address[i]);
       strMAC += string(buf);
      }
      /*
      sprintf(pAI->mac, "%02X%02X%02X%02X%02X%02X",
       int (pAdapterInfo->Address[0]),
       int (pAdapterInfo->Address[1]),
       int (pAdapterInfo->Address[2]),
       int (pAdapterInfo->Address[3]),
       int (pAdapterInfo->Address[4]),
       int (pAdapterInfo->Address[5]));
      */
    }
  };
 vector<ADAPTER_INFO> m_AdapterVec;
 public:
  CAdapter(void);
  ~CAdapter(void);
  size_t GetAdapterCount ()
  {
   return m_AdapterVec.size();
  }
  ADAPTER_INFO& operator[](DWORD iInx)
  {
   assert(iInx < m_AdapterVec.size());
   return m_AdapterVec[iInx];
  }
};
#endif
//åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼åQï¼
//Adapter_.cpp
#include ".\adapter_.h"
CAdapter::CAdapter(void)
{
 DWORD ulAdapterInfoSize = sizeof(IP_ADAPTER_INFO);
 IP_ADAPTER_INFO *pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize];
 if( GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_BUFFER_OVERFLOW ) // ¾~“冲åŒÞZ¸å¤Ÿå¤§
 {
  delete pAdapterInfo;
  pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize];
 }
 if( GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_SUCCESS )
 {
  do {
   if (pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET)
   {
    ADAPTER_INFO *pAI = new ADAPTER_INFO;
    pAI->SetInx(pAdapterInfo->Index);
    pAI->SetName(pAdapterInfo->AdapterName);
    pAI->SetDriverDesc(pAdapterInfo->Description);
    pAI->SetMAC(pAdapterInfo->Address);
    pAI->SetIP(pAdapterInfo->IpAddressList.IpAddress.String);
    pAI->SetNetGate(pAdapterInfo->GatewayList.IpAddress.String);
    pAI->SetSubnetMask(pAdapterInfo->IpAddressList.IpMask.String);
    pAI->SetDNS();
    m_AdapterVec.push_back(*pAI);
   }
   pAdapterInfo = pAdapterInfo->Next;
  } while(pAdapterInfo);
 }
 delete pAdapterInfo;
}
CAdapter::~CAdapter(void)
{
 m_AdapterVec.clear();
}
BOOL CAdapter::ADAPTER_INFO::ChangeSysSet()
{
 //在注册表ä¸ä¿®æ”¹ä¿¡æ?br /> if(!RegSetIP())
 {
  return FALSE;
 }
 HINSTANCE  hDhcpDll;
 DHCPNOTIFYPROC pDhcpNotifyProc;
 WCHAR wcAdapterName[256];
 MultiByteToWideChar(CP_ACP, 0, this->strName.c_str(), -1, wcAdapterName,256);
 if((hDhcpDll = LoadLibraryA("dhcpcsvc")) == NULL)
 {
  return FALSE;
 }
 if((pDhcpNotifyProc = (DHCPNOTIFYPROC)GetProcAddress(hDhcpDll, "DhcpNotifyConfigChange")) != NULL)
 {
  if((pDhcpNotifyProc)(NULL, wcAdapterName, TRUE,
   0,    //指明½W¬å‡ 个IP地å€åQŒå¦‚æžœåªæœ‰è¯¥æŽ¥å£åªæœ‰ä¸€ä¸ªIP地å€åˆ™äØ“0
   inet_addr(strIP.c_str()), //
   inet_addr(strSubnetMask.c_str()),
   0    //对DHCPçš„æ“ä½?0:ä¸ä¿®æ”? 1:å¯ç”¨ DHCPåQ?:¼›ç”¨ DHCP
   ) != ERROR_SUCCESS)
  {
   FreeLibrary(hDhcpDll);
   return FALSE;
  }
  FreeLibrary(hDhcpDll);
 }
 return TRUE;
}
BOOL CAdapter::ADAPTER_INFO::RegSetIP()
{
 HKEY hKey;
 string strKeyName ="SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";
 strKeyName += strName;
 if(RegOpenKeyExA(HKEY_LOCAL_MACHINE,
  strKeyName.c_str(),
  0,
  KEY_WRITE,
  &hKey) != ERROR_SUCCESS)
 {
  return FALSE;
 }
 strIP.push_back('\0');
 strSubnetMask.push_back('\0');
 strNetGate.push_back('\0');
 RegSetValueExA(hKey, "IPAddress", 0, REG_MULTI_SZ, (unsigned char*)strIP.data(), (DWORD)strIP.length()+2);
 RegSetValueExA(hKey, "SubnetMask", 0, REG_MULTI_SZ, (unsigned char*)strSubnetMask.data(),(DWORD)strSubnetMask.length()+2 );
 RegSetValueExA(hKey, "DefaultGateway", 0, REG_MULTI_SZ, (unsigned char*)strNetGate.data(), (DWORD)strNetGate.length()+2);
 RegSetValueExA(hKey, "NameServer", 0, REG_SZ, (unsigned char*)strDNS.data(),(DWORD) strDNS.length());
 RegCloseKey(hKey);
 return TRUE;
}