国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
C#也談dll注入
    hack214
                        (因?yàn)橐郧暗拇a不太規(guī)范,所以我又重新寫了一遍,下面的代碼是新的,我給的那個(gè)鏈接是舊代碼)
前段時(shí)間研究了了一下dll注入,雖然這項(xiàng)技術(shù)已經(jīng)被寫爛了,而且現(xiàn)在而言,這項(xiàng)技術(shù)已經(jīng)落后了,基本上編程都到內(nèi)核的級(jí)別了,不過(guò)再過(guò)時(shí)的技術(shù)對(duì)于我們剛學(xué)編程的菜鳥來(lái)說(shuō)都是新鮮的,我們還是要一點(diǎn)一點(diǎn)的來(lái)學(xué),先把基礎(chǔ)的東西學(xué)會(huì)了,以后才能成為大鳥嗎!,我開始用vb編了一個(gè)dll注入的程序,事實(shí)上dll注入很簡(jiǎn)單,無(wú)非就是調(diào)用virtualAllocEx,WriteProcessMemory,OpenProcess,CreateRemoteThread等API函數(shù),因?yàn)槲沂菍W(xué)c#的,所以也想看一下c#這方面的文章,但在網(wǎng)上找了半天,沒(méi)有找到一篇,也許是c#剛興起的緣故,學(xué)c#的并不多,沒(méi)辦法,只好自己移植一下,因?yàn)榉彩怯玫紸PI函數(shù),所有的編程的語(yǔ)言都是相同的,這就為我們的移植帶來(lái)了方便,學(xué)c#的一般應(yīng)該對(duì)API的調(diào)用概念很淡,因?yàn)閏#通常不會(huì)去調(diào)用API函數(shù),因?yàn)檫@些已經(jīng)被封裝了,在vb,vc++等語(yǔ)言中要結(jié)束一個(gè)進(jìn)程,首先就必須要得到這個(gè)進(jìn)程的句柄,然后才能進(jìn)行相應(yīng)的關(guān)閉進(jìn)程等操作,得到句柄要用到OpenProcess API函數(shù),結(jié)束進(jìn)程要用到TerminateProcess API函數(shù),但是在c#中你根本不需要知道這些API函數(shù)就能完成同樣的功能,所以你要是想了解一下API的相關(guān)知識(shí),學(xué)一點(diǎn)vb是一個(gè)很好的選擇。好了!下面就開始我們的c# dll注入之旅吧!
首先需要加入以下API函數(shù):
        [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);
 C#聲明API比較復(fù)雜,因?yàn)槭钦{(diào)用非托管的dll,所以要用到DllImport來(lái)調(diào)用非托管的dll,他還有很多屬性在這就不多說(shuō)了,網(wǎng)上有很介紹,可以去查一下,不過(guò)c#調(diào)用自身的變得動(dòng)態(tài)鏈接庫(kù)是倒是很方便,直接加個(gè)引用就ok了,調(diào)用dll要用的一個(gè)引用:using System.Runtime.InteropServices;這個(gè)不要忘了加上,下面是編好的所有代碼:
 
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")]
        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)
            {   //當(dāng)標(biāo)示pid的進(jìn)程不存在時(shí)發(fā)生異常;
                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的地址失敗時(shí)返回
                MessageBox.Show("get loadlibraryA fail"); return;
            }
            ThreadHwnd=CreateRemoteThread(hwnd, 0, 0, loadaddr, AllocBaseAddress,0, 0);
            if (ThreadHwnd ==IntPtr.Zero)
            {
                MessageBox.Show("createremotethread fail"); return;
            }
            MessageBox.Show("ok ,you can check now!!!");
            WaitForSingleObject(ThreadHwnd, INFINITE);
            VirtualFree(hwnd, 0, MEM_RELEASE);
            //下面開始枚舉模塊列表;
            ProcessModuleCollection pmodule = pname.Modules;
            foreach (ProcessModule processm in pmodule)
            {
                listBox1.Items.Add(processm.FileName);
            }
            pname.Dispose();
        }
       
    }
}
  可以看到dll注入是很簡(jiǎn)單的,用了很短的代碼就完成了所有的功能,也可以看到我沒(méi)有用到OpenProcess函數(shù),而是用了process類,這個(gè)在vb,vc++中是沒(méi)有這么方便的,他們要得到進(jìn)程的句柄,就要用到OpenProcess函數(shù),關(guān)于dll的編寫,我用的只是新建的一個(gè)類庫(kù),由于不知道c#有沒(méi)有dll入口函數(shù),我開始用main()當(dāng)入口點(diǎn),但是好像不起作用,建議dll用vc++編寫,因?yàn)閏++有dllmain入口函數(shù),可以取得很好的執(zhí)行。
   希望本文對(duì)剛剛踏進(jìn)c#編程大門的編程愛好者有所幫助,由于本身水平有限,要是文章有什么不對(duì)的地方,希望能夠諒解。
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/hack214/archive/2008/04/11/2283599.aspx
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
如何讓MessageBox.Show的在父窗口上居中顯示
C# 互操作性入門系列(二):使用平臺(tái)調(diào)用調(diào)用Win32 函數(shù)
C#調(diào)用windows API的一些方法
WPF窗體不獲取輸入焦點(diǎn)(開發(fā)屏幕鍵盤必備)
C#將exe運(yùn)行程序嵌入到自己的winform窗體中
C# 如何判斷并且激活,最大化已有的外部應(yīng)用程序的窗口? (源碼例程) - 編程歲月 - ...
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服