内存修改器


 

 

#include <windows.h>
#include <iostream>
#include <Tlhelp32.h>
#include <process.h>
#include <commctrl.h>
#include "resource.h"

#pragma comment(lib,"comctl32.lib")

#define ID_STATUSBAR  1
#define ID_TIME	100
using namespace std;

BOOL CALLBACK DialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK GetProcessList (HWND hwnd);
BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
BOOL EnablePrivilege(PCTSTR szPrivilege, BOOL fEnable);
HWND	hList1;
HWND	hList2;
HWND	hWinStatus;
bool	lock;

typedef struct 
{
	DWORD	value;
	HANDLE  hProcess;
}arglist;


#include "Search.h"

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
	InitCommonControls();
	EnablePrivilege(SE_DEBUG_NAME, TRUE);
	DialogBoxParam (hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, DialogProc, 0);
	EnablePrivilege(SE_DEBUG_NAME, FALSE);
	return 1;
}

BOOL CALLBACK DialogProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	HICON	hIcon;
	static HINSTANCE	hInstance	= GetModuleHandle (NULL);
	static int ID,index;
	static HWND	hEdit1,hEdit2,hEdit3;
	static TCHAR	szBuffer[10];
	static arglist	arg;
	static TCHAR szFree[]=L"   空闲中......";
	static TCHAR szSearch[]=L"  搜索中,请耐心等候......";
	static TCHAR szLock[]=L"取消锁定";
	static TCHAR szUnlock[]=L"内存数值锁定";
	static DWORD var,addr;
	static HBITMAP	hBitmap;

	switch (message)
	{
		case WM_INITDIALOG:
			hIcon	= LoadIcon (hInstance, MAKEINTRESOURCE(IDI_ICON1) );
			SendMessage (hwnd,WM_SETICON,ICON_BIG, (LPARAM)hIcon);
			
			hEdit1	= GetDlgItem(hwnd, IDC_EDIT1);
			hEdit2	= GetDlgItem(hwnd, IDC_EDIT2);
			hEdit3	= GetDlgItem(hwnd, IDC_EDIT3);
			SendDlgItemMessage (hwnd, IDC_EDIT1,EM_LIMITTEXT, 8,  0);
			SendDlgItemMessage (hwnd, IDC_EDIT2,EM_LIMITTEXT, 12, 0);
			SendDlgItemMessage (hwnd, IDC_EDIT3, EM_LIMITTEXT, 8, 0);

			hList1	= GetDlgItem (hwnd, IDC_LIST1);
			hList2	= GetDlgItem (hwnd, IDC_LIST2);
			EnableWindow (GetDlgItem (hwnd, IDC_BUTTON3), FALSE);//灰化修改按钮
			EnableWindow (GetDlgItem (hwnd, IDC_BUTTON1), FALSE);

			hWinStatus	= CreateStatusWindow(WS_CHILD | WS_VISIBLE | SBS_SIZEGRIP,NULL,hwnd,ID_STATUSBAR);
			//SendMessage,hWinStatus,SB_SETPARTS,4,offset dwStatusWidth
			SendMessage(hWinStatus,SB_SETTEXT,0, (LPARAM)szFree);

			GetProcessList (hwnd);
			return true;

		case WM_COMMAND:
			switch (LOWORD (wParam))
			{
				case IDC_LIST1:
					break;

				case IDC_LIST2:
					char item[20];
					if (HIWORD(wParam) == LBN_SELCHANGE)
					{
						index	= SendMessage (hList2, LB_GETCURSEL,0, 0);
						SendMessageA (hList2, LB_GETTEXT, index, (LPARAM)item);
						SetDlgItemTextA (hwnd, IDC_EDIT2, item);
					}
					break;

				case IDOK:
					GetProcessList(hwnd);//刷新
					break;

				case IDCANCEL:
					EndDialog (hwnd, 0);
					break;

				case IDC_EDIT1:
					EnableWindow(GetDlgItem(hwnd, IDC_BUTTON1), GetDlgItemText (hwnd, IDC_EDIT1, szBuffer, 4)) ;
					break;

				case IDC_EDIT3:
					EnableWindow(GetDlgItem(hwnd, IDC_BUTTON3), GetDlgItemText (hwnd, IDC_EDIT3, szBuffer, 4)) ;
					break;

				case IDC_BUTTON1:
					DWORD value;
					HANDLE	hProcess;

					value	= GetDlgItemInt (hwnd, IDC_EDIT1,NULL, FALSE);
					//if (!value)
					{
					//	MessageBox (hwnd, TEXT("请输入搜索数值"), NULL, MB_OK);
					//	break;
					}
					index	= SendMessage (hList1, LB_GETCURSEL,0, 0);
					ID		= SendMessage (hList1, LB_GETITEMDATA, index, 0);
					EnableWindow(GetDlgItem(hwnd, IDC_LIST1), FALSE) ;
					//if ( hProcess = OpenProcess (PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, NULL, ID) )
					if ( hProcess = OpenProcess (PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_VM_OPERATION, NULL, ID) )
						//if (!Search (hProcess, value))
						//	MessageBox (hwnd, TEXT("搜索失败"), NULL, MB_OK);
					{
						arg.hProcess	= hProcess;
						arg.value		= value;
						SendMessage (hList2, LB_RESETCONTENT, 0, 0);
						_beginthread(Search,NULL, &arg);
						SendMessage(hWinStatus,SB_SETTEXT,0, (LPARAM)szSearch);
					}
					else
					{
						MessageBox (hwnd, TEXT("打开进程失败"), NULL, MB_OK);
						EnableWindow(GetDlgItem(hwnd, IDC_LIST1), TRUE) ;
					}
					break;

				case IDC_BUTTON2:
					SendMessage (hList2, LB_RESETCONTENT, 0, 0);
					Init();
					EnableWindow(GetDlgItem(hwnd, IDC_LIST1), TRUE) ;
					SendMessage(hWinStatus,SB_SETTEXT,0, (LPARAM)szFree);
					break;

				case IDC_BUTTON3:
					char szNum[12];
					GetDlgItemTextA(hwnd, IDC_EDIT2,szNum,sizeof(szNum));
					sscanf (szNum,"%lX",&addr);
					var	= GetDlgItemInt (hwnd, IDC_EDIT3, NULL, FALSE);
					
					if (!var)
					{
						MessageBox (hwnd, TEXT("请输入修改数值"), NULL, MB_OK);
						break;
					}
					if (WriteMemory (addr, var))
						MessageBox (hwnd, TEXT("修改成功!"), TEXT("提示"), MB_OK);
					else
						MessageBox (hwnd, TEXT("修改失败!"), NULL, MB_OK);
					break;

				case IDC_BUTTON4:
					if (lock == false)
					{
						SendMessage (hwnd, WM_COMMAND, IDC_BUTTON3, 0);
						if (!var)
						{
							break;
						}
						EnableWindow (GetDlgItem (hwnd, IDC_BUTTON1), FALSE);//灰化按钮
						EnableWindow (GetDlgItem (hwnd, IDC_BUTTON2), FALSE);
						EnableWindow (GetDlgItem (hwnd, IDC_BUTTON3), FALSE);
						EnableWindow (hEdit1, FALSE);
						EnableWindow (hEdit2, FALSE);
						EnableWindow (hEdit3, FALSE);
						
						SetTimer (hwnd, ID_TIME, 100, NULL);
						SetDlgItemText(hwnd, IDC_BUTTON4, szLock);
						SendMessage(hWinStatus,SB_SETTEXT,0, (LPARAM)TEXT("内存锁定中..."));
						lock	= true;
					}
					else
					{
						KillTimer (hwnd, ID_TIME);
						
						EnableWindow (GetDlgItem (hwnd, IDC_BUTTON1), TRUE);//激活按钮
						EnableWindow (GetDlgItem (hwnd, IDC_BUTTON2), TRUE);
						EnableWindow (GetDlgItem (hwnd, IDC_BUTTON3), TRUE);
						EnableWindow (hEdit1, TRUE);
						EnableWindow (hEdit2, TRUE);
						EnableWindow (hEdit3, TRUE);

						SetDlgItemText(hwnd, IDC_BUTTON4, szUnlock);
						SendMessage(hWinStatus,SB_SETTEXT,0, (LPARAM)szFree);
						lock	= false;
					}
					break;

				case ID_ABOUT:
					DialogBox (GetModuleHandle (NULL), TEXT ("AboutBox"), hwnd, AboutDlgProc);
					break;
				/*case IDCANCEL:
					HANDLE	h;
					index	= SendMessage (hList, LB_GETCURSEL,0, 0);
					ID		= SendMessage (hList, LB_GETITEMDATA, index, 0);
					if ( h = OpenProcess (PROCESS_TERMINATE, NULL, ID) )
					{
						TerminateProcess (h, -1);
						CloseHandle (h);
						Sleep (100);
						GetProcessList (hwnd);
					}
					else
						MessageBox (hwnd, TEXT("无法结束指定进程"),NULL, MB_OK);
					break;*/
			}
			return true;

		case WM_TIMER:
			if (!WriteMemory (addr, var))
			{
				MessageBox (hwnd, TEXT("内存锁定失败"),NULL, MB_OK);
				lock	= true;
				SendMessage (hwnd, WM_COMMAND, IDC_BUTTON4, 0);
			}
			return true;

		case WM_PAINT:
			HDC	hdc, hdcMem ;
			PAINTSTRUCT ps ;
		    hBitmap	= LoadBitmap(hInstance, L"BitBlt");

			hdc = BeginPaint(hwnd, &ps);
			hdcMem = CreateCompatibleDC(hdc);
			SelectObject(hdcMem, hBitmap);

			StretchBlt (hdc, 0, 0, 500, 500,hdcMem, 0, 0, 500, 500, MERGECOPY) ;

			DeleteDC(hdcMem);
			EndPaint (hwnd, &ps);
			return true;

		case WM_CLOSE:
			KillTimer (hwnd, ID_TIME);
			EndDialog (hwnd, 0);
			return true;
	}
	return false;
}

BOOL CALLBACK GetProcessList (HWND hwnd)
{
	PROCESSENTRY32	stProcess;
	HANDLE	hSnapShot;
	RtlZeroMemory (&stProcess, sizeof (stProcess) );
	SendMessage (hList1, LB_RESETCONTENT, 0, 0);
	stProcess.dwSize	= sizeof (stProcess);
	hSnapShot	= CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
	bool res	= Process32First (hSnapShot, &stProcess);
	while ( res)
	{
		int index	= SendMessage (hList1, LB_ADDSTRING, 0, (LPARAM)stProcess.szExeFile);
		SendMessage (hList1, LB_SETITEMDATA, index, stProcess.th32ProcessID);
		res	= Process32Next (hSnapShot, &stProcess);
	}
	CloseHandle (hSnapShot);
	return true;
}

BOOL CALLBACK AboutDlgProc (HWND hwnd, UINT message, 
                            WPARAM wParam, LPARAM lParam)
{
     switch (message)
     {
     case WM_INITDIALOG :
          return TRUE ;
          
     case WM_COMMAND :
          switch (LOWORD (wParam))
          {
		  case IDOK :
			  EndDialog (hwnd, 0) ;
			  MessageBox (NULL, TEXT("因为箱子里放的是变压器"), TEXT("嗯嗯"), MB_OK);
			  return TRUE;

          case IDCANCEL :
               EndDialog (hwnd, 0) ;
			   MessageBox (NULL, TEXT("不想知道的是猪"), TEXT("haha"), MB_OK);
               return TRUE ;
          }
          break ;
     }
     return FALSE ;
}

//提升当前进程权限(调试权限)
BOOL EnablePrivilege(PCTSTR szPrivilege, BOOL fEnable) {

   // Enabling the debug privilege allows the application to see
   // information about service applications
   BOOL fOk = FALSE;    // Assume function fails
   HANDLE hToken;

   // Try to open this process's access token
   if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, 
      &hToken)) {

      // Attempt to modify the given privilege
      TOKEN_PRIVILEGES tp;
      tp.PrivilegeCount = 1;
      LookupPrivilegeValue(NULL, szPrivilege, &tp.Privileges[0].Luid);
      tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
      AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
      fOk = (GetLastError() == ERROR_SUCCESS);

      // Don't forget to close the token handle
      CloseHandle(hToken);
   }
   return(fOk);
}


 

#ifndef SEARCH_H
#define SEARCH_H

#include <windows.h>
#define MAX_SIZE 20*1024
void Search(void *arg);
//bool Search(HANDLE hProc, DWORD dwValue);
bool FirstSearch(DWORD dwValue);
bool NextSearch (DWORD dwValue);
bool WriteMemory(DWORD dwAddr, DWORD dwValue);
bool CompareAPage (DWORD baseAdd, DWORD dwValue);

DWORD	List[MAX_SIZE];
DWORD	Listcnt;
bool	First = 1;
HANDLE	hProcess;
const DWORD dwOneGB = 1024*1024*1024;	// 1GB
const DWORD dwOnePage = 4*1024;		// 4KB

void Init()
{
	memcpy (List, "\0", sizeof (List) );
	Listcnt = 0;
	First	= 1;
}

void Search(void *arg)
{
	TCHAR	szResult[20];
	hProcess	= ((arglist*)arg)->hProcess;
	if ( First)
	{
		FirstSearch(((arglist*)arg)->value);
	    First	= 0;
	}
	else
		NextSearch (((arglist*)arg)->value);
	wsprintf (szResult, L"搜索完毕,发现%lu个结果", Listcnt);
	SendMessage(hWinStatus,SB_SETTEXT,0, (LPARAM)szResult);
}

bool FirstSearch(DWORD dwValue)
{
	if(hProcess == NULL)
		return FALSE;
	// 查看操作系统类型,以决定开始地址
	DWORD dwBase;
	OSVERSIONINFO vi = { sizeof(vi) };
	GetVersionEx(&vi);
	if (vi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
		dwBase = 4*1024*1024;		// Windows 98系列,4MB	
	else
		dwBase = 640*1024;		// Windows NT系列,64KB

	for (dwBase = 1024*1024;dwBase < 2 * dwOneGB ; dwBase += dwOnePage)
		CompareAPage (dwBase, dwValue);

	return true;
}

bool NextSearch (DWORD dwValue)
{
	DWORD dwReadValue, num=Listcnt;
	Listcnt	= 0;
	char Item[20];
	SendMessage (hList2, LB_RESETCONTENT, 0, 0);
	for (unsigned int i=0; i < num; i++)
	{
		if( ReadProcessMemory(hProcess, (LPVOID)List[i], &dwReadValue, sizeof(DWORD), NULL))
			if (dwReadValue == dwValue)
			{
				List[Listcnt++]	= List[i];
				sprintf (Item, "0x%08lX", List[i]);
				SendMessageA (hList2, LB_ADDSTRING, 0, (LPARAM)Item);
			}
	}
	return true;
}

bool WriteMemory(DWORD dwAddr, DWORD dwValue)
{
	return WriteProcessMemory (hProcess, (LPVOID)dwAddr, &dwValue, sizeof (DWORD), NULL);
}

bool CompareAPage (DWORD baseAdd, DWORD dwValue)
{
	BYTE PageData[4096];
	char Item[20];
	if ( !ReadProcessMemory (hProcess, (LPCVOID)baseAdd, PageData, dwOnePage, NULL) )
		return false;

	DWORD	*p;
	for (unsigned int i=0; i < (DWORD)4*1024 - 3; i++)
	{
		p	= (DWORD*)&PageData[i];
		if (p[0] == dwValue)
		{
			if (Listcnt >= MAX_SIZE)
				return false;
			List[Listcnt]	= baseAdd + i;
			sprintf (Item, "0x%08lX", List[Listcnt]);  
			SendMessageA (hList2, LB_ADDSTRING, 0, (LPARAM)Item);
			Listcnt++;
		}
	}
	return true;
}

#endif


 

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by 内存修改器.rc
//
#define IDD_DIALOG1                     101
#define IDD_DIALOG                      101
#define IDI_ICON                        102
#define IDR_MENU                        103
#define IDI_ICON1                       110
#define IDB_BITMAP1                     111
#define IDC_LIST1                       1001
#define IDC_LIST2                       1002
#define IDC_EDIT1                       1003
#define IDC_BUTTON1                     1004
#define IDC_BUTTON2                     1005
#define IDC_EDIT2                       1006
#define IDC_EDIT3                       1007
#define IDC_BUTTON3                     1008
#define IDC_BUTTON4                     1009
#define ID_40001                        40001
#define ID_ABOUT                        40002

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        112
#define _APS_NEXT_COMMAND_VALUE         40003
#define _APS_NEXT_CONTROL_VALUE         1010
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值