원격 스레드 주입 dll
// CommonInject.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <WinUser.h>
#include <WinDef.h>
#include <iostream>
#include <Tlhelp32.h>
using namespace std;
#include <Psapi.h>
#pragma comment(lib,"Psapi.lib")
// dll
HANDLE GetProcessWithName(const std::wstring &proc_name){
HANDLE hd = NULL;
HANDLE hpross = NULL;
int retls = 0;
PROCESSENTRY32 pinfo = {0};
wchar_t szFileName[MAX_PATH] = {0};
hpross = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(INVALID_HANDLE_VALUE == hpross)
{
return hd;
}
HANDLE hToken;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken))
{
LUID luid;
if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
{
TOKEN_PRIVILEGES TokenPrivileges;
TokenPrivileges.PrivilegeCount = 1;
TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
TokenPrivileges.Privileges[0].Luid = luid;
AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, 0, NULL, NULL);
}
CloseHandle(hToken);
}
pinfo.dwSize = sizeof(PROCESSENTRY32);
retls = Process32First(hpross,&pinfo);
while(retls)
{
swprintf_s(szFileName,_countof(szFileName)-1,L"%s",pinfo.szExeFile);
if (0 == _wcsicmp(szFileName,proc_name.c_str()))
{
hd = OpenProcess(PROCESS_ALL_ACCESS ,TRUE,pinfo.th32ProcessID);
}
if(!Process32Next(hpross, &pinfo))
{
break;
}
}
CloseHandle(hpross);
hpross = NULL;
return hd;
}
//
BOOL EnablePrivilege(LPWSTR name)
{
HANDLE hToken;
BOOL rv;
TOKEN_PRIVILEGES priv = {1, {0, 0, SE_PRIVILEGE_ENABLED}};
LookupPrivilegeValue(0, name, &priv.Privileges[0].Luid);
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
AdjustTokenPrivileges(hToken, FALSE, &priv, sizeof priv, 0, 0);
rv = GetLastError() == ERROR_SUCCESS;
CloseHandle(hToken);
return rv;
}
int inject(){
if (0 == EnablePrivilege(SE_DEBUG_NAME))
return 0;
DWORD dwPID;
PWSTR libFileRemote=NULL;
HANDLE hThread=NULL;
HANDLE handle=NULL;
__try{
int processid;
cout<<" id:"<<endl;
cin>>processid;
handle=GetProcessWithName(L"FileMD5.exe");
// handle=OpenProcess(PROCESS_ALL_ACCESS,TRUE, processid);
if(NULL==handle){
cout<<" "<<endl;
return -1;
}
std::string dllname="E:\\C++Code\\windows\\Dll\\myDll\\Debug\\myDll.dll";
libFileRemote=(PWSTR)VirtualAllocEx(handle,NULL,dllname.size(),MEM_COMMIT,PAGE_READWRITE);
if(libFileRemote==NULL){
cout<<" "<<::GetLastError()<<endl;
return -1;
}
BOOL RET=WriteProcessMemory(handle,libFileRemote,dllname.c_str(),dllname.size(),NULL);
if(RET ==FALSE){
cout<<" "<<endl;
}
PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");
hThread = CreateRemoteThread(handle, NULL, 0,
pfnThreadRtn, libFileRemote, 0, NULL);
if(hThread==NULL){
cout<<" ";
}
WaitForSingleObject(hThread, INFINITE);
cout<<" ";
}
__finally{
if (libFileRemote != NULL)
VirtualFreeEx(handle, libFileRemote, 0, MEM_RELEASE);
if (hThread != NULL)
CloseHandle(hThread);
if (handle != NULL)
CloseHandle(handle);
cout<<" ";
}
}
int _tmain(int argc, _TCHAR* argv[])
{
inject();
system("pause");
return 0;
}
유니버설 인코딩
프로세스 id를 입력하거나 프로세스 이름을 수정하여 대상 프로세스를 선택합니다.
원격 스레드 주입에 대한 설명
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.