Life & Code

代码是咒语,我是魔法师

远程线程插入,获得其它进程ListCtrl信息


因为进浩方玩星际,每次都要挤房间,所以做了一个挤房间的小工具.

VC7.1 工程下载

关键代码如下:

  1 typedef  struct  _remoteparameter
  2 {    
  3
  4     LVITEM  item;         // 用于SendMessage
  5     RECT    rect;
  6      int      iCount;         // 列表个数
  7      char     strFileMap[MAX_PATH];     // OpenFileMapping 
  8     HANDLE  hFileMap;     // OpenFileMapping 返回的句柄
  9     BYTE     * MapMem;     // MapViewOfFile 返回的共享内存始址
 10     HWND    hListHwnd;
 11      char     strItemText[ 256 ];
 12
 13      // DWORD   rpOutDebugString;
 14     DWORD   rpOpenFileMapping;    
 15     DWORD   rpMapViewOfFile;
 16     DWORD   rpSendMessage;
 17
 18 }
REMOTEPARAMETER,  * PREMOTEPARAMETER;
 19
 20 typedef  struct  _itemInfo
 21 {    
 22      char     strItemText[ 256 ];
 23      char     ipersonCount[ 20 ];
 24      char     strspeed[ 20 ];
 25     RECT    rect;
 26 }
ITEMINFO;
 27
 28 BOOL WINAPI MyInjectLib() 
 29 {
 30
 31     BOOL fOk  =  FALSE;  //  Assume that the function fails
 32     HANDLE hProcess  =  NULL, hThread  =  NULL;
 33      char *  pszLibFileRemote  =  NULL;
 34      char *  remotepar  =  NULL;
 35
 36     __try  {
 37          //  Get a handle for the target process.
 38         hProcess  =  g_hTargetProcess;
 39          //  Calculate the number of bytes needed for the DLL's pathname
 40          int  cb   =   4 * 1024  ;
 41
 42          //  Allocate space in the remote process for the pathname
 43         pszLibFileRemote  =  ( char *
 44             VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
 45          if  (pszLibFileRemote  ==  NULL) __leave;
 46
 47          //  Copy the DLL's pathname to the remote process's address space
 48          if  ( ! WriteProcessMemory(hProcess, pszLibFileRemote, 
 49             (LPVOID) remote, cb, NULL)) __leave;
 50
 51         REMOTEPARAMETER rp;
 52         memset(( char * ) & rp, 0 , sizeof (rp));
 53
 54         HANDLE hkernel32 = GetModuleHandle(_T( " kernel32.dll " ));
 55          if ( hkernel32  ==  NULL ) __leave;
 56         HANDLE huser32  =  GetModuleHandle(_T( " user32.dll " ));
 57          if ( huser32  ==  NULL ) __leave;
 58
 59
 60         rp.rpMapViewOfFile  =  (DWORD)GetProcAddress((HMODULE)hkernel32, " MapViewOfFile " ); 
 61         rp.rpOpenFileMapping  =  (DWORD)GetProcAddress((HMODULE)hkernel32, " OpenFileMappingA " ); 
 62         rp.rpSendMessage  =  (DWORD)GetProcAddress((HMODULE)huser32, " SendMessageA " ); 
 63          // rp.rpOutDebugString = (DWORD)GetProcAddress((HMODULE)hkernel32,"OutputDebugStringA"); 
 64
 65         strcpy(rp.strFileMap, " MMShare_EnterHF " );
 66         rp.hListHwnd  =  g_SysList;
 67         rp.iCount  =  g_itemCount;
 68         rp.item.cchTextMax  =   256 ;
 69         rp.item.iSubItem  =   0 ;
 70         rp.item.pszText  =  rp.strItemText;
 71         rp.item.mask  =   0 ;
 72
 73         cb = sizeof (rp);
 74         remotepar = ( char * )VirtualAllocEx(hProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE);
 75          if ( remotepar  ==  NULL)    __leave;
 76
 77          if ( ! WriteProcessMemory(hProcess,remotepar,(LPVOID) & rp,cb,NULL))        __leave;
 78
 79          //  Create a remote thread that calls LoadLibraryW(DLLPathname)Z
 80         hThread  =  CreateRemoteThread(hProcess, NULL,  0
 81             (LPTHREAD_START_ROUTINE)pszLibFileRemote,(LPVOID)remotepar,  0 , NULL);
 82          if  (hThread  ==  NULL) __leave;
 83
 84          //  Wait for the remote thread to terminate
 85         WaitForSingleObject(hThread, INFINITE);
 86
 87         fOk  =  TRUE;  //  Everything executed successfully
 88     }

 89     __finally  //  Now, we can clean everthing up
 90
 91          //  Free the remote memory that contained the DLL's pathname
 92          if  (pszLibFileRemote  !=  NULL) 
 93             VirtualFreeEx(hProcess, pszLibFileRemote,  0 , MEM_RELEASE);
 94
 95          if  (remotepar  !=  NULL) 
 96             VirtualFreeEx(hProcess, remotepar,  0 , MEM_RELEASE);
 97
 98          if  (hThread   !=  NULL) 
 99             CloseHandle(hThread);
100
101          if  (hProcess  !=  NULL) 
102             CloseHandle(hProcess);
103     }

104      return  TRUE;
105 }

106

  1 DWORD WINAPI remote(LPVOID pvparam)
  2 {
  3
  4    
  5     PREMOTEPARAMETER erp  =  ( PREMOTEPARAMETER)pvparam;
  6
  7     typedef LPVOID     (WINAPI     * defMapViewOfFile)(IN HANDLE hFileMappingObject,    
  8         IN DWORD dwDesiredAccess, 
  9         IN DWORD dwFileOffsetHigh,    
 10         IN DWORD dwFileOffsetLow,    
 11         IN SIZE_T dwNumberOfBytesToMap    );
 12     typedef HANDLE    (WINAPI     * defOpenFileMappingA)(IN DWORD dwDesiredAccess,    IN BOOL bInheritHandle,    IN LPCSTR lpName);
 13     typedef LRESULT    (WINAPI     * defSendMessageA)(IN HWND hWnd,    IN UINT Msg, IN WPARAM wParam,    IN LPARAM lParam);
 14     typedef VOID    (WINAPI  * defOutputDebugStringA)(IN LPCSTR lpOutputString);    
 15     defSendMessageA        MySendMsg  =  (defSendMessageA)erp -> rpSendMessage;
 16     defOpenFileMappingA MyOpenFileMapping  =  (defOpenFileMappingA)erp -> rpOpenFileMapping;
 17     defMapViewOfFile    MyMapViewOfFile  =  (defMapViewOfFile)erp -> rpMapViewOfFile;
 18    
 19
 20     erp -> hFileMap  =  ( * MyOpenFileMapping)(FILE_MAP_WRITE,  0 , erp -> strFileMap);
 21      if ( erp -> hFileMap  ==  NULL )
 22          return   0 ;
 23     erp -> MapMem  =  (BYTE * )( * MyMapViewOfFile)(erp -> hFileMap, FILE_MAP_WRITE,  0 0 0 );
 24      if ( erp -> MapMem  ==  NULL)
 25          return   0 ;
 26
 27      for ( int  i =   0 ; i < erp -> iCount; i ++  )
 28      {
 29           
 30         
 31         erp -> item.cchTextMax  =   256 ;
 32         
 33         
 34         erp -> item.iImage  =   0 ;
 35         erp -> item.iIndent  =   0 ;
 36         erp -> item.iItem   =   0 ;
 37         erp -> item.iSubItem  =   0 ;
 38         erp -> item.lParam  =   0 ;
 39         erp -> item.mask  =   0 ;
 40         erp -> item.pszText  =  erp -> strItemText;
 41         
 42         erp -> item.state  =   0 ;
 43         erp -> item.stateMask  =   0 ;
 44         erp -> rect.bottom  =  erp -> rect.left  =  erp -> rect.right  =  erp -> rect.top  =   0 ;
 45
 46         ( * MySendMsg)(erp -> hListHwnd, LVM_GETITEMTEXT, WPARAM(i), LPARAM( & erp -> item));
 47
 48         ITEMINFO  * info  =  (ITEMINFO  * ) & erp -> MapMem[i * sizeof (ITEMINFO)];
 49          for ( int  j =   0 ;j < 256 ;j ++ )
 50          {
 51             info -> strItemText[j]  =      erp -> item.pszText[j];
 52         }

 53
 54          // 取得人数
 55         erp -> item.cchTextMax  =   20 ;
 56         
 57        
 58         erp -> item.iImage  =   0 ;
 59         erp -> item.iIndent  =   0 ;
 60         erp -> item.iItem   =   0 ;
 61         erp -> item.iSubItem  =   1 ;
 62         erp -> item.lParam  =   0 ;
 63         erp -> item.mask  =   0 ;
 64         erp -> item.pszText  =  erp -> strItemText;
 65         
 66         erp -> item.state  =   0 ;
 67         erp -> item.stateMask  =   0 ;
 68         erp -> rect.bottom  =  erp -> rect.left  =  erp -> rect.right  =  erp -> rect.top  =   0 ;
 69
 70         ( * MySendMsg)(erp -> hListHwnd, LVM_GETITEMTEXT, WPARAM(i), LPARAM( & erp -> item));
 71
 72          for ( int  j =   0 ;j < 20 ;j ++ )
 73          {
 74             info -> ipersonCount[j]  =      erp -> item.pszText[j];
 75         }

 76
 77       
 78         erp -> item.cchTextMax  =   20 ;
 79         
 80         
 81         erp -> item.iImage  =   0 ;
 82         erp -> item.iIndent  =   0 ;
 83         erp -> item.iItem   =   0 ;
 84         erp -> item.iSubItem  =   3 ;
 85         erp -> item.lParam  =   0 ;
 86         erp -> item.mask  =   0 ;
 87         erp -> item.pszText  =  erp -> strItemText;
 88         
 89         erp -> item.state  =   0 ;
 90         erp -> item.stateMask  =   0 ;
 91         erp -> rect.bottom  =  erp -> rect.left  =  erp -> rect.right  =  erp -> rect.top  =   0 ;
 92
 93         ( * MySendMsg)(erp -> hListHwnd, LVM_GETITEMTEXT, WPARAM(i), LPARAM( & erp -> item));
 94
 95          for ( int  j =   0 ;j < 20 ;j ++ )
 96          {
 97             info -> strspeed[j]  =      erp -> item.pszText[j];
 98         }

 99
100          // 取得RECT
101         ( * MySendMsg)(erp -> hListHwnd, LVM_GETITEMRECT, WPARAM(i), LPARAM( & erp -> rect));
102         info -> rect.bottom  =  erp -> rect.bottom;
103         info -> rect.top  =  erp -> rect.top;
104         info -> rect.left  =  erp -> rect.left;
105         info -> rect.right  =  erp -> rect.right;
106     }

107
108      return   0 ;
109 }


 

posted on 2006-06-26 02:07 橙子 阅读(1033) 评论(0)  编辑 收藏 引用 所属分类: Win32


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2006年6月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

常用链接

留言簿(10)

随笔分类

随笔档案

相册

收藏夹

搜索

最新评论

阅读排行榜