Dll远线程注入

Author Avatar
Xzhah 7月 22, 2018
  • 在其它设备中阅读本文章

被注入的dll

功能:显示该进程所用到的所有dll

讲老实话我这个dll看得似懂非懂,按照自己的理解记录下来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include"..\CommonFiles\CmnHdr.h"
#include<tchar.h>
#include<stdio.h>

BOOL WINAPI DllMain(HINSTANCE hInstDll,DWORD fdwReason,PVOID fImpload){
if (fdwReason==DLL_PROCESS_ATTACH){ //加载时执行此函数
char szBuf[MAX_PATH*100]={0}; //内容数组
PBYTE pb=NULL;
MEMORY_BASIC_INFORMATION mbi;
while(VirtualQuery(pb,&mbi,sizeof(mbi))==sizeof(mbi)){//获取当前进程的内存地址信息(大概是遍历一遍加载了的dll?)
int nLen;
char szModName[MAX_PATH];
if(mbi.State==MEM_FREE)
mbi.AllocationBase=mbi.BaseAddress;
if((mbi.AllocationBase==hInstDll)||(mbi.AllocationBase!=mbi.BaseAddress)||(mbi.AllocationBase==NULL)){//该区域包含该DLL,则隐藏掉该DLL,不显示在后面对话框中||块不是区域的开始地址||区域地址为NULL
nLen=0;
}
else{
nLen=GetModuleFileNameA((HINSTANCE)mbi.AllocationBase,szModName,_countof(szModName));//把得到的信息写入szModName
}
if (nLen>0){
wsprintfA(strchr(szBuf,0),"\n%p-%s",mbi.AllocationBase,szModName);//信息存进szBuf
}
pb+=mbi.RegionSize;//指向下一个dll
}
chMB(&szBuf[1]);//输出
}return (TRUE);
}

远线程注入的进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include"stdafx.h"
#include "..\CommonFiles\CmnHdr.h"
#include<windowsx.h>
#include<stdio.h>
#include<tchar.h>
#include<malloc.h>
#include<TlHelp32.h>
#include "Resource.h"
#include<strsafe.h>

#ifdef UNICODE
#define InjectLib InjectLibW
#define EjectLib EjectLibW
#else
#define InjectLib InjectLibA
#define EjectLib EjectLibA
#endif


BOOL WINAPI InjectLibW(DWORD dwProcessId,PCWSTR pszLibFile){//参数dwProcessId表示进程ID,参数pszLibFile表示要注入的dll路径
BOOL bok=FALSE; //注入成功与否的标志
HANDLE hProcess =NULL,hThread =NULL;
PWSTR pszLibFileRemote=NULL;
__try{
hProcess=OpenProcess( //按照基本法打开进程
PROCESS_QUERY_INFORMATION|
PROCESS_CREATE_THREAD| //为了创造远线程
PROCESS_VM_OPERATION| //为了在目标进程申请/释放内存
PROCESS_VM_WRITE,FALSE,dwProcessId);//为了把dll路径写进目标进程
if (hProcess==NULL) __leave;
int cch =1+lstrlenW(pszLibFile);//存储dll路径所需要内存大小
int cb=cch*sizeof(wchar_t);
pszLibFileRemote=(PWSTR)VirtualAllocEx(hProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE);//在目标进程中申请内存用来存储Dll路径
if (pszLibFileRemote==NULL) __leave;
if(!WriteProcessMemory(hProcess,pszLibFileRemote,(PVOID)pszLibFile,cb,NULL)) __leave;//路径写入目标进程的内存
PTHREAD_START_ROUTINE pfnThreadRtn =(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibraryW");//得到LoadLibraryW的真实地址
if(pfnThreadRtn==NULL) __leave;
hThread=CreateRemoteThread(hProcess,NULL,0,pfnThreadRtn,pszLibFileRemote,0,NULL);//创建远线程,LoadLibraryW(指定dll)
if(hThread == NULL) __leave;
WaitForSingleObject(hThread,INFINITE);
bok=TRUE; //注入成功
}
__finally{
if(pszLibFileRemote!=NULL)
VirtualFreeEx(hProcess,pszLibFileRemote,0,MEM_RELEASE);//关闭句柄这些
if(hThread!=NULL)
CloseHandle(hThread);
if(hProcess!=NULL)
CloseHandle(hProcess);

}
return(bok);
}

BOOL WINAPI InjectLibA(DWORD dwProcessId,PCSTR pszLibFile){
SIZE_T cchSize=lstrlenA(pszLibFile)+1;
PWSTR pszLibFileW=(PWSTR)_alloca(cchSize*sizeof(wchar_t));
StringCchPrintfW(pszLibFileW,cchSize,L"%S",pszLibFile);//将ANSI路径名转化为等价的Unicode
return(InjectLibW(dwProcessId,pszLibFileW));
}

BOOL WINAPI EjectLibW(DWORD dwProcessId,PCWSTR pszLibFile){//撤销Dll
BOOL bok=FALSE;//撤销成功与否的标志
HANDLE hthSnapshot=NULL;
HANDLE hProcess=NULL,hThread =NULL;
__try{//抓取进程快照
hthSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwProcessId);
if(hthSnapshot==INVALID_HANDLE_VALUE) __leave;
MODULEENTRY32W me={sizeof(me)};
BOOL bFound=FALSE;
BOOL bMoreMods=Module32FirstW(hthSnapshot,&me);//得到dll库句柄
for(;bMoreMods;bMoreMods=Module32NextW(hthSnapshot,&me)){
bFound=(_wcsicmp(me.szModule,pszLibFile)==0)||(_wcsicmp(me.szExePath,pszLibFile)==0);//寻找目标dll是否被加载
if(bFound)
break;

}
if(!bFound) __leave;
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION| //获得目标进程的句柄
PROCESS_CREATE_THREAD|
PROCESS_VM_OPERATION,FALSE,dwProcessId);
if(hProcess==NULL) __leave;
PTHREAD_START_ROUTINE pfnThreadRtn=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"FreeLibrary");//获得FreeLibrary的真实地址
if (pfnThreadRtn==NULL) __leave;
hThread=CreateRemoteThread(hProcess,NULL,0,pfnThreadRtn,me.modBaseAddr,0,NULL);//创建远线程
if(hThread==NULL) __leave;
WaitForSingleObject(hThread,INFINITE);
bok=TRUE;//撤销成功


}__finally{
if(hthSnapshot!=NULL)
CloseHandle(hthSnapshot);//关闭句柄啥的
if(hThread!=NULL)
CloseHandle(hThread);
if(hProcess!=NULL)
CloseHandle(hProcess);
}
return(bok);
}

BOOL WINAPI EjectLibA(DWORD dwProcessId,PCSTR pszLibFile){
SIZE_T cchSize=lstrlenA(pszLibFile)+1;
PWSTR pszLibFileW=(PWSTR)_alloca(cchSize*sizeof(wchar_t));
StringCchPrintfW(pszLibFileW,cchSize,L"%s",pszLibFile);//将ANSI路径名转化为等价的Unicode
return(EjectLibW(dwProcessId,pszLibFileW));
}


BOOL Dlg_OnInitDialog(HWND hwnd,HWND hwndFocus,LPARAM lParam){
chSETDLGICONS(hwnd,IDI_INJLIB);
return(TRUE);
}

void Dlg_OnCommand(HWND hwnd,int id,HWND hwndCtrl,UINT codeNotity){
switch(id){
case IDCANCEL:
EndDialog(hwnd,id);
break;
case IDC_INJECT:
DWORD dwProcessId=GetDlgItemInt(hwnd,IDC_PROCESSID,NULL,FALSE);//从控件中获得数字,碰到非数字停止
if(dwProcessId==0)//注入本地进程
dwProcessId=GetCurrentProcessId();
TCHAR szLibFile[MAX_PATH];
GetModuleFileName(NULL,szLibFile,_countof(szLibFile));
PTSTR pFilename=_tcsrchr(szLibFile,TEXT('\\'))+1;
_tcscpy_s(pFilename,_countof(szLibFile)-(pFilename-szLibFile),TEXT("22_ImgWalk.DLL"));
if(InjectLib(dwProcessId,szLibFile)){
chVERIFY(EjectLib(dwProcessId,szLibFile));
chMB("DLL注入/撤销成功!");
}
else{
chMB("DLL注入/撤销失败!");
}
break;
}
}

INT_PTR WINAPI Dlg_Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
switch(uMsg){
chHANDLE_DLGMSG(hWnd,WM_INITDIALOG,Dlg_OnInitDialog);
chHANDLE_DLGMSG(hWnd,WM_COMMAND,Dlg_OnCommand);
}
return(FALSE);
}



int WINAPI _tWinMain(HINSTANCE hInstExe, HINSTANCE, PTSTR pszCmdLine, int){
DialogBox(hInstExe, MAKEINTRESOURCE(IDD_INJLIB), NULL, Dlg_Proc);
return (0);
}

resource.h&&.rc

这个我是看网上的大哥的,不知道为啥要改,书上没说要改啊?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 22_InjLib.rc 使用
//
#define IDD_INJLIB 1
#define IDC_INJECT 100
#define IDC_PROCESSID 101
#define IDI_INJLIB 101

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// 中文(简体,中国) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_INJLIB ICON "InjLib.ico"

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
TEXTINCLUDE
BEGIN
"resource.h\0"
END
TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END

#endif // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_INJLIB DIALOGEX 15, 24, 158, 24
STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "远程线程注入DLL"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
LTEXT "进程ID(10进制):",-1,4,6,69,8
EDITTEXT IDC_PROCESSID,78,4,36,12,ES_AUTOHSCROLL
DEFPUSHBUTTON "注入",IDC_INJECT,120,4,36,12,WS_GROUP
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_INJLIB, DIALOG
BEGIN
END
END
#endif // APSTUDIO_INVOKED

#endif // 中文(简体,中国) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

效果

本地成功

远线程注入QQ成功

#近期发现自己畏难情绪和懒惰情绪越来越严重,一定要克服