[00029]-[2015-09-25]-[00]-[代码注入小应用案例]

本文介绍如何通过编写test.exe程序实现简单的用户登录功能,并通过代码注入技术修改指定进程的内存内容,以实现密码修改的功能。具体步骤包括编写test.exe程序、获取密码常量的固定地址、编写SetMemVal.exe程序进行内存修改,最后运行两个程序实现功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小应用案例的需求:
  通过【代码注入】技术,实现指定进程的内存的修改

案例实现步骤:
  【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;
}

 

转载于:https://www.cnblogs.com/Auris/p/4837487.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值