`

远程dll注入 C#

    博客分类:
  • C#
阅读更多

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace hooktest01
{
    public partial class Form1 : Form
    {
        [DllImport("kernel32.dll")]
        public static extern int VirtualAllocEx(IntPtr hwnd, Int32 lpaddress, int size, int type, Int32 tect);
        [DllImport("kernel32.dll")]
        public static extern Boolean WriteProcessMemory(IntPtr hwnd, int baseaddress, string buffer, int nsize, int filewriten);
        [DllImport("kernel32.dll")]
        public static extern int GetProcAddress(int hwnd, string lpname);
        [DllImport("kernel32.dll")]
        public static extern int GetModuleHandleA(string name);
        [DllImport("kernel32.dll")]
        public static extern IntPtr CreateRemoteThread(IntPtr hwnd, int attrib, int size, int address, int par, int flags, int threadid);
        [DllImport("kernel32.dll")]
        public static extern Int32 WaitForSingleObject(IntPtr hHandle, UInt32 dwMilliseconds);
        [DllImport("kernel32.dll")]
        public static extern Boolean VirtualFree(IntPtr lpAddress, Int32 dwSize, Int32 dwFreeType);
        Process pname;
        UInt32 INFINITE = 0xFFFFFFFF;
        Int32 PAGE_EXECUTE_READWRITE = 0x40;
        Int32 MEM_COMMIT = 0x1000;
        Int32 MEM_RESERVE = 0x2000;
        Int32 MEM_RELEASE = 0x8000;
        Int32 AllocBaseAddress;
        IntPtr hwnd;
        string dllname;
        Int32 Pid;
        Boolean ok;
        Int32 loadaddr;
        IntPtr ThreadHwnd;


        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                if (textBox1.Text == "" || textBox1.Text == null)
                {
                    MessageBox.Show("Pid is null"); return;
                }
                if (textBox2.Text == "" || textBox2.Text == null)
                {
                    MessageBox.Show("dll name is null"); return;
                }
                Pid = Int32.Parse(textBox1.Text);
                dllname = textBox2.Text;
            }
            catch(Exception error)
            {
                MessageBox.Show(error.Message); return;
            }
            try
            {
                pname = Process.GetProcessById(Pid);
                hwnd = pname.Handle;
            }
            catch(Exception error)
            {   //当标示pid的进程不存在时发生异常;
                MessageBox.Show (error.Message); return;
            }
            AllocBaseAddress= VirtualAllocEx(hwnd, 0, dllname.Length + 1, MEM_COMMIT+ MEM_RESERVE, PAGE_EXECUTE_READWRITE);
            if (AllocBaseAddress == 0)
            {
                MessageBox.Show("virtualallocex  fail"); return;
            }
            ok=WriteProcessMemory(hwnd, AllocBaseAddress, dllname, dllname.Length + 1,0);
            if (!ok)
            {
                MessageBox.Show("writeprocessmemory fail"); return;
            }
            loadaddr = GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
            if (loadaddr == 0)
            {   //取得LoadLibraryA的地址失败时返回
                MessageBox.Show("get loadlibraryA fail"); return;
            }
            ThreadHwnd=CreateRemoteThread(hwnd, 0, 0, loadaddr, AllocBaseAddress,0, 0);
            if (ThreadHwnd ==IntPtr.Zero)
            {
                MessageBox.Show("createremotethread fail"); return;
            }
           
            
            WaitForSingleObject(ThreadHwnd, INFINITE);
            MessageBox.Show("ok ,you can check now!!!");
            VirtualFree(hwnd, 0, MEM_RELEASE);
            //下面开始枚举模块列表;
            ProcessModuleCollection pmodule = pname.Modules;
            foreach (ProcessModule processm in pmodule)
            {
                listBox1.Items.Add(processm.FileName);
            }
            pname.Dispose();
        }
        //进程 句柄

    }
}
 转自:http://blog.csdn.net/pandyer/archive/2009/01/06/3719836.aspx
分享到:
评论

相关推荐

    C#版DLL远程线程注入源代码

    C#没有自动调用WIN32的一些API函数,我们可以手动添加内核库到我们自己的代码中,从而实现调用...此方法不仅仅用于远程线程注入,还可以用于从MFC转C#过程中不知道如何用C#实现功能,但有知道如何用MFC实现功能的方法。

    C#版DLL注入

    标题 "C#版DLL注入" 描述了一个使用C#编程语言实现动态链接库(DLL)注入的技术。DLL注入是一种在不修改目标程序源代码的情况下,将自定义的DLL功能加载到另一个正在运行的进程中的技术。这种方法常用于调试、监控、...

    C#DLL注入源码-C#注入器源码

    在这个主题中,我们将深入探讨C#实现DLL注入的过程,以及如何编写C#注入器源码。 首先,DLL注入的核心在于创建一个线程,该线程在目标进程中执行,从而能够调用注入的DLL中的函数。在C#中,我们可以使用以下关键...

    纯C# 托管与非托管DLL注入 FastWin32源码

    标题中的“纯C# 托管与非托管DLL注入 FastWin32源码”涉及到的是在C#编程环境中,如何实现对Windows系统进行DLL注入的技术。DLL注入是一种技术,允许一个进程将动态链接库(DLL)加载到另一个进程中,从而在目标进程...

    简单的DLL注入线程

    DLL注入是一种技术手段,通过将一个DLL文件的内容加载到另一个正在运行的进程内存空间中,使得目标进程能够执行注入的DLL中的函数,从而达到控制或扩展其功能的目的。 在"简单的DLL注入线程"这个主题中,我们主要...

    EasyHook远程进程注入并hook api的实现

    在远程进程注入中,EasyHook可以帮助我们将自定义的DLL注入到目标进程中,从而实现对目标进程内部API的Hook。 首先,我们需要了解远程进程注入的基本流程: 1. 获取目标进程信息:使用`System.Diagnostics.Process`...

    使用远程线程注入DLL

    远程线程注入通常涉及到创建一个包含要执行功能的DLL。这个DLL可以包含自定义函数,或者实现特定的系统调用。 3. **打开进程句柄**:使用`OpenProcess`函数获取目标进程的句柄。这个句柄用于后续操作,如读写进程...

    C# 打开直接注入DLL.rar (vs2010源码)

    本案例中,我们关注的是一个用C#编写的DLL注入器,名为"C# DLL注入器",其特点是程序在打开时就能直接将指定的DLL注入到目标进程中。源码是基于Visual Studio 2010开发的,并且依赖于.NET Framework 2.0。 首先,...

    易语言远程DLL注入源码-易语言

    易语言远程DLL注入源码是一种在编程领域中用于实现远程控制、监控或者调试的技术,它涉及到Windows操作系统底层的进程通信和动态链接库(DLL)的加载机制。在本例中,"易语言"是一种中国本土开发的编程语言,旨在...

    DLL注入工具

    1. **远程代码执行**:DLL注入工具允许开发者在不修改目标程序源代码的情况下,向目标进程注入自定义的DLL,执行特定的函数或操作,例如监控、调试、增强功能等。 2. **跨平台兼容性**:该工具支持x86和x64架构,这...

    C#使用EasyHook注入简单案例

    4. **启动服务**:为了使远程注入生效,你需要创建一个服务或后台进程,它负责接收远程请求并将代理类注入到目标进程中。 5. **注入代码**:通过`EasyHook.RemoteHooking.Inject`方法,将代理类的实例注入到目标...

    C# WinForm 动态加载DLL 通过配置文件

    在C# WinForm应用开发中,动态加载DLL是一种常见的需求,尤其当需要根据不同的环境或配置来使用不同的功能模块时。动态加载库可以提高代码的灵活性,减少对应用程序的依赖性,使得更新或扩展功能变得更为便捷。下面...

    dll注入教程---另类动态调用DLL

    易语言虽然在某些方面可能不如C++或C#等语言强大,但对于初学者来说,它的友好性使得学习DLL注入成为可能。通过本教程的学习,你可以掌握如何在易语言环境下实现DLL注入,进一步提升自己的编程能力。

    内存DLL注入模块-易语言

    内存DLL注入模块是一种在计算机编程中常见的技术,主要用于在运行时将动态链接库(DLL)加载到另一个进程的内存空间中。在易语言环境中,这一技术可以帮助开发者实现跨进程通信、功能扩展、调试或者恶意软件行为。...

    .Net远程注入工具SuperSpy

    《深入解析.Net远程注入工具SuperSpy》 在计算机科学领域,远程注入技术是一种常见的系统渗透测试和调试手段,它允许程序在目标进程中无感知地执行代码。本文将深入探讨.Net框架下的远程注入工具——SuperSpy,揭示...

    dll-inject:用C#编写的简单DLL注入器

    C#是微软开发的一种面向对象的编程语言,以其丰富的库和易读性而受到开发者喜爱,虽然它并非传统的系统级编程语言,但通过.NET Framework和一些底层API调用,C#同样可以实现如DLL注入这样的系统级操作。 DLL注入...

    DLL注入

    c# 整合c++远程注入 api重写等 记事本应用实例等 是值得一看的小工具

    将C#EXE或DLL程序集注入每个CLR运行时和另一个进程的AppDomain中。-C/C++开发

    clrinject将C#EXE或DLL程序集注入任何其他进程的CLR运行时和AppDomain中。 然后,注入的程序集可以访问注入者进程的类的静态实例,从而影响其内部状态。 clrinject将C#EXE或DLL程序集注入任何其他进程的CLR运行时...

    DLL注入代码

    在编程实践中,可能需要使用C++、C#或Python等语言,配合Windows API调用来实现DLL注入。例如,C++中可以使用`CreateRemoteThread`函数创建远程线程,如下: ```cpp LPTHREAD_START_ROUTINE lpStartAddress = ...

    2016121916232316011_HowToTwo_dll注入_源码.zip

    【标题】:“2016121916232316011_HowToTwo_dll注入_源码.zip”这个文件名暗示了我们即将探讨的是关于DLL注入的技术及其源代码。DLL(动态链接库)注入是一种常见的系统编程技术,它允许一个进程在另一个进程中加载...

Global site tag (gtag.js) - Google Analytics