[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;
}

 

posted @ 2015-09-25 10:45  Auris  阅读(179)  评论(0编辑  收藏  举报