Posted on 2006-07-15 01:02
紫雨轩 C++ 阅读(988)
评论(1) 编辑 收藏 引用 所属分类:
MFC
#include
"
stdafx.h
"
#include
"
Injection.h
"
#ifdef _DEBUG
#define
new DEBUG_NEW
#endif
//
唯一的应用程序对象
CWinApp theApp;
using
namespace
std;
typedef
struct
_RemotePara{
//
参数结构
char
pMessageBox[
12
];
DWORD dwMessageBox;
}RemotePara;
//
远程线程
DWORD __stdcall ThreadProc (RemotePara
*
lpPara){
typedef
int
(__stdcall
*
MMessageBoxA)(HWND,LPCTSTR,LPCTSTR,DWORD);
//
定义MessageBox函数
MMessageBoxA myMessageBoxA;
myMessageBoxA
=
(MMessageBoxA) lpPara
->
dwMessageBox ;
//
得到函数入口地址
myMessageBoxA(NULL,lpPara
->
pMessageBox ,lpPara
->
pMessageBox,
0
);
//
call
return
0
;
}
void
EnableDebugPriv();
//
提升应用级调试权限
int
_tmain(
int
argc, TCHAR
*
argv[], TCHAR
*
envp[])
{
const
DWORD THREADSIZE
=
1024
*
4
;
DWORD byte_write;
EnableDebugPriv();
//
提升权限
HANDLE hWnd
=
::OpenProcess (PROCESS_ALL_ACCESS,FALSE,
760
);
if
(
!
hWnd)
return
0
;
void
*
pRemoteThread
=
::VirtualAllocEx(hWnd,
0
,THREADSIZE,MEM_COMMIT
|
MEM_RESERVE,PAGE_EXECUTE_READWRITE);
if
(
!
pRemoteThread)
return
0
;
if
(
!
::WriteProcessMemory(hWnd,pRemoteThread,
&
ThreadProc,THREADSIZE,
0
))
return
0
;
//
再付值
RemotePara myRemotePara;
::ZeroMemory(
&
myRemotePara,
sizeof
(RemotePara));
HINSTANCE hUser32
=
::LoadLibrary (
"
user32.dll
"
);
myRemotePara.dwMessageBox
=
(DWORD) ::GetProcAddress (hUser32 ,
"
MessageBoxA
"
);
strcat(myRemotePara.pMessageBox,
"
hello\0
"
);
//
写进目标进程
RemotePara
*
pRemotePara
=
(RemotePara
*
) ::VirtualAllocEx (hWnd ,
0
,
sizeof
(RemotePara),MEM_COMMIT,PAGE_READWRITE);
//
注意申请空间时的页面属性
if
(
!
pRemotePara)
return
0
;
if
(
!
::WriteProcessMemory (hWnd ,pRemotePara,
&
myRemotePara,
sizeof
myRemotePara,
0
))
return
0
;
//
启动线程
HANDLE hThread
=
::CreateRemoteThread (hWnd ,
0
,
0
,(DWORD (__stdcall
*
)(
void
*
))pRemoteThread ,pRemotePara,
0
,
&
byte_write);
if
(
!
hThread){
return
0
;
}
return
0
;
}
void
EnableDebugPriv(
void
)
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;
if
(
!
OpenProcessToken( GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES
|
TOKEN_QUERY,
&
hToken ) )
return
;
if
(
!
LookupPrivilegeValue( NULL, SE_DEBUG_NAME,
&
sedebugnameValue ) ){
CloseHandle( hToken );
return
;
}
tkp.PrivilegeCount
=
1
;
tkp.Privileges[
0
].Luid
=
sedebugnameValue;
tkp.Privileges[
0
].Attributes
=
SE_PRIVILEGE_ENABLED;
if
(
!
AdjustTokenPrivileges( hToken, FALSE,
&
tkp,
sizeof
tkp, NULL, NULL ) )
CloseHandle( hToken );
}