- 注册时间
- 2021-4-16
- 最后登录
- 2024-4-1
- 在线时间
- 1 小时
编程入门
- 龙马币
- 19
|
远程线程:
- #include<windows.h>
- #include<stdio.h>
-
- //函数地址:00C31740
- int main() {
-
- HANDLE hThread;
- HANDLE hProcess;
-
- // 1、得到要在其进程中创建线程的进程句柄
- hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,10940);
-
- if (hProcess == NULL) {
- OutputDebugString("OpenProcess fail");
- return -1;
- }
- // 2、通过进程句柄创建线程
- hThread = CreateRemoteThread(
- hProcess,
- NULL, //获取默认的安全描述符,当前用户的令牌权限
- 0, //使用可执行文件的默认大小
- (LPTHREAD_START_ROUTINE)0x010817E0, // 创建线程调用的函数
- NULL, // 传递函数中的参数
- 0, //线程在创建后立即运行
- NULL // 不返回线程标识符
- );
-
- if (hThread == NULL) {
- OutputDebugString("CreateRemoteThread fail");
- CloseHandle(hProcess);
- return -1;
- }
-
- printf("线程启动!\n");
-
- // 3、释放资源
- CloseHandle(hThread);
- getchar(); //进行堵塞
- return 0;
-
- }
复制代码
远程线程注入:
- #include<Windows.h>
- #include<Tlhelp32.h>
- #include<stdio.h>
- /*
- 远程线程注入
- 代码写的不太严谨,大家谅解
- */
-
- DWORD GetOneProcessPid(const char *FileName) {
- HANDLE hSnapShot;
- PROCESSENTRY32 pro32;
-
- pro32.dwSize = sizeof(PROCESSENTRY32);
- // 1、获得当前进程的快照
-
- hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
-
- if (hSnapShot == INVALID_HANDLE_VALUE) {
- return -1;
- }
-
- bool bMore;
- // 2、遍历进程的名称是否为指定名称,获取指定进程名称的PID
- bMore = Process32First(hSnapShot, &pro32);
- while (bMore) {
- // 3、获取指定进程名称的PID
- if (!strcmp(pro32.szExeFile, FileName)) {
- return pro32.th32ProcessID;
- }
- bMore = Process32Next(hSnapShot, &pro32); //遍历
- }
-
- // 4、释放资源
- CloseHandle(hSnapShot);
-
- return 0;
- }
- DWORD WINAPI ThreadProc(LPVOID lpParameter) {
- return 0;
- }
-
- bool LoadDll(DWORD ProcessPid,const char *DllPath) {
- HANDLE hProcess;
- DWORD DllPathLen;
- PDWORD addr;
- HMODULE hModule;
- PDWORD FuncAddr;
- // 1、获取要注入进程的句柄
- hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessPid);
- if (hProcess == NULL) {
- return false;
- }
-
- // 2、获取DLL的信息
- DllPathLen = strlen(DllPath) + 1; //+1的原因结尾需要\0 结尾
-
- // 3、申请指定进程中的内存
- addr = (PDWORD)VirtualAllocEx(
- hProcess, //申请指定进程的句柄
- NULL, // 安全描述符
- DllPathLen, // 申请内存的字节大小
- MEM_COMMIT, //
- PAGE_READWRITE // 内存的属性
- );
-
- printf("%x", addr);
-
- // 4、将DLL的信息写入到要注入的进程内存中
- WriteProcessMemory(hProcess, addr, DllPath, DllPathLen, NULL);
-
- // 5、要获取其进程的LoadLibraryA/W的函数地址,该函数保存在系统中的Kernel32.dll中,那么需要先获得Kernel32.dll的句柄
- hModule = GetModuleHandle("Kernel32.dll");
-
- // 6、从中获得LoadLibraryA/W的函数地址
- FuncAddr = (PDWORD)GetProcAddress(hModule, "LoadLibraryA"); //返回值为函数地址
-
- // 7、注入到指定进程中进行加载内存中申请的DLL信息,把LoadLibraryA的地址作为函数 来加载addr,也就是DLL的路径
- CreateRemoteThread(hProcess, NULL, 0, LPTHREAD_START_ROUTINE(FuncAddr), addr, 0, NULL);
-
- return true;
- }
- int main() {
- LoadDll(GetOneProcessPid("x.exe"),"C:\\Users\\dell\\Desktop\\test\\DLL2.dll");
- return 0;
- }
复制代码
|
|