你可以使用Windows钩子或其他方法用c#进行代码注入吗? 我已经看到很多关于代码注入的东西,但所有这些都是用C / C ++完成的。 我不知道这些语言中的任何一种,并且很难翻译。 有没有人对如何做到这一点有任何想法?

===============>>#1 票数:6 已采纳

凯文,这是有可能的。 您可以使用托管C ++使用window hook proc创建库。 您需要做的就是使用标准WinAPI(SetWindowsHookEx等)将此挂钩注入到某个应用程序中。 在这个钩子里面你可以调用System :: AppDomain :: CurrentDomain-> Load方法将你的程序集加载到目标应用程序的AppDomain中。 然后,您可以使用反射调用程序集中定义的方法。 例如, Snoop使用此方法。

===============>>#2 票数:3

Mike Stall有这个使用CreateRemoteThread的示例 它的优点是不需要任何C ++。

===============>>#3 票数:3

编辑:我似乎误解了这个问题....我的印象是问题是关于代码注入当前进程。


我很晚才参加聚会,但几周前我刚刚使用过这个:

委托包含私有字段IntPtr _methodPtrIntPtr _methodPtrAux ,它们表示正文的内存地址。 通过将字段(通过反射)设置为特定值,可以改变EIP将指向的存储器地址。
使用此信息,可以执行以下操作:

  1. 创建一个包含要执行的汇编字节的数组
  2. 将委托的方法指针移动到相关字节
  3. 打电话给代表
  4. 利润???

(当然,您可以将_methodPtr更改为任何内存地址 - 即使在内核空间中,但这可能需要适当的执行权限)。


我有一个工作代码示例,如果你想:

 public static unsafe int? InjectAndRunX86ASM(this Func<int> del, byte[] asm) { if (del != null) fixed (byte* ptr = &asm[0]) { FieldInfo _methodPtr = typeof(Delegate).GetField("_methodPtr", BindingFlags.NonPublic | BindingFlags.Instance); FieldInfo _methodPtrAux = typeof(Delegate).GetField("_methodPtrAux", BindingFlags.NonPublic | BindingFlags.Instance); _methodPtr.SetValue(del, ptr); _methodPtrAux.SetValue(del, ptr); return del(); } else return null; } 

可以使用如下:

 Func<int> del = () => 0; byte[] asm_bytes = new byte[] { 0xb8, 0x15, 0x03, 0x00, 0x00, 0xbb, 0x42, 0x00, 0x00, 0x00, 0x03, 0xc3 }; // mov eax, 315h // mov ebx, 42h // add eax, ebx // ret int res = del.InjectAndRunX86ASM(asm_bytes); // should be 789 + 66 = 855 

当然,也可以编写以下方法:

 public static unsafe int RunX86ASM(byte[] asm) { Func<int> del = () => 0; // create a delegate variable Array.Resize(ref asm, asm.Length + 1); // add a return instruction at the end to prevent any memory leaks asm[asm.Length - 1] = 0xC3; fixed (byte* ptr = &asm[0]) { FieldInfo _methodPtr = typeof(Delegate).GetField("_methodPtr", BindingFlags.NonPublic | BindingFlags.Instance); FieldInfo _methodPtrAux = typeof(Delegate).GetField("_methodPtrAux", BindingFlags.NonPublic | BindingFlags.Instance); _methodPtr.SetValue(del, ptr); _methodPtrAux.SetValue(del, ptr); return del(); } } 

可以通过反射对现有方法(而不是委托)进行相同的操作:

 // UNTESTED // Action new_method_body = () => { }; MethodInfo nfo = typeof(MyType).GetMethod( ..... ); IntPtr ptr = nfo.MethodHandle.Value; // ptr is a pointer to the method in question InjectX86ASM(new_method_body, new byte[] { ......., 0xC3 }); // assembly bytes to be injected int target = new_method_body.Method.MethodHandle.Value.ToInt32(); byte[] redirector = new byte[] { 0xE8, // CALL INSTRUCTION + TARGET ADDRESS IN LITTLE ENDIAN (byte)(target & 0xff), (byte)((target >> 8) & 0xff), (byte)((target >> 16) & 0xff), (byte)((target >> 24) & 0xff), 0xC3, // RETURN INSTRUCTION }; Marshal.Copy(redirector, 0, ptr, redirector.Length); 


使用任何代码需要您自担风险。 必须使用/unsafe -compiler开关编译代码示例。

===============>>#4 票数:2

您可以在CodePlex站点http://codeinject.codeplex.com/上查看CInject代码注入.NET程序集。 在使用CInject时,您无需了解代码注入以注入任何代码。

  ask by The.Anti.9 translate from so

未解决问题?本站智能推荐:

3回复

编译时进行C#代码扩展/注入

我正在寻找一种在编译时扩展/注入代码的方法,例如模板/宏/代码段... 假设我在应用程序的很多地方都编写了以下代码: MyPropertyJson属性仅用于EF映射,因此我将值保存为DB中的JSON字符串,但对于类用户,他们仅了解MyProperty属性。 我想做的是在编译时
1回复

将C#代码注入另一个进程并调用目标函数

我试图用代码注入来调用游戏函数。 经过一番尝试后,我找到了一个能满足我想要的dll。 所以我用ILSpy看到了这个DLL但却无法理解代码。 似乎dll将c#代码注入目标应用程序,目标是c ++ dll和bootstrap .net。 现在我无法理解是什么意思 [D
1回复

是否可以使用C#代码注入dll并覆盖返回值?

可以说有一个简单的c#应用程序正在运行,它以int的形式返回值为2的1 + 1的答案,我有它的源代码,但出于好奇,我想更改它的功能而无需在运行时修改dll。 是否可以使用自己的.dll注入正在运行的应用程序,并将在同一类和方法中返回的答案更改为2以外的值? 我已经知道我可以在程序运行
9回复

如何从单独的应用程序中注入c#方法调用中的代码

我很好奇是否有人知道监视.Net应用程序的运行时信息的方法(正在调用什么方法等) 并从单独的运行进程中注入要在某些方法上运行的额外代码。 说我有两个应用程序: app1.exe,为简单起见,可以 我有第二个应用程序,我希望能够检测应用程序1中的Somefunc()何时运
4回复

@的虚拟钥匙? 密钥注入C#

我正在尝试将密钥注入程序。 我已设法注入密钥但我找不到@符号的虚拟密钥代码。 我发现这个网站非常有用,但仍然无法找到它。 Keys.Send(); 不是一个选项,因为我不想选择窗口,我希望能够在后台完成所有操作。 到目前为止这是我的代码: 这会将A键发送到记事本。 任
1回复

C#:将CSS注入MSHTML实例的最佳方法是什么?

我正在尝试将一些其他HTML附带的CSS注入到C#托管的WebBrowser控件中。 我试图通过底层的MSHTML(DomDocument属性)控件来执行此操作,因为此代码用作完整IE8 BHO的各​​种类型的原型。 问题是,虽然我可以注入HTML(通过mydomdocument.bod
1回复

在运行时在C#中向对象属性注入值

我有这样的课: 我这样称呼它: ChildForm可能有很多形式,这就是为什么我需要使用反射并使用父表单来显示它。但是我不知道如何设置子属性。 可以通过属性注入来完成? 提前致谢。
1回复

将C#Forms应用程序注入另一个应用程序

如何将DLL注入另一个进程有很多答案。 我如何使用C#Forms应用程序(exe)而不是DLL执行相同的操作。 基本上我希望它在另一个进程的虚拟地址空间中运行。 首先我分配内存,然后创建远程线程。 现在我如何让我现有的exe在那里运行? 也有任何限制,(我可以让它在explorer
3回复

在ASP.NET C#中设置sqldatasource select语句时防止SQL注入

关于防止在我的应用程序中进行SQL注入,我有一个快速的问题。 我的Web应用程序的两个不同功能使用文本框,用户可以使用文本框从MSSQL数据库中搜索项目。 此信息显示在GridView中。 我使用以下方法创建查询: 显然,接受用户输入并将其直接输入到这样的查询中将使它可以进
1回复

我该如何使用SetWindowHookEx从C#应用程序中注入本机dll(它比使用CreateRemoteThread注入更为安全)

首先,我不想监视键盘或鼠标,我只想将dll加载到另一个进程的地址空间中。 我目前正在使用外部非托管dll来执行此操作,该dll会执行WriteProcessMemory,VirtualAllocEx和CreateRemoteThread。 但这通常被检测为病毒。 SetWindowsHoo