当前位置:编程学习 > C/C++ >>

远程注入执行函数

      最近在看病毒相关内容,看着大部分知识都知道,不知道用起来行不行。下午正好有人问怎么注入线程,在公司用《windows核心编程》的注入DLL程序修改了一下,实现了远程注入DLL调用函数。刚才回来,觉得照着别人的程序改,总还是学不到家,自己花了两个小时写了一个。能注入到其他进程中,执行弹出MessageBox框。当然,能注入去弹出这个框,就能干很多坏事了,看你想干什么了。把代码贴上来,也不改了,反正能看懂。有几个细节可能会忽略:
 
      1. ThreadFunc应该定义成static,不能是全局函数。如果是全局函数,只能取到jmp ThreadFunc这块代码的地址。
 
      2. 在调试模式会使写函数数据时数据出错。
 
下午就被这两个东西浪费了一个多小时。
 
     
 
 
 
[cpp]  
// InjectToRemoteProcess.cpp : 定义应用程序的入口点。  
//  
  
#include "stdafx.h"  
#include "InjectToRemoteProcess.h"  
  
#define MAX_LOADSTRING 100  
  
// 全局变量:  
HINSTANCE hInst;                                // 当前实例  
TCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本  
TCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名  
  
// 此代码模块中包含的函数的前向声明:  
ATOM                MyRegisterClass(HINSTANCE hInstance);  
BOOL                InitInstance(HINSTANCE, int);  
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);  
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);  
INT_PTR CALLBACK    Inject(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);  
  
int APIENTRY _tWinMain(HINSTANCE hInstance,  
                     HINSTANCE hPrevInstance,  
                     LPTSTR    lpCmdLine,  
                     int       nCmdShow)  
{  
    UNREFERENCED_PARAMETER(hPrevInstance);  
    UNREFERENCED_PARAMETER(lpCmdLine);  
  
    // TODO: 在此放置代码。  
    MSG msg;  
    HACCEL hAccelTable;  
  
    // 初始化全局字符串  
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);  
    LoadString(hInstance, IDC_INJECTTOREMOTEPROCESS, szWindowClass, MAX_LOADSTRING);  
    MyRegisterClass(hInstance);  
  
    // 执行应用程序初始化:  
    if (!InitInstance (hInstance, nCmdShow))  
    {  
        return FALSE;  
    }  
  
    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_INJECTTOREMOTEPROCESS));  
  
    // 主消息循环:  
    while (GetMessage(&msg, NULL, 0, 0))  
    {  
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))  
        {  
            TranslateMessage(&msg);  
            DispatchMessage(&msg);  
        }  
    }  
  
    return (int) msg.wParam;  
}  
  
  
  
//  
//  函数: MyRegisterClass()  
//  
//  目的: 注册窗口类。  
//  
//  注释:  
//  
//    仅当希望  
//    此代码与添加到 Windows 95 中的“RegisterClassEx”  
//    函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,  
//    这样应用程序就可以获得关联的  
//    “格式正确的”小图标。  
//  
ATOM MyRegisterClass(HINSTANCE hInstance)  
{  
    WNDCLASSEX wcex;  
  
    wcex.cbSize = sizeof(WNDCLASSEX);  
  
    wcex.style          = CS_HREDRAW | CS_VREDRAW;  
    wcex.lpfnWndProc    = WndProc;  
    wcex.cbClsExtra     = 0;  
    wcex.cbWndExtra     = 0;  
    wcex.hInstance      = hInstance;  
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_INJECTTOREMOTEPROCESS));  
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);  
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);  
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_INJECTTOREMOTEPROCESS);  
    wcex.lpszClassName  = szWindowClass;  
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));  
  
    return RegisterClassEx(&wcex);  
}  
  
//  
//   函数: InitInstance(HINSTANCE, int)  
//  
//   目的: 保存实例句柄并创建主窗口  
//  
//   注释:  
//  
//        在此函数中,我们在全局变量中保存实例句柄并  
//        创建和显示主程序窗口。  
//  
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)  
{  
   HWND hWnd;  
  
   hInst = hInstance; // 将实例句柄存储在全局变量中  
  
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,  
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);  
  
   if (!hWnd)  
   {  
      return FALSE;  
   }  
  
   ShowWindow(hWnd, nCmdShow);  
   UpdateWindow(hWnd);  
  
   return TRUE;  
}  
  
//  
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)  
//  
//  目的: 处理主窗口的消息。  补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,