dll注入进程后卸载的代码

原创 2006年05月23日 21:03:00
//App.cpp
#include "stdafx.h"
#include <windows.h>


#define MAX_SIZE 1024*16
#define DLL "D:/Code/TestCode/UnloadDll/UnloadDll/Debug/demo.dll" // 需要完整路径
HMODULE LoadRemoteLibrary(HANDLE hProcess,const char *pcLibraryName
);
BOOL FreeRemoteLibrary(HANDLE hProcess, HMODULE hRemoteLibrary
);


int main(int argc, char* argv
[])
{
    
DWORD dwPID = 0
;
    
HANDLE hNewHandle = NULL
;
    
HMODULE hRemoteHandle = NULL
;
    
int i=0
;
    if(
argc < 2
)
    {
        return -
1
;
    }

    
dwPID = atoi(argv[1
]);

    
hNewHandle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPID
);

    if(
NULL == hNewHandle
)
    {
        
printf("[-] OpenProcess failed.../r/n"
);
        return -
2
;
    }

    
hRemoteHandle = LoadRemoteLibrary(hNewHandle,DLL
);
    
    if(
NULL == hRemoteHandle  
)
    {
        
printf("[-] LoadRemoteLibaray failed.../r/n"
);
        return -
3
;
    }
    
    
printf("[+] LoadRemoteLibaray succeed!/r/n"
);

    for(
i=0;i<=20;i
++)
    {
        
printf("."
);
        
Sleep(100
);
    }
    
printf("/r/n"
);

    if(
FreeRemoteLibrary(hNewHandle,hRemoteHandle) == NULL
)
    {
        
printf("[-] FreeRemoteLibaray failed.../r/n"
);
        return -
4
;
    }
    
printf("[+] FreeRemoteLibrary succeed!/r/n"
);
    return
0
;
}

HMODULE LoadRemoteLibrary(HANDLE hProcess,const char *pcLibraryName
)
{
    
void* pvRemoteMem=NULL
;
    
DWORD dwBytesWritten
;
    
HMODULE nRet=NULL
;
    
DWORD dwRemoteThreadId
;
    
HANDLE hRemoteThread=NULL
;

    
__try
    
{
        
pvRemoteMem=VirtualAllocEx(hProcess,NULL,strlen(pcLibraryName)+1,MEM_COMMIT,PAGE_EXECUTE_READWRITE
);
        if (
NULL == pvRemoteMem
)
        {
            
printf("[-] VirtualAllocEx failed.../r/n"
);
            
__leave
;
        }

        if (
FALSE == WriteProcessMemory(hProcess,pvRemoteMem,(void*)pcLibraryName,strlen(pcLibraryName)+1,&dwBytesWritten
))
        {
            
printf("[-] WriteProcessMemory failed.../r/n"
);
            
__leave
;
        }
        
hRemoteThread=CreateRemoteThread(hProcess,NULL,MAX_SIZE,(LPTHREAD_START_ROUTINE
)
#ifdef UNICODE
        
GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryW"
),
#else
        
GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"
),
#endif
        
pvRemoteMem,0,&dwRemoteThreadId
);
        if (
NULL == hRemoteThread
)
        {
            
printf("[-] CreateRemoteThread failed.../r/n"
);
            
__leave
;
        }
        else
        {
            
__try
            
{
                
WaitForSingleObject(hRemoteThread,INFINITE
);
                
GetExitCodeThread(hRemoteThread,(DWORD*)&nRet
);
                
printf("ErrorCode:%d/r/n",GetLastError
() );
            }
            
__finally
            
{
                
CloseHandle(hRemoteThread
);
            }
        }
    }
    
__finally
    
{
        if (
NULL != pvRemoteMem
)
            
VirtualFreeEx(hProcess,pvRemoteMem,0,MEM_RELEASE
);
    }
    return
nRet
;
}

BOOL FreeRemoteLibrary(HANDLE hProcess, HMODULE hRemoteLibrary
)
{
    
DWORD dwRemoteThreadId
;
    
HANDLE hRemoteThread
;
    
BOOL nRet
;

    
hRemoteThread=CreateRemoteThread(hProcess,NULL,MAX_SIZE
,
        (
LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll"), "FreeLibrary"),(void*)hRemoteLibrary,0,&dwRemoteThreadId
);
    
    if (
NULL == hRemoteThread
)
        return
FALSE
;
    
    
WaitForSingleObject(hRemoteThread,INFINITE
);
    
GetExitCodeThread(hRemoteThread,(DWORD*)&nRet
);
    return
nRet
;
}


Code:

//DemoDll.cpp
#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule,
                       
DWORD  ul_reason_for_call,
                       
LPVOID lpReserved
                    
)
{
    
MessageBox(NULL,"DemoMessage","MSG",MB_OK);
    return
TRUE;
}

相关文章推荐

VC下提前注入进程的一些方法1——远线程不带参数

前些天一直在研究Ring3层的提前注入问题。所谓提前注入,就是在程序代码逻辑还没执行前就注入,这样做一般用于Hook API。(转载请指明出处)自己写了个demo,在此记下。         我的de...

不结束进程卸载关键进程中DLL文件的方法

问题关键就是所插入的进程不能被终止  许多木马注入到系统里关键进程中,比如svchost.exe、smss.exe、winlogon.exe进程。这些进程使用普通方式无法结束,使用特殊工具结束掉...

注入钩子 安全卸载进程模块 UM

  • 2009年08月17日 14:41
  • 98KB
  • 下载

DLL注入进程Delphi代码

  • 2011年04月06日 09:49
  • 1.64MB
  • 下载

远程注入与卸载DLL

//提升本进程权限 BOOL GetPrivilege() { HANDLE tokenHandle; BOOL bRet = OpenProcessToken(GetCurrentProcess...

DLL的远程注入及卸载技术详解

DLL的远程注入技术是目前Win32病毒广泛使用的一种技术。使用这种技术的病毒体通常位于一个DLL中,在系统启动的时候,一个EXE程序会将这个DLL加载至某些系统进程(如Explorer.exe)中运...
  • sky04
  • sky04
  • 2011年11月30日 13:27
  • 2165

初学C++ 远程线程注入DLL与卸载

//提升权限 void DebugPrivilege() {  HANDLE hToken = NULL;  //打开当前进程的访问令牌  int hRet = OpenProcessTok...

源码解析DLL自卸载无模块注入

对windows安全比较熟悉的同学对模块注入应该都比较了解,很多病毒、木马、外挂都会用到,无模块注入应用得则比较少。      无模块注入的好处是DLL注入进去后,确实已经不以模块的形式存在了,用任...
  • justFWD
  • justFWD
  • 2014年11月14日 18:06
  • 2579

C++ DLL远程注入与卸载函数

代码是别处的 第一个函数是成功的,第二个函数运行发现会将目标程序挂死,也许是目标程序有保护机制 支持Unicode编码。 //--------------------...
  • sky04
  • sky04
  • 2011年11月30日 14:52
  • 4469
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:dll注入进程后卸载的代码
举报原因:
原因补充:

(最多只允许输入30个字)