c++-注入DLL后无法找到API并HOOK

问题描述

注入DLL后无法找到API并HOOK

按照《WINDOWS核心编程》上的方法想HOOK MessageBoxA函数 我的实现如下
PopMB.exe 按确定键弹出一个MessageBox

PushDLL.exe 用来注入DLL

bool PushDll(ULONG ID){ //PopMB 的PROCESS ID
    void* pMemAddr=NULL;
    HANDLE hProc=NULL,hth=NULL;
    char DllName[128];
    strncpy(DllName,DLLNAME,127);
    bool bOK=false;
    __try{
        hProc=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,ID);
        if (hProc==NULL) __leave;
        UINT size=strlen(DllName)+1;
        size*=sizeof(char);
        pMemAddr=VirtualAllocEx(hProc,NULL,size,MEM_COMMIT,PAGE_READWRITE);
        if (!WriteProcessMemory(hProc,pMemAddr,DllName,size,NULL)) __leave;
        LPTHREAD_START_ROUTINE pAddr=(LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32.dll"),"LoadLibraryA");
        if (pAddr==NULL) __leave;
        hth=CreateRemoteThread(hProc,NULL,0,pAddr,(LPVOID)pMemAddr,0,NULL);
        if (hth==NULL) __leave;
        MessageBox(NULL,"Now WaitForSingleObject","",MB_OK);
        WaitForSingleObject(hth,INFINITE);
        bOK=true;
    }
    __finally{
        MessageBox(NULL,"Finally","",MB_OK);
        if (pMemAddr!=NULL)
            VirtualFreeEx(hProc,pMemAddr,0,MEM_RELEASE);
        if (hProc!=NULL)
            CloseHandle(hProc);
        if (hth!=NULL)
            CloseHandle(hth);
    }
    return bOK;
}

MB HOOK.DLL 用来HOOK MessageBoxA函数

// stdafx.h
#include <windows.h>
#include <windowsx.h>
#include <stdlib.h>
#include <conio.h>
#include <ImageHlp.h>
#include <string.h>
#include <stdio.h>
#pragma comment (lib,"ImageHlp")
// TODO: reference additional headers your program requires here
//MessageBoxA
//#define EXE_NAME "E:\desk\PushDLL\Debug\PopMB.exe"
WINUSERAPI int WINAPI MyMessageBox(HWND hWnd ,LPCSTR lpText,LPCSTR lpCaption,UINT uType);
typedef int (WINAPI* OldMessageBox)( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType ) ;
//WINBASEAPI VOID WINAPI MyExitProcess(UINT uExitCode);
//typedef VOID (WINAPI* OldExitProcess)(UINT uExitCode);

bool HookAPI(const char *DllName,PROC OldAddr,PROC NewAddr,HMODULE ExeHandle);
bool HookDLL(void);

/////////////end/////////

//stdafx.cpp
#include "stdafx.h"
PROC OldAddr;

int WINAPI MyMessageBox(HWND hWnd ,LPCSTR lpText,LPCSTR lpCaption,UINT uType){
    OldMessageBox pMB=(OldMessageBox)OldAddr;
    int ret=pMB(hWnd,lpText,lpCaption,uType);
    char S[16]="";
    sprintf(S,"%d",ret);
    pMB(NULL,S,"Return Value",MB_ICONWARNING|MB_OK);
    return ret;
}
bool HookDLL(void){
    OldAddr=GetProcAddress(GetModuleHandle("user32.dll"),"MessageBoxA");
    if (OldAddr==NULL)
        return false;
    char S[128];
    sprintf(S,"%p",OldAddr);
    MessageBox(NULL,"GetProcAddress succeed","",MB_OK);
    MessageBox(NULL,S,"",MB_OK|MB_ICONWARNING);
    HMODULE ExeHandle=GetModuleHandle(NULL);
    if (ExeHandle==NULL)
        return false;
    MessageBox(NULL,"GetModuleHandle succeed","",MB_OK);
    PROC NewAddr=(PROC)MyMessageBox;
    //PROC NewAddr=(PROC)MyExitProcess;
    if (NewAddr==NULL)
        return false;
    MessageBox(NULL,"get new fun succeed","",MB_OK);

    return HookAPI("user32.dll",OldAddr,NewAddr,ExeHandle);
}

bool HookAPI(const char *DllName,PROC OldAddr,PROC NewAddr,HMODULE ExeHandle){
    ULONG ulSize=0L;
    IMAGE_IMPORT_DESCRIPTOR *pID=NULL;
    __try{
        pID=(IMAGE_IMPORT_DESCRIPTOR*)ImageDirectoryEntryToData(ExeHandle,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&ulSize);
    }
    __except(GetExceptionInformation()){
        ;
    }
    if (pID==NULL)
        return false;
    MessageBox(NULL,"ImageDirectoryEntryToData succeed","",MB_OK);
    for(;pID->Name;pID++){
        char *Name=(char*)((BYTE*)ExeHandle+pID->Name);
        MessageBox(NULL,Name,"",MB_ICONWARNING|MB_OK);
        if (stricmp(DllName,Name)==0){
            MessageBox(NULL,"DLL has founded","",MB_OK);
            IMAGE_THUNK_DATA *pThunk=(IMAGE_THUNK_DATA*) ((BYTE*)ExeHandle+pID->FirstThunk);
            for(;(pThunk->u1.Function)!=NULL;pThunk++){
                PROC *pFun=(PROC*)&pThunk->u1.Function;
                bool bFound=(*pFun==OldAddr)?true:false;
                if (bFound){
                    MessageBox(NULL,"function has founded","",MB_OK);
                    if (!WriteProcessMemory(GetCurrentProcess(),pFun,&NewAddr,sizeof(NewAddr),NULL) && (ERROR_NOACCESS==GetLastError())){
                        DWORD OldPermit;
                        if (VirtualProtect(pFun,sizeof(NewAddr),PAGE_WRITECOPY,&OldPermit)){
                            WriteProcessMemory(GetCurrentProcess(),pFun,&NewAddr,sizeof(NewAddr),NULL);
                            VirtualProtect(pFun,sizeof(NewAddr),OldPermit,&OldPermit);
                        }
                    }
                    return true;
                }
            }
        }
    }
    return false;
}
///////end//////
//MB_HOOK.cpp
#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch(ul_reason_for_call){
    case DLL_PROCESS_ATTACH:
        MessageBox(NULL,"DLL called","",MB_OK);
        char S[512];
        GetModuleFileName(NULL,S,512);
        MessageBox(NULL,S,"",MB_OK);
        MessageBox(NULL,(HookDLL())?"Succeed":"Failed","",MB_OK);
        break;
    }
    return TRUE;
}
////////end//////////

问题是,每次成功注入DLL后,每次HookAPI函数只能找到USER32.dll并弹出"DLL has founded",但是就是找不到匹配的MessageBoxA的地址("function has founded"始终不出现)。
Debug Release都试过,改成HOOKKERNEL32.dll里的ExitProcess (《WINDOWS核心编程》上的例子) 也不行。但是如果把DLL中的函数全部复制到一个EXE中且让这个EXE HOOK 自身总能成功。编译器是VC++ 6.0

解决方案

这些系统dll在win7等。都有了变化,保护等。用xp操作系统试试呢

解决方案二:

这些系统dll在win7等。都有了变化,保护等。用xp操作系统试试呢

时间: 2025-01-02 09:38:46

c++-注入DLL后无法找到API并HOOK的相关文章

Windows x86/ x64 Ring3层注入Dll总结_win服务器

0x01.前言 提到Dll的注入,立马能够想到的方法就有很多,比如利用远程线程.Apc等等,这里我对Ring3层的Dll注入学习做一个总结吧. 我把注入的方法分成六类,分别是:1.创建新线程.2.设置线程上下背景文,修改寄存器.3.插入Apc队列.4.修改注册表.5.挂钩窗口消息.6.远程手动实现LoadLibrary. 那么下面就开始学习之旅吧! 0x02.预备工作 在涉及到注入的程序中,提升程序的权限自然是必不可少的,这里我提供了两个封装的函数,都可以用于提权.第一个是通过权限令牌来调整权限

c++-C++open后如何找到文件指针地址

问题描述 C++open后如何找到文件指针地址 大家好,我以往用C编程,现在在尝试融合两个工程,但工程用C++写的,fd.read(buf, length)读文件,我想知道从fd中怎么找到指向文件的指针,我想把指针地址传给另一个工程 解决方案 两个工程,需要把其中一个编译为dll 解决方案二: 指针地址长度 解决方案三: fd.read的fd肯定是一个类!求指针用&fd 解决方案四: 看不懂,描述不是很清晰.首先open的对象是一个文件(或设备),打开之后返回一个文件描述符fd,如果设备或者文件

[C#] - 注入DLL

原文:http://xyzlht.blog.163.com/blog/static/69301417200882834211787/     using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms; us

dll-在 v2010中引用某个Dll后 所有.net程序无法运行

问题描述 在 v2010中引用某个Dll后 所有.net程序无法运行 重装的系统及vs2010. 一切正常. 在引用某个从网上下载的mysql.data.dll后,所有的.net程序都无法运行,就像没有安装framework一样. 但用IIS加载.net网页没问题. 运行不了后尝试重装过vs2010,所有framework运行库,重注册dll,都没用. 请问不重装系统怎么破? 解决方案 估计引用dll和你的系统崩溃之间只是巧合.你的系统被流氓软件破坏了. 不重装系统要想解决除非你有足够多的钱和时

linux驱动加载后能找到设备,但是/dev下不能找到设备文件

问题描述 linux驱动加载后能找到设备,但是/dev下不能找到设备文件 linux驱动加载后能找到设备,但是/dev下不能找到设备文件,我用的是动态分配设备号,insmod也能通过,但是/dev下就是找不到设备文件,加载后也不能通过测试程序我基本上直接用的板子例程,静态动态我都试了,就是不行,日志文件里面也什么都没有,板子是2410的,主机是红帽的,希望大神能够指点迷津/*****************************************Copyright (c)********

C#如何将一个方法公开出去,先在一个类库中声明生成dll后,在主程序中实现,求如何实现

问题描述 C#如何将一个方法公开出去,先在一个类库中声明生成dll后,在主程序中实现,求如何实现 就是主程序的一个方法 继承类库声明的方法后 通过类库生成的dll公开出去,主程序要如何让实现类库中声明的方法 解决方案 插件引用主程序可以了,也可以做一个公共的dll,插件和主程序都引用它. 在这个dll或者主程序中定义接口或者抽象类,在插件中实现或者继承

win7-CreateRemoteThread返回非零值,WIN7 64位注入dll到explorer失败

问题描述 CreateRemoteThread返回非零值,WIN7 64位注入dll到explorer失败 2298为explorer的PID DLL为64位 ,process explorer查看不到explorer中有此DLL模块 // TODO: 在此添加控件通知处理程序代码 //This dll path should be relative to the target process or an absolute path char* dll = "D:\ggg\TEST_TrayCl

android-关于apk反编译后无法找到对应汉化字符串的问题

问题描述 关于apk反编译后无法找到对应汉化字符串的问题 如题,对一个apk用apktool反编译后,resvalues下只有strings.xml和public.xml, 且其中只有显示的app名称,再无其他可以汉化的语句,翻遍其它文件夹下的.xml都没有 找到可汉化的字符串,请问这个apk是被加密了吗,有什么方法可破? 很费解到底是怎么一回事. 另附反编后的文件解包后的文件 解决方案 还可能编码了,不是汉字明文,比如是UTF8等编码,然后再解码显示的,所以直接找不到对应汉字 解决方案二: 有

windows-使用dll注入器注入dll的问题

问题描述 使用dll注入器注入dll的问题 我的电脑是win64位的,我在使用dll注入工具(v1.2.0.2)时,为什么不显示explorer.exe进程和其他的一些windows进程啊,求解. 解决方案 使用DLL的问题APC注入DLL(win7下有问题)APC注入DLL(win7下有问题)