找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3859|回复: 0

[原]VC++信息安全编程(13)实现扫描内存,实现内存读写

[复制链接]
发表于 2012-3-8 15:01:55 | 显示全部楼层 |阅读模式
扫描内存,实现内存读写是杀毒软件必备的功能,这个功能如何实现呢,
请见代码实现与分析
调用美国大牛写的PSAPI.DLL
  1. #include "stdafx.h"
  2. #include "DoProcess.h"
  3. #include "DoProcessDlg.h"
  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #undef THIS_FILE
  7. static char THIS_FILE[] = __FILE__;
  8. #endif
  9. char ch[]="zhao1234";
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CDoProcessDlg dialog
  12. CDoProcessDlg::CDoProcessDlg(CWnd* pParent /*=NULL*/)
  13.         : CDialog(CDoProcessDlg::IDD, pParent)
  14. {
  15.         //{{AFX_DATA_INIT(CDoProcessDlg)
  16.         m_Code = _T("zhao1234");
  17.         m_Ebase = _T("");
  18.         m_Esize = _T("");
  19.         m_Eaddress = _T("");
  20.         m_Edata = _T("");
  21.         m_EAdd_Change = _T("");
  22.         //}}AFX_DATA_INIT
  23.         // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  24.         m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  25. }
  26. void CDoProcessDlg::DoDataExchange(CDataExchange* pDX)
  27. {
  28.         CDialog::DoDataExchange(pDX);
  29.         //{{AFX_DATA_MAP(CDoProcessDlg)
  30.         DDX_Control(pDX, IDC_LIST2, m_list);
  31.         DDX_Control(pDX, IDC_ScanProcess, m_Scan);
  32.         DDX_Text(pDX, IDC_Code, m_Code);
  33.     DDX_Control(pDX, IDC_LIST1, m_lCtrl);
  34.         DDX_Text(pDX, IDC_Ebase, m_Ebase);
  35.         DDX_Text(pDX, IDC_Esize, m_Esize);
  36.         DDV_MaxChars(pDX, m_Esize, 2000);
  37.         DDX_Text(pDX, IDC_Eaddress, m_Eaddress);
  38.         DDX_Text(pDX, IDC_Edata, m_Edata);
  39.         DDX_Text(pDX, IDC_EAdd_Change, m_EAdd_Change);
  40.         //}}AFX_DATA_MAP
  41. }
  42. BEGIN_MESSAGE_MAP(CDoProcessDlg, CDialog)
  43.         //{{AFX_MSG_MAP(CDoProcessDlg)
  44.         ON_WM_PAINT()
  45.         ON_WM_QUERYDRAGICON()
  46.         ON_BN_CLICKED(IDC_GetProcess, OnGetProcess)
  47.         ON_BN_CLICKED(IDC_GetProcess2, OnGetProcess2)
  48.         ON_BN_CLICKED(IDC_KillProcess, OnKillProcess)
  49.         ON_BN_CLICKED(IDC_ScanProcess, OnScanProcess)
  50.         ON_BN_CLICKED(IDC_ReadMem, OnReadMem)
  51.         ON_EN_CHANGE(IDC_Code, OnChangeCode)
  52.         ON_EN_CHANGE(IDC_Ebase, OnChangeEbase)
  53.         ON_EN_CHANGE(IDC_Esize, OnChangeEsize)
  54.         ON_NOTIFY(NM_DBLCLK, IDC_LIST1, OnDblclkList1)
  55.         ON_EN_CHANGE(IDC_Eaddress, OnChangeEaddress)
  56.         ON_EN_CHANGE(IDC_Edata, OnChangeEdata)
  57.         ON_BN_CLICKED(IDC_BWriteMem, OnBWriteMem)
  58.         ON_BN_CLICKED(IDC_BEnumAllDLL, OnBEnumAllDLL)
  59.         ON_BN_CLICKED(IDC_BChangeAttr, OnBChangeAttr)
  60.         ON_EN_CHANGE(IDC_EAdd_Change, OnChangeEAddChange)
  61.         ON_BN_CLICKED(IDC_BgetModule, OnBgetModule)
  62.         ON_BN_CLICKED(IDC_BGetAllDLL2, OnBGetAllDLL)
  63.         //}}AFX_MSG_MAP
  64. END_MESSAGE_MAP()
  65. /////////////////////////////////////////////////////////////////////////////
  66. // CDoProcessDlg message handlers
  67. BOOL CDoProcessDlg::OnInitDialog()
  68. {
  69.         CDialog::OnInitDialog();
  70.         // Set the icon for this dialog.  The framework does this automatically
  71.         //  when the application's main window is not a dialog
  72.         SetIcon(m_hIcon, TRUE);                        // Set big icon
  73.         SetIcon(m_hIcon, FALSE);                // Set small icon
  74.         // TODO: Add extra initialization here
  75.     ListView_SetExtendedListViewStyleEx(m_lCtrl.m_hWnd, LVS_EX_FULLROWSELECT|
  76.                 LVS_SORTDESCENDING, 0xFFFFFFFF);        
  77.     m_lCtrl.InsertColumn(0,"序号",HDF_LEFT,50,0);
  78.     m_lCtrl.InsertColumn(1,"进程ID",HDF_LEFT,60,0);       
  79.     m_lCtrl.InsertColumn(2,"路径",HDF_LEFT,560,0);       
  80.     m_lCtrl.InsertColumn(3,"基地址",HDF_LEFT,60,0);
  81.        
  82.         return TRUE;  // return TRUE  unless you set the focus to a control
  83. }
  84. // If you add a minimize button to your dialog, you will need the code below
  85. //  to draw the icon.  For MFC applications using the document/view model,
  86. //  this is automatically done for you by the framework.
  87. void CDoProcessDlg::OnPaint()
  88. {
  89.         if (IsIconic())
  90.         {
  91.                 CPaintDC dc(this); // device context for painting
  92.                 SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  93.                 // Center icon in client rectangle
  94.                 int cxIcon = GetSystemMetrics(SM_CXICON);
  95.                 int cyIcon = GetSystemMetrics(SM_CYICON);
  96.                 CRect rect;
  97.                 GetClientRect(&rect);
  98.                 int x = (rect.Width() - cxIcon + 1) / 2;
  99.                 int y = (rect.Height() - cyIcon + 1) / 2;
  100.                 // Draw the icon
  101.                 dc.DrawIcon(x, y, m_hIcon);
  102.         }
  103.         else
  104.         {
  105.                 CDialog::OnPaint();
  106.         }
  107. }
  108. // The system calls this to obtain the cursor to display while the user drags
  109. //  the minimized window.
  110. HCURSOR CDoProcessDlg::OnQueryDragIcon()
  111. {
  112.         return (HCURSOR) m_hIcon;
  113. }
  114. void CDoProcessDlg::OnGetProcess()
  115. {
  116. m_list.ResetContent();
  117. m_lCtrl.DeleteAllItems();
  118. DWORD aProcesses[1024], cbNeeded, cProcesses;
  119. unsigned int i;
  120. //枚举系统进程ID列表
  121. if(!EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )return;
  122. // Calculate how many process identifiers were returned.
  123. //计算进程数量
  124. cProcesses = cbNeeded / sizeof(DWORD);
  125. // 输出每个进程的名称和ID
  126. for ( i = 0; i < cProcesses; i++ )PrintProcessNameAndID( aProcesses[i],i);
  127. }
  128. void CDoProcessDlg::PrintProcessNameAndID( DWORD processID ,int n)
  129. {
  130. char szProcessName[MAX_PATH] = "unknown";
  131. //取得进程的句柄
  132. HANDLE hProcess=OpenProcess( PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,processID);
  133. //取得进程名称
  134. if ( hProcess )
  135. {
  136. HMODULE hMod;
  137. DWORD cbNeeded;
  138. if(EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
  139.   //GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) );
  140. //该函数得到进程文件名
  141.   GetModuleFileNameEx(hProcess,hMod,szProcessName, sizeof(szProcessName));
  142. //该函数得到进程全文件名路径
  143. //回显进程名称和ID
  144. CString inf0,inf1,inf2,inf3;
  145. CFile fp;
  146. if(fp.Open(szProcessName,CFile::modeRead)){
  147.         IMAGE_DOS_HEADER      dos_header;
  148.         IMAGE_NT_HEADERS      nt_header;
  149.         fp.Read(&dos_header,sizeof(dos_header));
  150.         fp.Seek(dos_header.e_lfanew,CFile::begin);
  151.     fp.Read(&nt_header,sizeof(nt_header));
  152.         fp.Close();
  153.     inf3.Format("%X",nt_header.OptionalHeader.ImageBase);
  154. }
  155. else inf3="unknown";
  156. inf0.Format("%d",n);
  157. inf1.Format("%s",szProcessName);
  158. inf2.Format("%d",processID);
  159. m_lCtrl.InsertItem(0,"");//插入行
  160. m_lCtrl.SetItemText(0,0,inf0);
  161. m_lCtrl.SetItemText(0,1,inf2);//设置该行的不同列的显示字符
  162. m_lCtrl.SetItemText(0,2,inf1);
  163. m_lCtrl.SetItemText(0,3,inf3);
  164. CloseHandle( hProcess );
  165. }
  166. }
  167. void CDoProcessDlg::OnGetProcess2()
  168. {
  169. //m_List.ResetContent();
  170. //m_ListID.ResetContent();
  171. CString inf;
  172. HANDLE hProcessSnap = NULL;
  173. PROCESSENTRY32 pe32= {0};
  174. hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  175. if (hProcessSnap == (HANDLE)-1)
  176. {
  177. AfxMessageBox("不能建立快照");
  178.   return ;
  179. }
  180. pe32.dwSize = sizeof(PROCESSENTRY32);
  181. if (Process32First(hProcessSnap, &pe32))
  182. {
  183.    do{
  184.    inf.Format("%s",pe32.szExeFile);
  185. //   m_List.AddString(inf);
  186.    inf.Format("%d",pe32.th32ProcessID);
  187. //   m_ListID.AddString(inf);
  188. }
  189. while (Process32Next(hProcessSnap, &pe32));
  190. }
  191.    else{
  192. //   printf("\nProcess32Firstt() failed:%d",GetLastError());
  193.    }
  194. CloseHandle (hProcessSnap);
  195. }
  196. BOOL CDoProcessDlg::KillProcess(DWORD pid, BOOL bZap)
  197. {
  198.   CString inf;
  199. HANDLE hProcess=NULL,hProcessToken=NULL;
  200. OSVERSIONINFO ver;
  201. ver.dwOSVersionInfoSize=sizeof(ver);//必须的,否则不正确
  202. if(!GetVersionEx(&ver)){
  203.    AfxMessageBox("无法判断当前操作系统");
  204.    return 0;    }
  205. if(ver.dwPlatformId==VER_PLATFORM_WIN32_NT){  //为NT,2000,XP
  206. //杀死所有进程包括服务,在2000以上需要提升权限
  207. //打开某个进程的访问令牌,第一个参数为进程句柄,第二个参数为访问权限,
  208. //第三个参数为函数输出的用来调整权限的句柄
  209.   if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hProcessToken))
  210.   {
  211.    AfxMessageBox("打开本进程访问令牌失败!");
  212.   return 0;
  213.   }
  214. //SE_DEBUG_NAME 为要求调试进程的权限
  215.   if(!SetPrivilege(hProcessToken,SE_DEBUG_NAME,TRUE))
  216.   {
  217.     AfxMessageBox("设置权限错误!");
  218.    return 0;
  219. }
  220.   if((hProcess=OpenProcess(PROCESS_TERMINATE,FALSE,pid))==NULL)
  221.   {
  222.   m_list.AddString("打开进程失败");
  223.   return 0;
  224.   }
  225.   if(TerminateProcess(hProcess,1))m_list.AddString("杀死进程成功\n");
  226.   else m_list.AddString("不能杀死进程\n");
  227. }
  228.   else{//是95,98操作系统
  229.    hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, DWORD(pid));
  230.   if(TerminateProcess(hProcess,1))m_list.AddString("杀死进程成功\n");
  231.   else m_list.AddString("不能杀死进程\n");
  232. }
  233.      CloseHandle(hProcess);
  234. return 1;
  235. }
  236. void CDoProcessDlg::OnKillProcess()
  237. {
  238. char path[256],pID[18];
  239. POSITION pos = m_lCtrl.GetFirstSelectedItemPosition();
  240. if(pos==NULL){
  241.         AfxMessageBox("请选择进程!");
  242.         return;   
  243. }
  244. int m_nIndex = m_lCtrl.GetNextSelectedItem(pos);  // 得到项目索引
  245. m_lCtrl.GetItemText(m_nIndex, 2, path, 256 );
  246. m_lCtrl.GetItemText(m_nIndex, 1, pID, 18 );       
  247. DWORD processID=(DWORD)atoi((char*)pID);
  248. KillProcess(processID,TRUE);
  249. OnGetProcess2();
  250. }
  251. BOOL CDoProcessDlg::SetPrivilege(HANDLE hToken,LPCTSTR lpszPrivilege,BOOL bEnablePrivilege)
  252. {
  253. TOKEN_PRIVILEGES tp;//包含访问令牌的权限设置信息
  254. LUID luid;//局部唯一ID值
  255. //第一个参数是系统名,为NULL,表示在本地系统查询;
  256. //第二个参数为要查询的权限名,定义在文件 Winnt.h 中
  257. //如果成功,返回值为非0,其在系统中的 ID 值为第三个参数所指
  258. if(!LookupPrivilegeValue(NULL,lpszPrivilege,&luid))
  259. {
  260.   AfxMessageBox("查询权限值错误");
  261. return FALSE;
  262. }
  263. tp.PrivilegeCount = 1; //权限列的个数
  264. tp.Privileges[0].Luid = luid;
  265. if (bEnablePrivilege)
  266. tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; //使能权限
  267. else
  268. tp.Privileges[0].Attributes = 0;
  269. //设置 luid 进程的权限
  270. AdjustTokenPrivileges(
  271.   hToken,
  272.   FALSE,
  273.   &tp,
  274.   sizeof(TOKEN_PRIVILEGES),
  275.   (PTOKEN_PRIVILEGES) NULL,
  276.   (PDWORD) NULL);
  277. if (GetLastError() != ERROR_SUCCESS)
  278. {
  279. AfxMessageBox("调整权限失败");
  280. return FALSE;
  281. }
  282. return TRUE;
  283. }
  284. void CDoProcessDlg::OnScanProcess()
  285. {
  286. UpdateData();
  287. if(m_Code==""){
  288.         AfxMessageBox("请选择特征字符!");
  289.         return;
  290. }
  291. char path[256],pID[18];
  292. POSITION pos = m_lCtrl.GetFirstSelectedItemPosition();
  293. if(pos==NULL){
  294.         AfxMessageBox("请选择进程!");
  295.         return;   
  296. }
  297. int m_nIndex = m_lCtrl.GetNextSelectedItem(pos);  // 得到项目索引
  298. m_lCtrl.GetItemText(m_nIndex, 2, path, 256 );
  299. m_lCtrl.GetItemText(m_nIndex, 1, pID, 18 );       
  300. DWORD processID=(DWORD)atoi((char*)pID);
  301. BYTE *ptr=NULL;
  302. ::EnableWindow(m_Scan.m_hWnd,FALSE);
  303. HANDLE hprocess=NULL,hProcessToken=NULL;
  304. OSVERSIONINFO ver;
  305. ver.dwOSVersionInfoSize=sizeof(ver);//必须的,否则不正确
  306. if(!GetVersionEx(&ver)){
  307.      ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  308.    AfxMessageBox("无法判断当前操作系统");
  309.    return  ;    }
  310. if(ver.dwPlatformId==VER_PLATFORM_WIN32_NT){  //为NT,2000,XP
  311. //杀死所有进程包括服务,在2000以上需要提升权限
  312. //打开某个进程的访问令牌,第一个参数为进程句柄,第二个参数为访问权限,
  313. //第三个参数为函数输出的用来调整权限的句柄
  314.   if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hProcessToken))
  315.   {
  316.      ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  317.    AfxMessageBox("打开本进程访问令牌失败!");
  318.   return  ;
  319.   }
  320. //SE_DEBUG_NAME 为要求调试进程的权限
  321.   if(!SetPrivilege(hProcessToken,SE_DEBUG_NAME,TRUE))
  322.   {
  323.           ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  324.     AfxMessageBox("设置权限错误!");
  325.    return  ;
  326.   }
  327. }
  328. if((hprocess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,processID))==NULL)
  329.   {
  330.     AfxMessageBox("打开进程失败");
  331.                 ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  332.         return;
  333.   }
  334.     BOOL re=FALSE;
  335.     DWORD base=0x400000,min=base,max=base;
  336.         IMAGE_DOS_HEADER      dos_header;
  337.         IMAGE_NT_HEADERS      nt_header;
  338.     IMAGE_SECTION_HEADER  section_header[16];
  339.     memset(&dos_header,0,sizeof(dos_header));
  340.     memset(&nt_header,0,sizeof(nt_header));
  341.     memset(section_header,0,16*sizeof(IMAGE_SECTION_HEADER));
  342.         re=ReadProcessMemory(hprocess,(LPVOID)base,&dos_header,sizeof(dos_header),NULL);
  343.         base+=dos_header.e_lfanew;
  344.         ReadProcessMemory(hprocess,(LPVOID)base,&nt_header,sizeof(nt_header),NULL);
  345.     if(re==FALSE||nt_header.FileHeader.NumberOfSections==0){
  346.       base=max=min=0x1000000;  //有的基本地址为0x400000,有的为0x1000000
  347.       memset(&dos_header,0,sizeof(dos_header));
  348.           re=ReadProcessMemory(hprocess,(LPVOID)base,&dos_header,sizeof(dos_header),NULL);
  349.           base+=dos_header.e_lfanew;
  350.           ReadProcessMemory(hprocess,(LPVOID)base,&nt_header,sizeof(nt_header),NULL);
  351.         }
  352.     if(re==FALSE||nt_header.FileHeader.NumberOfSections==0){
  353.                 AfxMessageBox("扫描失败");
  354.                   ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  355.         return;                        }
  356.     base+=sizeof(nt_header);
  357.         ReadProcessMemory(hprocess,(LPVOID)base,§ion_header,\
  358.                 nt_header.FileHeader.NumberOfSections*sizeof(IMAGE_SECTION_HEADER),NULL);
  359.     min+=section_header[0].VirtualAddress;
  360.     max+=section_header[nt_header.FileHeader.NumberOfSections-1].VirtualAddress
  361.                   +section_header[nt_header.FileHeader.NumberOfSections-1].SizeOfRawData;
  362.   ptr=new BYTE[max-min];
  363.   if(!ptr){
  364.           ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  365.     AfxMessageBox("内存不够");
  366.     return;
  367.   }
  368.   if(!ReadProcessMemory(hprocess,(LPVOID)min,ptr,max-min,NULL)){
  369.                 ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  370.                   AfxMessageBox("读内存错误!");
  371.                   return;    }
  372. CString inf="";
  373. CString inf2;
  374. re=FALSE;
  375.   for(DWORD j=0;j<max-min-7;j++){
  376.           if(!strcmp((char *)(ptr+j),(char*)m_Code.GetBuffer(0))){
  377.                           inf="找到了:";
  378.                           inf2.Format(" %8x,",min+j);
  379.               inf+=inf2;
  380.                           re=TRUE;
  381.                   }
  382.             }
  383. if(re==FALSE)inf="没有找到";
  384. AfxMessageBox(inf);
  385.    if(hprocess)CloseHandle(hprocess);
  386.    ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  387. }
  388. void CDoProcessDlg::OnReadMem()
  389. {
  390. char path[256],pID[18],based[20];
  391. POSITION pos = m_lCtrl.GetFirstSelectedItemPosition();
  392. if(pos==NULL){
  393.         AfxMessageBox("请选择进程!");
  394.         return;   
  395. }
  396. int m_nIndex = m_lCtrl.GetNextSelectedItem(pos);  // 得到项目索引
  397. m_lCtrl.GetItemText(m_nIndex, 2, path, 256 );
  398. m_lCtrl.GetItemText(m_nIndex, 1, pID, 18 );       
  399. m_lCtrl.GetItemText(m_nIndex, 3, based, 20 );       
  400. CString sbase=based;
  401. if(sbase=="unknown"){
  402.         AfxMessageBox("超级进程,无法读!");
  403.         return;   
  404. }
  405. DWORD processID=(DWORD)atoi((char*)pID);
  406. HANDLE hprocess=NULL,hProcessToken=NULL;
  407. OSVERSIONINFO ver;
  408. ver.dwOSVersionInfoSize=sizeof(ver);//必须的,否则不正确
  409. if(!GetVersionEx(&ver)){
  410.      ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  411.    AfxMessageBox("无法判断当前操作系统");
  412.    return  ;    }
  413. if(ver.dwPlatformId==VER_PLATFORM_WIN32_NT){  //为NT,2000,XP
  414. //杀死所有进程包括服务,在2000以上需要提升权限
  415. //打开某个进程的访问令牌,第一个参数为进程句柄,第二个参数为访问权限,
  416. //第三个参数为函数输出的用来调整权限的句柄
  417.   if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hProcessToken))
  418.   {
  419.      ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  420.    AfxMessageBox("打开本进程访问令牌失败!");
  421.   return  ;
  422.   }
  423. //SE_DEBUG_NAME 为要求调试进程的权限
  424.   if(!SetPrivilege(hProcessToken,SE_DEBUG_NAME,TRUE))
  425.   {
  426.           ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  427.     AfxMessageBox("设置权限错误!");
  428.    return  ;
  429.   }
  430. }
  431. if((hprocess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,processID))==NULL)
  432.   {
  433.     AfxMessageBox("打开进程失败");
  434.                 ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  435.         return;
  436.   }
  437.     BOOL re=FALSE;
  438.     DWORD base=0x400000;
  439.         if(sbase=="400000")base=0x400000;
  440.         if(sbase=="1000000")base=0x1000000;
  441.     int len=m_Ebase.GetLength();
  442.         m_Ebase.MakeUpper();
  443.         DWORD data=0;
  444.         for(int val=len-1;val>=0;val--){
  445.           if(((char*)m_Ebase.GetBuffer(0))[val]<=(char)'9')
  446.                   data+=((DWORD)((char*)m_Ebase.GetBuffer(0)[val]-0x30)<<((len-val-1)*4));
  447.           else
  448.                   data+=((DWORD)((char*)m_Ebase.GetBuffer(0)[val]-0x41+10)<<((len-val-1)*4));
  449.       }
  450.         base+=data;
  451. //   CString in;
  452. //        in.Format("data=%X",data);
  453. //        AfxMessageBox(in);
  454.     BYTE *ptr=new BYTE[1024];
  455.         memset(ptr,0,1024);
  456.         re=ReadProcessMemory(hprocess,(LPVOID)base,ptr,1024,NULL);
  457.         if(re==FALSE){
  458.       AfxMessageBox("读内存失败");
  459.       return;
  460.         }
  461.     CFile fp;
  462.         fp.Open("c:\\mem.dat",CFile::modeCreate|CFile::modeWrite);
  463.     fp.Write(ptr,1024);
  464.     fp.Close();
  465.     if(hprocess)CloseHandle(hprocess);
  466. }
  467. void CDoProcessDlg::OnChangeCode()
  468. {
  469. UpdateData();
  470. }
  471. void CDoProcessDlg::OnChangeEbase()
  472. {
  473. UpdateData();
  474. }
  475. void CDoProcessDlg::OnChangeEsize()
  476. {
  477. UpdateData();
  478. }
  479. void CDoProcessDlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)
  480. {
  481. /*
  482. char lpszText[256];
  483. POSITION pos = m_lCtrl.GetFirstSelectedItemPosition();
  484. int m_nIndex = m_lCtrl.GetNextSelectedItem(pos);  // 得到项目索引
  485. m_lCtrl.GetItemText(m_nIndex, 2, lpszText, 256 );
  486. //   wsprintf(lpszText,"id=%d,%s",m_nIndex);
  487.         AfxMessageBox(lpszText);
  488. */
  489.   *pResult = 0;
  490. }
  491. void CDoProcessDlg::OnChangeEaddress()
  492. {
  493. UpdateData();
  494. }
  495. void CDoProcessDlg::OnChangeEdata()
  496. {
  497. UpdateData();
  498. }
  499. void CDoProcessDlg::OnBWriteMem()
  500. {
  501. char path[256],pID[18],based[20];
  502. POSITION pos = m_lCtrl.GetFirstSelectedItemPosition();
  503. if(pos==NULL){
  504.         AfxMessageBox("请选择进程!");
  505.         return;   
  506. }
  507. int m_nIndex = m_lCtrl.GetNextSelectedItem(pos);  // 得到项目索引
  508. m_lCtrl.GetItemText(m_nIndex, 2, path, 256 );
  509. m_lCtrl.GetItemText(m_nIndex, 1, pID, 18 );       
  510. m_lCtrl.GetItemText(m_nIndex, 3, based, 20 );       
  511. CString sbase=based;
  512. if(sbase=="unknown"){
  513.         AfxMessageBox("超级进程,无法读!");
  514.         return;   
  515. }
  516. DWORD processID=(DWORD)atoi((char*)pID);
  517. HANDLE hprocess=NULL,hProcessToken=NULL;
  518. OSVERSIONINFO ver;
  519. ver.dwOSVersionInfoSize=sizeof(ver);//必须的,否则不正确
  520. if(!GetVersionEx(&ver)){
  521.      ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  522.    AfxMessageBox("无法判断当前操作系统");
  523.    return  ;    }
  524. if(ver.dwPlatformId==VER_PLATFORM_WIN32_NT){  //为NT,2000,XP
  525. //杀死所有进程包括服务,在2000以上需要提升权限
  526. //打开某个进程的访问令牌,第一个参数为进程句柄,第二个参数为访问权限,
  527. //第三个参数为函数输出的用来调整权限的句柄
  528.   if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hProcessToken))
  529.   {
  530.      ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  531.    AfxMessageBox("打开本进程访问令牌失败!");
  532.   return  ;
  533.   }
  534. //SE_DEBUG_NAME 为要求调试进程的权限
  535.   if(!SetPrivilege(hProcessToken,SE_DEBUG_NAME,TRUE))
  536.   {
  537.           ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  538.     AfxMessageBox("设置权限错误!");
  539.    return  ;
  540.   }
  541. }
  542. if((hprocess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,processID))==NULL)
  543.   {
  544.     AfxMessageBox("打开进程失败");
  545.                 ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  546.         return;
  547.   }
  548.     BOOL re=FALSE;
  549.     DWORD base=0x400000;
  550.         if(sbase=="400000")base=0x400000;
  551.         if(sbase=="1000000")base=0x1000000;
  552.     CString in;
  553.     int len=m_Eaddress.GetLength();
  554.         m_Eaddress.MakeUpper();
  555.         DWORD data=0;
  556.         for(int val=len-1;val>=0;val--){
  557.           if(((char*)m_Eaddress.GetBuffer(0))[val]<=(char)'9')
  558.                   data+=((DWORD)((char*)m_Eaddress.GetBuffer(0)[val]-0x30)<<((len-val-1)*4));
  559.           else
  560.                   data+=((DWORD)((char*)m_Eaddress.GetBuffer(0)[val]-0x41+10)<<((len-val-1)*4));
  561.       }
  562. //   in.Format("data=%x,%u",data,data);
  563. //          AfxMessageBox(in);
  564.         base+=data;
  565.     m_Edata.MakeUpper();
  566.         len=m_Edata.GetLength();
  567.     data=0;
  568.         for(val=len-1;val>=0;val--){
  569.           if(((char*)m_Edata.GetBuffer(0))[val]<=(char)'9')
  570.                   data+=((DWORD)((char*)m_Edata.GetBuffer(0)[val]-0x30)<<((len-val-1)*4));
  571.           else
  572.                   data+=((DWORD)((char*)m_Edata.GetBuffer(0)[val]-0x41+10)<<((len-val-1)*4));
  573.       }
  574. //   in.Format("data=%x,%u",data,data);
  575. //          AfxMessageBox(in);
  576.         re=WriteProcessMemory(hprocess,(LPVOID)base,&data,4,NULL);
  577.         if(re==FALSE){
  578.       AfxMessageBox("写内存失败");
  579.       return;
  580.         }
  581.     if(hprocess)CloseHandle(hprocess);
  582. }
  583. void CDoProcessDlg::OnBEnumAllDLL()
  584. {
  585. char path[256],pID[18],based[20];
  586. POSITION pos = m_lCtrl.GetFirstSelectedItemPosition();
  587. if(pos==NULL){
  588.         AfxMessageBox("请选择进程!");
  589.         return;   
  590. }
  591.   m_list.ResetContent();
  592. int m_nIndex = m_lCtrl.GetNextSelectedItem(pos);  // 得到项目索引
  593. m_lCtrl.GetItemText(m_nIndex, 2, path, 256 );
  594. m_lCtrl.GetItemText(m_nIndex, 1, pID, 18 );       
  595. m_lCtrl.GetItemText(m_nIndex, 3, based, 20 );       
  596. CString sbase;
  597. sbase=based;
  598. if(sbase=="unknown"){
  599.         AfxMessageBox("超级进程,无法读!");
  600.         return;   
  601. }
  602. //AfxMessageBox(path);
  603. DWORD processID=(DWORD)atoi((char*)pID);
  604. HANDLE hprocess=NULL,hProcessToken=NULL;
  605. OSVERSIONINFO ver;
  606. ver.dwOSVersionInfoSize=sizeof(ver);//必须的,否则不正确
  607. if(!GetVersionEx(&ver)){
  608.      ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  609.    AfxMessageBox("无法判断当前操作系统");
  610.    return  ;    }
  611. if(ver.dwPlatformId==VER_PLATFORM_WIN32_NT){  //为NT,2000,XP
  612. //杀死所有进程包括服务,在2000以上需要提升权限
  613. //打开某个进程的访问令牌,第一个参数为进程句柄,第二个参数为访问权限,
  614. //第三个参数为函数输出的用来调整权限的句柄
  615.   if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hProcessToken))
  616.   {
  617.      ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  618.    AfxMessageBox("打开本进程访问令牌失败!");
  619.   return  ;
  620.   }
  621. //SE_DEBUG_NAME 为要求调试进程的权限
  622.   if(!SetPrivilege(hProcessToken,SE_DEBUG_NAME,TRUE))
  623.   {
  624.           ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  625.     AfxMessageBox("设置权限错误!");
  626.    return  ;
  627.   }
  628. }
  629. if((hprocess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,processID))==NULL)
  630.   {
  631.     AfxMessageBox("打开进程失败");
  632.                 ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  633.         return;
  634.   }
  635. //枚举内存
  636. MEMORY_BASIC_INFORMATION mbi;
  637. //  typedef struct _MEMORY_BASIC_INFORMATION { /* mbi */
  638. //  PVOID BaseAddress; /* 区域的基本地址 */
  639. //  PVOID AllocationBase; /* 分配基本地址 */
  640. //  DWORD AllocationProtect; /* 初始访问保护 */
  641. //  DWORD RegionSize; /* 区域的字节大小 */
  642. //  DWORD State; /* 已提交的、保留的、自由的 */
  643. //  DWORD Protect; /* 当前访问保护 */
  644. //  DWORD Type; /* 页类型 */
  645. //} MEMORY_BASIC_INFORMATION;
  646. //  这个结构,在我们的程序中,最关心的是AllocationBase,BaseAddress
  647. //  从代码中可以看出AllocationBase 相当于 HMODULE .
  648. //  RegionSize则表明了这一块内存的大小。
  649. //  ptr += mbi.RegionSize;
  650. //  通过者一句,我们接着获取下一个内存块的信息
  651. //  通过 GetModuleFileName 我们获取了模块的详细信息
  652. PBYTE ptr = NULL;
  653. DWORD dwBytesReturn = sizeof(MEMORY_BASIC_INFORMATION);
  654. char szBuffer[256*100];
  655. char szModuFile[256];
  656. char szTmpBuffer[256];
  657. memset(szBuffer,0,256*100);
  658. memset(szModuFile,0,256);
  659. memset(szTmpBuffer,0,256);
  660. int n=1;CString din;
  661. while( dwBytesReturn == sizeof(MEMORY_BASIC_INFORMATION) )
  662. {
  663.   dwBytesReturn = VirtualQueryEx(hprocess,ptr,&mbi,sizeof(MEMORY_BASIC_INFORMATION) );
  664.   if(mbi.Type == MEM_FREE ) mbi.AllocationBase = mbi.BaseAddress;
  665.   //GetModuleFileName( (HINSTANCE)mbi.AllocationBase,szModuFile,256);
  666.     GetModuleFileNameEx(hprocess,(HMODULE)mbi.AllocationBase,szModuFile,256);
  667.   switch(mbi.AllocationProtect){
  668.   case PAGE_READONLY:
  669.      din="PAGE_READONLY";
  670.   break;
  671.   case PAGE_READWRITE:
  672.      din="PAGE_READWRITE";
  673.   break;
  674.   case PAGE_WRITECOPY:
  675.      din="PAGE_WRITECOPY";
  676.   break;
  677.   case PAGE_EXECUTE:
  678.      din="PAGE_EXECUTE";
  679.   break;
  680.   case PAGE_EXECUTE_READ:
  681.      din="PAGE_EXECUTE_READ";
  682.   break;
  683.   case PAGE_EXECUTE_READWRITE:
  684.      din="PAGE_EXECUTE_READWRITE";
  685.   break;
  686.   case PAGE_EXECUTE_WRITECOPY:
  687.      din="PAGE_EXECUTE_WRITECOPY";
  688.          break;
  689.   default: din="OTHER";
  690.   }
  691.   wsprintf(szTmpBuffer,"%3d)模块名=%s,基地址=%x,大小=%x,属性=%s",n++,szModuFile,ptr,mbi.RegionSize,din);
  692.   m_list.AddString(szTmpBuffer);
  693. //  if(mbi.AllocationBase == mbi.BaseAddress && mbi.AllocationBase != NULL &&
  694. //  mbi.AllocationBase != GetModuleHandle(NULL) )strcat(szBuffer , szTmpBuffer);
  695.   ptr += mbi.RegionSize;
  696. }
  697.   if(hprocess)CloseHandle(hprocess);        
  698.   int tnum=m_list.GetCount( );
  699.   if(tnum==LB_ERR)return;
  700.   CFile fp;
  701.   fp.Open("c:\\dat.txt",CFile::modeCreate|CFile::modeWrite);
  702.   for(int ii=0;ii<tnum;ii++){
  703.     m_list.GetText(ii,din);
  704.         din+="\r\n";
  705.     fp.Write(din.GetBuffer(0),din.GetLength());
  706.   }
  707.   fp.Close();
  708. }
  709. void CDoProcessDlg::OnBChangeAttr()
  710. {
  711. char path[256],pID[18],based[20];
  712. POSITION pos = m_lCtrl.GetFirstSelectedItemPosition();
  713. if(pos==NULL){
  714.         AfxMessageBox("请选择进程!");
  715.         return;   
  716. }
  717. m_list.ResetContent();
  718. int m_nIndex = m_lCtrl.GetNextSelectedItem(pos);  // 得到项目索引
  719. m_lCtrl.GetItemText(m_nIndex, 2, path, 256 );
  720. m_lCtrl.GetItemText(m_nIndex, 1, pID, 18 );       
  721. m_lCtrl.GetItemText(m_nIndex, 3, based, 20 );       
  722. CString sbase=based;
  723. if(sbase=="unknown"){
  724.         AfxMessageBox("超级进程,无法读!");
  725.         return;   
  726. }
  727. DWORD processID=(DWORD)atoi((char*)pID);
  728. HANDLE hprocess=NULL,hProcessToken=NULL;
  729. OSVERSIONINFO ver;
  730. ver.dwOSVersionInfoSize=sizeof(ver);//必须的,否则不正确
  731. if(!GetVersionEx(&ver)){
  732.      ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  733.    AfxMessageBox("无法判断当前操作系统");
  734.    return  ;    }
  735. if(ver.dwPlatformId==VER_PLATFORM_WIN32_NT){  //为NT,2000,XP
  736. //杀死所有进程包括服务,在2000以上需要提升权限
  737. //打开某个进程的访问令牌,第一个参数为进程句柄,第二个参数为访问权限,
  738. //第三个参数为函数输出的用来调整权限的句柄
  739.   if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hProcessToken))
  740.   {
  741.      ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  742.    AfxMessageBox("打开本进程访问令牌失败!");
  743.   return  ;
  744.   }
  745. //SE_DEBUG_NAME 为要求调试进程的权限
  746.   if(!SetPrivilege(hProcessToken,SE_DEBUG_NAME,TRUE))
  747.   {
  748.           ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  749.     AfxMessageBox("设置权限错误!");
  750.    return  ;
  751.   }
  752. }
  753. if((hprocess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,processID))==NULL)
  754.   {
  755.     AfxMessageBox("打开进程失败");
  756.                 ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  757.         return;
  758.   }
  759.       CString din;
  760.       DWORD oldProtect;
  761.     m_EAdd_Change.MakeUpper();
  762.         int len=m_EAdd_Change.GetLength();
  763.     DWORD data=0;
  764.         for(int val=len-1;val>=0;val--){
  765.           if(((char*)m_EAdd_Change.GetBuffer(0))[val]<=(char)'9')
  766.                   data+=((DWORD)((char*)m_EAdd_Change.GetBuffer(0)[val]-0x30)<<((len-val-1)*4));
  767.           else
  768.                   data+=((DWORD)((char*)m_EAdd_Change.GetBuffer(0)[val]-0x41+10)<<((len-val-1)*4));
  769.       }
  770.           
  771.           BOOL re=VirtualProtectEx(hprocess,&data,10*1024,PAGE_EXECUTE_READWRITE,&oldProtect);
  772.       if(re)din.Format("地址%X--大小%X :修改成功",data,10*1024);
  773.           else  din.Format("地址%X--大小%X :修改失败",data,10*1024);
  774.       m_list.AddString(din);
  775.   if(hprocess)CloseHandle(hprocess);        
  776. }
  777. void CDoProcessDlg::OnChangeEAddChange()
  778. {
  779. UpdateData();
  780. }
  781. void CDoProcessDlg::OnBgetModule()
  782. {
  783. char path[256],pID[18],based[20];
  784. POSITION pos = m_lCtrl.GetFirstSelectedItemPosition();
  785. if(pos==NULL){
  786.         AfxMessageBox("请选择进程!");
  787.         return;   
  788. }
  789.   m_list.ResetContent();
  790. int m_nIndex = m_lCtrl.GetNextSelectedItem(pos);  // 得到项目索引
  791. m_lCtrl.GetItemText(m_nIndex, 2, path, 256 );
  792. m_lCtrl.GetItemText(m_nIndex, 1, pID, 18 );       
  793. m_lCtrl.GetItemText(m_nIndex, 3, based, 20 );       
  794. CString sbase;
  795. sbase=based;
  796. if(sbase=="unknown"){
  797.         AfxMessageBox("超级进程,无法读!");
  798.         return;   
  799. }
  800. //AfxMessageBox(path);
  801. DWORD processID=(DWORD)atoi((char*)pID);
  802. HANDLE hprocess=NULL,hProcessToken=NULL;
  803. OSVERSIONINFO ver;
  804. ver.dwOSVersionInfoSize=sizeof(ver);//必须的,否则不正确
  805. if(!GetVersionEx(&ver)){
  806.      ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  807.    AfxMessageBox("无法判断当前操作系统");
  808.    return  ;    }
  809. if(ver.dwPlatformId==VER_PLATFORM_WIN32_NT){  //为NT,2000,XP
  810. //杀死所有进程包括服务,在2000以上需要提升权限
  811. //打开某个进程的访问令牌,第一个参数为进程句柄,第二个参数为访问权限,
  812. //第三个参数为函数输出的用来调整权限的句柄
  813.   if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hProcessToken))
  814.   {
  815.      ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  816.    AfxMessageBox("打开本进程访问令牌失败!");
  817.   return  ;
  818.   }
  819. //SE_DEBUG_NAME 为要求调试进程的权限
  820.   if(!SetPrivilege(hProcessToken,SE_DEBUG_NAME,TRUE))
  821.   {
  822.           ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  823.     AfxMessageBox("设置权限错误!");
  824.    return  ;
  825.   }
  826. }
  827. if((hprocess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,processID))==NULL)
  828.   {
  829.     AfxMessageBox("打开进程失败");
  830.                 ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  831.         return;
  832.   }
  833. }
  834. void CDoProcessDlg::OnBGetAllDLL()
  835. {
  836.   char path[256],pID[18],based[20];
  837. POSITION pos = m_lCtrl.GetFirstSelectedItemPosition();
  838. if(pos==NULL){
  839.         AfxMessageBox("请选择进程!");
  840.         return;   
  841. }
  842.   m_list.ResetContent();
  843. int m_nIndex = m_lCtrl.GetNextSelectedItem(pos);  // 得到项目索引
  844. m_lCtrl.GetItemText(m_nIndex, 2, path, 256 );
  845. m_lCtrl.GetItemText(m_nIndex, 1, pID, 18 );       
  846. m_lCtrl.GetItemText(m_nIndex, 3, based, 20 );       
  847. CString sbase;
  848. sbase=based;
  849. if(sbase=="unknown"){
  850.         AfxMessageBox("超级进程,无法读!");
  851.         return;   
  852. }
  853. //AfxMessageBox(path);
  854. DWORD processID=(DWORD)atoi((char*)pID);
  855. HANDLE hprocess=NULL,hProcessToken=NULL;
  856. OSVERSIONINFO ver;
  857. ver.dwOSVersionInfoSize=sizeof(ver);//必须的,否则不正确
  858. if(!GetVersionEx(&ver)){
  859.      ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  860.    AfxMessageBox("无法判断当前操作系统");
  861.    return  ;    }
  862. if(ver.dwPlatformId==VER_PLATFORM_WIN32_NT){  //为NT,2000,XP
  863. //杀死所有进程包括服务,在2000以上需要提升权限
  864. //打开某个进程的访问令牌,第一个参数为进程句柄,第二个参数为访问权限,
  865. //第三个参数为函数输出的用来调整权限的句柄
  866.   if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hProcessToken))
  867.   {
  868.      ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  869.    AfxMessageBox("打开本进程访问令牌失败!");
  870.   return  ;
  871.   }
  872. //SE_DEBUG_NAME 为要求调试进程的权限
  873.   if(!SetPrivilege(hProcessToken,SE_DEBUG_NAME,TRUE))
  874.   {
  875.           ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  876.     AfxMessageBox("设置权限错误!");
  877.    return  ;
  878.   }
  879. }
  880. if((hprocess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,processID))==NULL)
  881.   {
  882.     AfxMessageBox("打开进程失败");
  883.                 ::EnableWindow(m_Scan.m_hWnd,TRUE);       
  884.         return;
  885.   }
  886. //枚举内存
  887. MEMORY_BASIC_INFORMATION mbi;
  888. //  typedef struct _MEMORY_BASIC_INFORMATION { /* mbi */
  889. //  PVOID BaseAddress; /* 区域的基本地址 */
  890. //  PVOID AllocationBase; /* 分配基本地址 */
  891. //  DWORD AllocationProtect; /* 初始访问保护 */
  892. //  DWORD RegionSize; /* 区域的字节大小 */
  893. //  DWORD State; /* 已提交的、保留的、自由的 */
  894. //  DWORD Protect; /* 当前访问保护 */
  895. //  DWORD Type; /* 页类型 */
  896. //} MEMORY_BASIC_INFORMATION;
  897. //  这个结构,在我们的程序中,最关心的是AllocationBase,BaseAddress
  898. //  从代码中可以看出AllocationBase 相当于 HMODULE .
  899. //  RegionSize则表明了这一块内存的大小。
  900. //  ptr += mbi.RegionSize;
  901. //  通过者一句,我们接着获取下一个内存块的信息
  902. //  通过 GetModuleFileName 我们获取了模块的详细信息
  903. PBYTE ptr = NULL;
  904. DWORD dwBytesReturn = sizeof(MEMORY_BASIC_INFORMATION);
  905. char szBuffer[256*100];
  906. char szModuFile[256];
  907. char szTmpBuffer[256];
  908. memset(szBuffer,0,256*100);
  909. memset(szTmpBuffer,0,256);
  910. int n=1;CString din;
  911. CString old;
  912. while( dwBytesReturn == sizeof(MEMORY_BASIC_INFORMATION) )
  913. {
  914.   memset(szModuFile,0,256);
  915.   dwBytesReturn = VirtualQueryEx(hprocess,ptr,&mbi,sizeof(MEMORY_BASIC_INFORMATION) );
  916.   if(mbi.Type == MEM_FREE ) mbi.AllocationBase = mbi.BaseAddress;
  917.   //GetModuleFileName( (HINSTANCE)mbi.AllocationBase,szModuFile,256);
  918.     GetModuleFileNameEx(hprocess,(HMODULE)mbi.AllocationBase,szModuFile,256);
  919.     //
  920. //  if(mbi.AllocationBase == mbi.BaseAddress && mbi.AllocationBase != NULL &&
  921. //  mbi.AllocationBase != GetModuleHandle(NULL) )strcat(szBuffer , szTmpBuffer);
  922.   ptr += mbi.RegionSize;
  923.   if(strlen(szModuFile)<=1)continue;   //不能是等于0,竟然有问号
  924.   CString mid=szModuFile;
  925.   mid.MakeLower();
  926.   if(old==mid)continue;
  927.   old=szModuFile;  
  928.   old.MakeLower();
  929.   if(old.Find(".exe",0)!=-1)continue;
  930.   wsprintf(szTmpBuffer,"%3d)模块名=%s,开始地址=%8X",n++,szModuFile,ptr-mbi.RegionSize);
  931.   m_list.AddString(szTmpBuffer);
  932. }
  933.   if(hprocess)CloseHandle(hprocess);        
  934.   int tnum=m_list.GetCount( );
  935.   if(tnum==LB_ERR)return;
  936.   CFile fp;
  937.   fp.Open("c:\\dat.txt",CFile::modeCreate|CFile::modeWrite);
  938.   for(int ii=0;ii<tnum;ii++){
  939.     m_list.GetText(ii,din);
  940.         din+="\r\n";
  941.     fp.Write(din.GetBuffer(0),din.GetLength());
  942.   }
  943.   fp.Close();
  944. }
复制代码


作者:yincheng01 发表于2011-12-15 0:04:40 原文链接

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-4-29 07:09 , Processed in 0.013126 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表