• [转]C#中的DLL注入


    C#中的DLL注入 
    事实上dll注入很简单,无非就是调用virtualAllocEx,WriteProcessMemory,OpenProcess,CreateRemoteThread等API函数,因为我是学c#的,所以也想看一下c#这方面的文章,但在网上找了半天,没有找到一篇,也许是c#刚兴起的缘故,学c#的并不多,没办法,只好自己移植一下,因为凡是用到API函数,所有的编程的语言都是相同的,这就为我们的移植带来了方便,学c#的一般应该对API的调用概念很淡,因为c#通常不会去调用API函数,因为这些已经被封装了,在vb,vc  等语言中要结束一个进程,首先就必须要得到这个进程的句柄,然后才能进行相应的关闭进程等操作,得到句柄要用到OpenProcess API函数,结束进程要用到TerminateProcess API函数,但是在c#中你根本不需要知道这些API函数就能完成同样的功能,所以你要是想了解一下API的相关知识,学一点vb是一个很好的选择。好了!下面就开始我们的c# dll注入之旅吧! 
    首先需要加入以下API函数: 
       [DllImport(kernel32.dll)]  
           public static extern int VirtualAllocEx(IntPtr hwnd, int lpaddress, int size, int type, int tect);  
           [DllImport(kernel32.dll)]  
           public static extern int 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 int CreateRemoteThread(IntPtr hwnd, int attrib, int size, int address, int par, int flags, int threadid);  
        
      
      
    C#声明API比较复杂,因为是调用非托管的dll,所以要用到DllImport来调用非托管的dll,他还有很多属性在这就不多说了,网上有很介绍,可以去查一下,不过c#调用自身的变得动态链接库是倒是很方便,直接加个引用就ok了,调用dll要用的一个引用:using System.Runtime.InteropServices;这个不要忘了加上,下面是编好的所有代码: 
       using System;  
       using System.Collections.Generic;  
       using System.ComponentModel;  
       using System.Data;  
       using System.Drawing;  
       using System.Text;  
       using System.Windows.Forms;  
       using System.Runtime.InteropServices;  
       using System.Diagnostics;  
       namespace dllinject  
       {  
         public partial class Form1 : Form  
         {  
           [DllImport(kernel32.dll)] //声明API函数  
           public static extern int VirtualAllocEx(IntPtr hwnd, int lpaddress, int size, int type, int tect);  
           [DllImport(kernel32.dll)]  
           public static extern int 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 int CreateRemoteThread(IntPtr hwnd, int attrib, int size, int address, int par, int flags, int threadid);  
           public Form1()  
           {  
             InitializeComponent();  
           }  
        
           private void button1_Click(object sender, EventArgs e)  
           {  
             int ok1;  
             //int ok2;  
             //int hwnd;  
             int baseaddress;  
             int temp=0;  
             int hack;  
             int yan;  
             string dllname;  
             dllname = c:\\dll.dll;  
             int dlllength;  
             dlllength = dllname.Length   1;  
             Process[] pname = Process.GetProcesses(); //取得所有进程  
             foreach (Process name in pname) //遍历进程  
             {  
               //MessageBox.Show(name.ProcessName.ToLower());  
               if (name.ProcessName.ToLower().IndexOf(notepad) != -1) //所示记事本,那么下面开始注入  
               {  
                  
                 baseaddress = VirtualAllocEx(name.Handle, 0, dlllength , 4096, 4);  //申请内存空间  
                 if (baseaddress == 0) //返回0则操作失败,下面都是  
                 {  
                   MessageBox.Show(申请内存空间失败!!);  
                   Application.Exit();  
                 }  
                 ok1 = WriteProcessMemory(name.Handle, baseaddress, dllname, dlllength, temp); //写内存  
                 if (ok1 == 0)  
                 {  
                    
                     MessageBox.Show(写内存失败!!);  
                     Application.Exit();  
                 }  
                 hack = GetProcAddress(GetModuleHandleA(Kernel32), LoadLibraryA); //取得loadlibarary在kernek32.dll地址  
                 if (hack == 0)  
                 {  
                   MessageBox.Show(无法取得函数的入口点!!);  
                   Application.Exit();  
                 }  
                 yan = CreateRemoteThread(name.Handle, 0, 0, hack, baseaddress, 0, temp); //创建远程线程。  
                 if (yan == 0)  
                 {  
                   MessageBox.Show(创建远程线程失败!!);  
                   Application.Exit();  
                 }  
                 else  
                 {  
                   MessageBox.Show(已成功注入dll!!);  
                 }  
        
               }  
        
             }  
        
           }  
         }  
      
  • 相关阅读:
    解决Linux 环境 GLIBCXX_3.4.15' not found问题
    同步和异步接口,你还有疑惑么?
    SQL中内连接和外连接的区别
    Linux常用操作指令(面试专用)
    关于支付类的一些测试关注点及异常点
    jenkins持续集成 python selenium(windows本地)
    从ghost映像.gho文件快速创建vmware虚拟机
    阿里p3c(代码规范,eclipse插件、模版,idea插件)
    logback错误日志发送邮件
    C#中的异步陷阱
  • 原文地址:https://www.cnblogs.com/seerlin/p/1412523.html
Copyright © 2020-2023  润新知