uvgmn 发表于 2015-4-18 19:59:33

为什么代码注入多次,目标程序的内存会越来越大

测试代码:
目标程序A

#include<iostream>
#include<Windows.h>
using namespace std;
void dg(){
}
int main(int i){
    cout<<"函数地址:"<<(void *)dg<<endl;
    cout<<"进程ID:"<<GetCurrentProcessId();
    cin>>i;
    return 0;
}
注入的程序B

#include <iostream>
#include<stdio.h>
#include<windows.h>
using namespace std;
//**************************************************************************************
//函数名:InfusionFunc
//功能:封装远程注入的函数
//参数 1:进程ID
//参数 2:被注入函数指针<函数名>
//参数 3:参数
//参数 4:参数长度
//**************************************************************************************
void InfusionFunc(DWORD dwProcId,LPVOID mFunc, LPVOID Param, DWORD ParamSize)
{
    HANDLE hProcess;//远程句柄
    LPVOID mFuncAddr;//申请函数内存地址
    LPVOID ParamAddr;//申请参数内存地址
    HANDLE hThread;    //线程句柄
    DWORD NumberOfByte; // 返回值
    //打开被注入的进程句柄
    //PROCESS_ALL_ACCESS
    hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcId);
    //申请内存
    mFuncAddr = VirtualAllocEx(hProcess,NULL,128,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    ParamAddr = VirtualAllocEx(hProcess,NULL,ParamSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    //写内存
    WriteProcessMemory(hProcess,mFuncAddr,mFunc,128, &NumberOfByte);
    WriteProcessMemory(hProcess,ParamAddr,Param,ParamSize, &NumberOfByte);
    //创建远程线程
    hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)mFuncAddr,
                                 ParamAddr,0,&NumberOfByte);
    WaitForSingleObject(hThread, INFINITE); //等待线程结束
    //释放申请有内存
    VirtualFreeEx(hProcess,mFuncAddr,128,MEM_RELEASE);
    VirtualFreeEx(hProcess,ParamAddr,ParamSize,MEM_RELEASE);
    //释放远程句柄
    CloseHandle(hThread);
    CloseHandle(hProcess);
}

void dg(){
    _asm{
      pushad
            mov eax,0401270h
            call eax
      popad
    }
}

int main()
{
    int pid;
    cout<<"输入目标进程ID";
    cin>>pid;
    for(int i=0;i<100000;i++){
      InfusionFunc(pid,dg,NULL,NULL);
    }
    return 1;
}
B注入调dg函数100000次后,B内存占了100多M

zhuzhuli 发表于 2015-4-18 19:59:57

因为你释放代码写错了
如果 dwFreeType 为 MEM_RELEASE,则 dwSize 必须为0 . 按 VirtualAllocEx审请时的大小全部释放。

zhang_game 发表于 2015-4-18 20:00:43

有没有调试过啊,看下释放内存有没返回成功

zen1666542124 发表于 2015-4-20 20:05:14

谢谢楼主分享,支持 海论坛

wodeao 发表于 2015-4-27 21:21:31

虽然不需要可还是谢谢楼主辛苦了
页: [1]
查看完整版本: 为什么代码注入多次,目标程序的内存会越来越大