首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

VC远程调用CAll,好手在那里?小弟求帮

2013-07-04 
VC远程调用CAll,高手在那里?小弟求帮主要代码如下DWORD GetProcessIDByName(char *name){PROCESSENTRY32 e

VC远程调用CAll,高手在那里?小弟求帮
主要代码如下


DWORD GetProcessIDByName(char *name)
{
    
    PROCESSENTRY32 entry;
    entry.dwSize=sizeof(entry);
    HANDLE handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    
    bool tap=Process32First(handle,&entry);
    
    while(tap)
    {
        if(strcmp(entry.szExeFile,name)==0)
            return entry.th32ProcessID;
        tap=Process32Next(handle,&entry);
    }
    return -1;            
                
}
void M_InfusionFunc(DWORD pid,LPVOID mfun)
{   
    HANDLE hProcess;//远程句柄
    LPVOID mFuncAddr;//申请函数内存地址       
    HANDLE hThread;    //线程句柄 
    DWORD NumberOfByte; //辅助返回值  
    CString str; 
    //打开被注入的进程句柄   
    hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
    //申请内存 
    mFuncAddr = VirtualAllocEx(hProcess,NULL,128,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    //写内存 
    WriteProcessMemory(hProcess,mFuncAddr,mfun,128, &NumberOfByte);  
    //创建远程线程
    hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)mFuncAddr, 0,0,&NumberOfByte); 
    WaitForSingleObject(hThread, INFINITE); //等待线程结束
    //释放申请有内存  
    VirtualFreeEx(hProcess,mFuncAddr,128,MEM_RELEASE); 
    //释放远程句柄
    CloseHandle(hThread);  
    CloseHandle(hProcess); 
}  

void AddHP()
{        
    __asm     mov ebx,0x00994818
    __asm    mov edx,ebx
    __asm    mov eax,[ebx+0x124]
    __asm    call [ebx+0x120]


}
 
void CCodeDlg::OnButton1() 
{
    // TODO: Add your control notification handler code here
    DWORD id=GetProcessIDByName("游戏找CALL练习实例one.exe");
    M_InfusionFunc(id,AddHP);
    
}


那个进程id我调试了没问题呀,就是注入有问题,我用od跟了一下注入的地址,全是 jmp什么的,程序运行出错
再网上下了个注入器,注入了一下,又用od跟了一下,发现确实注入了,
现在就是为什么这段代码注入不了呢?那位大哥帮给指点一下
那个 “游戏找CALL练习实例one.exe”是我在网上下的找call的
发过的帖子没人回我就再发一次,嘿嘿
[解决办法]
  //创建远程线程
    hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)mFuncAddr, 0,0,&NumberOfByte); 
创建的远程线程有问题的,你要把你函数的代码写到注入进程的地址空间去
    WriteProcessMemory(hProcess,mFuncAddr,mfun,128, &NumberOfByte); // 有问题
[解决办法]
引用:
引用:
//创建远程线程
hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)mFuncAddr, 0,0,&NumberOfByte);
创建的远程线程有问题的,你要把你函数的代码写到注入进程的地址空间去
WriteProcessMemory(h……

仅仅是函数的地址?那不行的、、、你那函数在进程地址空间没有
下面是我创建远程线程,加载我的dll的代码,参考一下:
void CRemote_InjectDlg::OnInject() 
{
UpdateData(TRUE);
HANDLE  m_hRemote=::OpenProcess(PROCESS_QUERY_INFORMATION 
[解决办法]
   // Required by Alpha
PROCESS_CREATE_THREAD     
[解决办法]
   // For CreateRemoteThread
PROCESS_VM_OPERATION      
[解决办法]
   // For VirtualAllocEx/VirtualFreeEx
        PROCESS_VM_WRITE, 
NULL,m_PID);
if (NULL==m_hRemote)
{
AfxMessageBox("OpenProcess Error !");
}

DWORD RemoteThread_PID=0;
PWSTR MyParameter = NULL;     //base address of the allocated region of pages.



char *pszLibFile="ago.dll"; 
int cb  = (1+strlen(pszLibFile))* sizeof(char);
MyParameter=(PWSTR) VirtualAllocEx(m_hRemote,0,cb,MEM_COMMIT, PAGE_READWRITE);
if(MyParameter==NULL)
{
       AfxMessageBox("VirtualAllocEx Error !");
}

if(! WriteProcessMemory(m_hRemote,MyParameter,(LPVOID)pszLibFile,cb,NULL)   )
{
AfxMessageBox("WriteProcessMemory Error !");
}
HMODULE h_dll=LoadLibrary("Kernel32.dll");
LPTHREAD_START_ROUTINE FuncAdrr=(LPTHREAD_START_ROUTINE)GetProcAddress(h_dll,"LoadLibraryA");
HANDLE m_hRemoteThread=::CreateRemoteThread(m_hRemote,NULL,0,FuncAdrr,MyParameter,0,&RemoteThread_PID);
if (NULL==m_hRemoteThread)
{
AfxMessageBox("CreateRemoteThread Error !");
}

WaitForSingleObject(m_hRemoteThread, INFINITE);
if (MyParameter != NULL) 
VirtualFreeEx(m_hRemote, MyParameter, 0, MEM_RELEASE);

if (m_hRemoteThread  != NULL) 
CloseHandle(m_hRemoteThread);

if (m_hRemote != NULL) 
CloseHandle(m_hRemote);
FreeLibrary(h_dll);
//FreeLibrary(m_dll);


}

热点排行