[00029]-[2015-09-25]-[00]-[代码注入小应用案例]
小应用案例的需求:
通过【代码注入】技术,实现指定进程的内存的修改
案例实现步骤:
【1】编写test.exe程序 实现简单的用户登录(密码检验)功能
【2】通过编译,调试跟踪,获取密码(常量类型密码)的固定地址
方法有[1]:在程序代码中插入printf("%p", &val)获取变量的虚拟地址
[2]:使用调试工具 VC++自带的调试功能 或者OD工具 跟踪地址
【3】编写SetMemVal.exe程序 用于修改指定进程的指定内存的内容
【4】运行程序实现功能,先运行test.exe(只有运行了,才有目标进程的出现),然后运行
SetMemVal.exe程序。。。。。
代码实现:
// code for [test.exe] #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char password[] = "123"; char a = 'a'; char str[20]; int OK = 0; char* p; printf("&p = %p\n", &p); p = (char*)malloc(10*sizeof(char)); // 动态分配 地址不确定 printf("&p = %p\n", p); printf("&a = %p\n", &a); printf("&password = %p\n", password); printf("&str = %p\n", str); printf("&OK = %p\n", &OK); printf("&p = %p\n", &p); while(OK==0) { printf("[input your password :]->"); scanf("%s", str); if(strcmp(str, password)==0) { printf("Welcome to New World !\n"); OK = 1; } else { printf("the password is error, try it again !\n"); getchar(); } } return 0; } // 通过分析test.exe 中"password"的变量在进程内存空间的地址是:0x0012FF44 // 我们下面编写SetMemVal.exe 程序可以直接使用这个地址作为参数 // C语言程序局部变量定义在栈上面,而malloc动态分配的变量在堆上面,(具有全局作用)
// code for [SetMemVal.exe] #include <stdio.h> #include <Windows.h> #include <TLHELP32.H> bool SetMemoryValue0(const char* ProcessName, LPVOID MemAddress, LPVOID lpBuffer, DWORD size) { HANDLE hProcessSnap; HANDLE hProcess = NULL; PROCESSENTRY32 pe32 = {0}; BOOL bRet = 0; hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); pe32.dwSize = sizeof(PROCESSENTRY32); bRet = Process32First(hProcessSnap, &pe32); while(bRet) { if(strcmp(pe32.szExeFile, ProcessName)==0) { hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID); break; } bRet = Process32Next(hProcessSnap, &pe32); } CloseHandle(hProcessSnap); if(hProcess != NULL) { WriteProcessMemory(hProcess, MemAddress, lpBuffer, size, NULL); CloseHandle(hProcess); return true; } return false; } int main() { printf("/**************************************/\n"); printf("/***********Set Memory Value***********/\n"); printf("/**************************************/\n"); if(SetMemoryValue0("test.exe", (void*)0x0012FF44, "456", 4)) { printf("Set Operation OK!\n"); } else { printf("Set Operation Failed!\n"); } getchar(); return 0; }