VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 259|回复: 1

[讨论] [求助]无dll的远程线程注入导致被注入程序崩溃

[复制链接]
23_avatar_middle
在线会员 PeterZ 发表于 2018-8-18 20:50:07 | 显示全部楼层 |阅读模式
写了一段无dll的远程线程注入代码,可是为什么每次注入都会导致被注入程序崩溃?一直没有找到原因,请大家帮个忙,谢谢!

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <iostream>
  4. #include <string>
  5. #include <string.h>
  6. #include <windows.h>
  7. #include <strsafe.h>
  8. #include <tlhelp32.h>

  9. #define MAX_LENGTH 30
  10. #pragma warning(disable:4996)

  11. using namespace std;

  12. typedef struct _RemoteParam
  13. {
  14.     CHAR szOperation[10];
  15.     CHAR szAddrerss[MAX_LENGTH];
  16.     DWORD dwSeAdress;
  17. }RemoteParam;

  18. DWORD WINAPI ThreadProc(RemoteParam *lprp)
  19. {
  20.     typedef HINSTANCE(WINAPI *MShellExecute)(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd);
  21.     MShellExecute MSE;
  22.     MSE = (MShellExecute)lprp->dwSeAdress;
  23.     MSE(NULL, lprp->szOperation, lprp->szAddrerss, NULL, NULL, SW_SHOWNORMAL);
  24.     return 0;
  25. }

  26. DWORD GetProcessID(CHAR *ProcessName)
  27. {
  28.     PROCESSENTRY32 pe32;
  29.     pe32.dwSize = sizeof(pe32);
  30.     HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  31.     if (hProcessSnap == INVALID_HANDLE_VALUE)
  32.     {
  33.         printf("CreateToolhelp32Snapshot error");
  34.         return 0;
  35.     }
  36.     BOOL bProcess = Process32First(hProcessSnap, &pe32);
  37.     while (bProcess)
  38.     {
  39.         if (strcmp(strupr(pe32.szExeFile), strupr(ProcessName)) == 0)
  40.             return pe32.th32ProcessID;
  41.         bProcess = Process32Next(hProcessSnap, &pe32);
  42.     }
  43.     CloseHandle(hProcessSnap);
  44.     return 0;
  45. }

  46. int EnableDebugPriv(const TCHAR *name)
  47. {
  48.     HANDLE hToken;
  49.     TOKEN_PRIVILEGES tp;
  50.     LUID luid;
  51.     if (!OpenProcessToken(GetCurrentProcess(),
  52.         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
  53.         &hToken))
  54.     {
  55.         printf("OpenProcessToken error\n");
  56.         return 1;
  57.     }
  58.     if (!LookupPrivilegeValue(NULL, name, &luid))
  59.     {
  60.         printf("LookupPrivilege error!\n");
  61.         return 1;
  62.     }
  63.     tp.PrivilegeCount = 1;
  64.     tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  65.     tp.Privileges[0].Luid = luid;
  66.     if (!AdjustTokenPrivileges(hToken, 0, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
  67.     {
  68.         printf("AdjustTokenPrivileges error!\n");
  69.         return 1;
  70.     }
  71.     return 0;
  72. }

  73. BOOL InjectProcess(const DWORD dwPid)
  74. {
  75.     if (EnableDebugPriv(SE_DEBUG_NAME)) return FALSE;
  76.     HANDLE hWnd = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
  77.     if (!hWnd) return FALSE;
  78.     RemoteParam rp;
  79.     ZeroMemory(&rp, sizeof(RemoteParam));
  80.     rp.dwSeAdress = (DWORD)GetProcAddress(LoadLibrary("Shell32.dll"), "ShellExecuteA");
  81.     StringCchCopy(rp.szAddrerss, sizeof(rp.szAddrerss), "https://www.baidu.com");
  82.     StringCchCopy(rp.szOperation, sizeof(rp.szOperation), "open");
  83.     RemoteParam *pRemoteParam = (RemoteParam *)VirtualAllocEx(hWnd, 0, sizeof(RemoteParam), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  84.     if (!pRemoteParam) return FALSE;
  85.     if (!WriteProcessMemory(hWnd, pRemoteParam, &rp, sizeof(RemoteParam), 0)) return FALSE;
  86.     LPVOID pRemoteThread = VirtualAllocEx(hWnd, 0, 1024 * 4, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  87.     if (!pRemoteThread) return FALSE;
  88.     if (!WriteProcessMemory(hWnd, pRemoteThread, &ThreadProc, 1024 * 4, 0)) return FALSE;
  89.     HANDLE hThread = CreateRemoteThread(hWnd, NULL, 0, (LPTHREAD_START_ROUTINE)pRemoteThread, (LPVOID)pRemoteParam, 0, NULL);
  90.     if (!hThread) return FALSE;
  91.     return TRUE;
  92. }

  93. int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
  94. {
  95.     CHAR szProcName[MAX_LENGTH] = "\0";
  96.     StringCchCopy(szProcName, MAX_LENGTH, "explorer.exe");
  97.     InjectProcess(GetProcessID(szProcName));
  98.     return 0;
  99. }
复制代码




上一篇:价值666元的网易云IOS逆向与安全
下一篇:找大神做个点赞关注软件

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

51_avatar_middle
online_admins Syc 发表于 2018-8-19 23:27:11 | 显示全部楼层
这个光用眼睛看还真不太好确定问题所在!
最好给代码加一些LOG吧,看看到底是哪行代码处的问题导致目标进程崩溃
也可以一行一行的试,看看到底是哪行代码引起的

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-11-14 20:12

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表