首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

[超难]C#里怎么注入系统进程(如SVCHOST.EXE)

2012-01-02 
[超难]C#里如何注入系统进程(如SVCHOST.EXE)C#(其他编程语言也可):如何注入系统进程(如SVCHOST.EXE)?如何

[超难]C#里如何注入系统进程(如SVCHOST.EXE)
C#(其他编程语言也可):
如何注入系统进程(如SVCHOST.EXE)?
如何隐藏程序进程?
如何HTTP远程读取?
什么是点击模式?

[解决办法]
C#(其他编程语言也可): 
如何注入系统进程(如SVCHOST.EXE)? 
如何隐藏程序进程? 
如何HTTP远程读取? 
什么是点击模式?

注入 主要有3钟方式 最常用的是线程Hook和CreateRemoteThread创建远程线程两种方法,不过svchost.exe貌似有自动保护的^_^

隐藏进程 需要将程序设成系统服务
HTTP远程读取?顾名思义,应该是通过HTTP协议客户端向服务端发送请求..然后接收返回..

点击模式...好抽象 汗一个 不知道说的什么东东
[解决办法]
依赖注入跟注入不是一个东西

注入,单纯不太好解释,可以理解为是通过非法手段侵入别人程序或者系统内部
如代码注入,SQL注入等

楼上有说到
注入 主要有3钟方式 最常用的是线程Hook和CreateRemoteThread创建远程线程两种方法
这个输入代码注入

SQL注入:由于代码的SQL代码写得不严谨而导致恶意用户可以通过一些特殊字符等来提升自己权限或者侵入数据库

而依赖注入是设计模式里的一个概念
借用注入的这个思想:注入是在不改变目标的前提下进行的
你自己也说了,
依赖注入主要有四种方式: 
1、Constructor注入 <构造函数注入> . 
2、Setter注入 <通过属性赋值>. 
3、接口注入 
4、基于Attribute实现注入 

这些方式都是在不改变目标类的功能的前提下进行的
目的就是为了将被注入的类和目标类解耦--这个解耦也是相对于使用继承来说的
[解决办法]
进程注入无非两种途径:
远程线程.
挂DEBUG钩子.

被注入的dll要用C++写.
在dll里载入C#写的程序集应该就可以了吧.
[解决办法]
给你个参考:

注入没什么复杂的,它是一个很简单的过程。用语言描述就一句话:在别的程序里写入你的代码,并执行。 
(废话:传说注入分3种,我说的这种属于哪个呢?我懒的去想,能用就行了,呵呵。) 
实现起来也很简单,就几行代码: 

byte[] bytes={0xC3};//我们要写入的代码 
int addr = VirtualAllocEx(process, 0, bytes.Length, 0x1000, 0x40);//一,申请空间 
WriteProcessMemory(process, addr, bytes, bytes.Length, 0);//二,把代码写进去 
int hThread = CreateRemoteThread(process, 0, 0, addr, 0, 0, threadId);//三,执行写入的代码 
WaitForSingleObject(hThread, 0xFFFFFFFF);//等待线程结束 
VirtualFreeEx(process, addr, 0, 0x8000); //四,释放申请的空间 
CloseHandle(hThread);//五,关闭线程句饼 

仔细看一下这几行代码,你会发现非常简单,几乎不需要我多说什么。这几个豆耐特里豆不出来的函数,都是API。根据上面的使用方法,引用一下,就可以用了。你能看懂的那几个参数和返回值,就是需要你关心的。不知道的的参数都不用理会,直接用上面的值就行了。还有疑问的话,可以参考WINAPI手册。值得注意的地方是,第四步释放申请,如果你看了API手册,会发现第三个参数是大小,但如果你用bytes.Length的话就错了,一定要用0。 
(废话:如果你不知道怎么根据上面的使用方法引用API,我就简单说两句。以第二行为例,我们看到VirtualAllocEx的返回值和5个参数都是int行,那么这样声明就行: 
[DllImport("Kernel32.dll")]//没有特殊说明的话,API一般都是从这个DLL引用的 
public static extern int VirtualAllocEx( 
int p1, 
int p2, 
int p3, 
int p4, 
int p5 
); 
大家可以看出来,要申明一个API只要知道各参数和返回值的类型,以及DLL文件名就可以了。喜欢的话,你可以把参数的名字起的有意义些。) 

简简单单几行代码就实现了注入,是不是没你想像的复杂?呵呵。 
现在的一个问题就是,代码从何而来? 
大家可以使用我的工具将你找到的CALL转换为机器码。 (废话:这个工具的原理,就是调用MASM编译,所以任何你在MASM里能使用的语法和指令(限函数内),都可以在这里用,当然,语法和MASM里的语法规则是一样的。使用的方法在附件里有详细的说明,我就不在这里浪费篇章了。) 
工具转换得到的结果是型如60b8d0305a00ffd08b561c83c40461c3的字符串,大家可以用下面的方法把它转换为byte[] 
public static byte[] getBytes(string HEX) 

byte[] bytes = new byte[HEX.Length / 2]; 
for (int i = 0; i < bytes.Length; i++) 

bytes = Convert.ToByte(Int32.Parse(HEX.Substring(i * 2 , 2), 

System.Globalization.NumberStyles.AllowHexSpecifier)); 

return bytes; 

OK,到这里
[解决办法]
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!!"); 










[解决办法]
Http远程读取用HttpWebRequest以及HttpWebResponse
如:

C# code
HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create("url"); HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse(); //如果webResponse.StatusCode的值为HttpStatusCode.OK表示成功Stream stream = webResponse.GetResponseStream();System.IO.StreamReader streamReader = new StreamReader(stream, System.Text.Encoding.GetEncoding("GB2312"));string content = streamReader.ReadToEnd(); streamReader.Close(); webResponse.Close();
[解决办法]
lz写病毒?

以下仅供技术参考:
1、CreateRemoteThread、WriteProcessMemory
2、应用层下隐藏进程可以Hook NtQuerySystemInformation
3、socket或者MFC的CHttpXXXXXX类
4、点击模式没听过

热点排行