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;
}

C++中使用反射动态加载和卸载DLL

C++中加载和卸载DLL是一件很容易的事,LoadLibrary和FreeLibrary让你能够轻易的在程序中加载DLL,然后在任何地方卸载。在C#中我们也能使用Assembly.LoadFile实现...
  • cxq_1993
  • cxq_1993
  • 2015年08月13日 10:24
  • 1508

卸载进程中的dll模块

如何在不结束进程的情况下卸载该进程中的dll模块还记得俺的威金专杀,当初为了省事,对那个注入的dll都是先TerminateProcess,然后DeleteFile,把那个该死的dll搞定,然后再Wi...
  • aasmfox
  • aasmfox
  • 2014年03月24日 16:22
  • 950

卸载进程中的dll模块

如何在不结束进程的情况下卸载该进程中的dll模块还记得俺的威金专杀,当初为了省事,对那个注入的dll都是先TerminateProcess,然后DeleteFile,把那个该死的dll搞定,然后再Wi...
  • aasmfox
  • aasmfox
  • 2014年03月24日 16:22
  • 950

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

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

实现DLL的注入与卸载

在Windows系统下,为了避免各个进程相互影响,每个进程的地址空间都是被隔离的。在执行DLL注入时需要通过创建“远程线程”来实现。所谓“远程线程”,并不是跨计算机,而是跨进程的。简而言之,就是进程A...
  • wzxq123
  • wzxq123
  • 2016年05月15日 19:10
  • 3389

远程DLL注入、卸载

Dll注入//dwPid 为目标进程PID //szDllName 为要注入的DLL文件 void CDllManageDlg::InjectDll(DWORD dwPid, CString szDl...
  • u012319493
  • u012319493
  • 2016年01月04日 16:15
  • 493

C++中使用反射动态加载和卸载DLL

C++中加载和卸载DLL是一件很容易的事,LoadLibrary和FreeLibrary让你能够轻易的在程序中加载DLL,然后在任何地方卸载。在C#中我们也能使用Assembly.LoadFile实现...
  • cxq_1993
  • cxq_1993
  • 2015年08月13日 10:24
  • 1508

让自己的dll注入到其他进程中运行

下面是一个简单的mydll.dll注入到QQ中运行的wg
  • anda0109
  • anda0109
  • 2014年11月20日 12:44
  • 8529

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

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

c++实现dll注入其它进程

DLL注入其他进程技术 阅读本篇文章,需要有《线程注入其他进程技术》基础。 DLL注入技术才具有强大的功能和使用性,同时简单易用,因为DLL中可以实现复杂的功能和很多的技术。     技术要...
  • ghevinn
  • ghevinn
  • 2014年03月18日 09:18
  • 8206
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:dll注入进程后卸载的代码
举报原因:
原因补充:

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