我正在使用一个C#应用程序,它使用EasyHook库进行DLL注入.EasyHook要求使用它的任何应用程序都有很强的名称.为了强烈命名应用程序,我需要确保我使用的所有库都具有强名称.
这对我的所有托管库都很容易,但我还有一个非托管的c ++库,我需要强烈命名.经过一些搜索,我似乎无法找到一种方法来签署我的非托管DLL,即使使用源代码也是如此.可以这样做,如果是这样,我还需要做什么?
感谢您的任何建议或帮助!
所以,我有一个用C#编写的可执行文件,我没有它的源代码,但是我用IDA对它进行了反汇编,它给了我很多面向对象的程序集.
我做了注入一个.dll到另一个.exe文件.exe文件,我已经注入这个新的C++ DLL到C#.exe文件,没有问题,DllMain是因为所谓的等等...
但是当我将这个DLL注入到用C++创建的普通.exe文件中时,我可以使用其内存地址调用.exe中的函数,我可以在IDA上使用它.
问题是,面向对象的程序集在其功能上没有地址,即使函数名称被反汇编也是如此.
那么,有什么办法可以用我在C#.exe文件上注入的DLL来调用这个函数吗?
如果可能的话,有没有办法可以使用C#.exe文件中声明的命名空间及其所有函数和变量,甚至是私有的?
示例反汇编代码:
.namespace MyCSharpApp
{
.class public auto ansi Test extends [mscorlib]System.Object
{
.field public value class [Microsoft.Xna.Framework]Microsoft.Xna.Framework.Vector2 pos
.field public int32 foo
....
Run Code Online (Sandbox Code Playgroud) 我写过最简单的注射dll.以下是完整的代码:
#include "stdafx.h"
#include <stdio.h>
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
FILE * File = fopen("D:\\test.txt", "w");
if(File != NULL)
{
fclose(File);
}
return TRUE;
}
Run Code Online (Sandbox Code Playgroud)
超级简单吧?好吧,我甚至无法让这个工作.此代码编译为dll,我已在[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs]下的注册表中放置此dll的路径.我还应该提到LoadAppInit_DLLs注册表值设置为1.从这样做我希望看到文件"D:\ test.txt"出现在我启动其他应用程序(如notepad.exe)时,但事实并非如此.我不明白.还有另一个.dll,这是非常古老的,并且在visual studio '97中编写(我正在尝试替换),当我将AppInit_DLLs设置为指向它并启动任意应用程序时,该工作正常.我可以告诉它在启动其他应用程序时会加载.
我不知道这里发生了什么,但这不应该工作吗?它不能变得更简单.我正在使用VS 2010,据我所知,我已经创建了一个非常平面的Jane .dll所以我不认为任何项目设置应该是不合适的,但我不完全确定.我在这里错过了什么?
设置信息
假设我想将DLL注入到每250毫秒编辑一次地址A的进程中.我需要使用DllMain,对吧?问题是我不允许在DllMain内等待.所以我必须创建一个线程?或者这不绕过限制?我该怎么做呢?
此外,使用DLL注入使用EXE编辑应用程序的内存有什么好处?
另外,CreateThread中的堆栈大小应该是多少?如果它太小或太大怎么办?我怎么知道我需要多少钱?
问题是包含 PR_Write() 的 DLL 不是 npsr4.dll,而是 nss3.dll 和 hooks 无法从不存在的库中找到 GetProcAddress()。
我正在尝试创建 Firefox 钩子,它从 PR_Write() Firefox 方法(它位于 nspr4.dll 中)收集数据。我在谷歌上搜索了很多并尝试了很多方法来做到这一点,但不幸的是,当我注入钩子时,Firefox 崩溃了。
首先,我尝试不使用DLL,使用这种方法http://redkiing.wordpress.com/2012/04/30/firefox-formgrabber-iii-code-injection/(文章开头的来源)Firefox crashed at CreateRemoteProcess()*
我读到 CreateRemoteProcess() 由于安全问题在 Win7 上不起作用。我决定使用这种方法:http : //syprog.blogspot.com/2012/05/createremotethread-bypass-windows.html但它甚至没有加载我的 DLL。(来源在文章开头)
然后我决定用 SetWindowsHookEx() 注入 DLL。DLL 工作,我使用测试 MessageBox 来检查(但我不确定我是否正确指定了 SetWindowsHookEx() 的最后一个参数)。
我找到了带有 Firefox 示例的 Chrom 库(我不能发布超过 2 个链接,但谷歌:“chrom-lib”)。我将代码应用于我的 DLL,但是当我注入它时,Firefox 崩溃了。
我不太了解 ASM、堆栈和内存管理,也不知道出了什么问题以及如何解决。我只知道我应该使用 asm jump hook,但是怎么用呢?我需要一个现成的代码:/
也许有一种方法可以获取 pr_write() 地址,然后获取其调用堆栈(函数参数)并使用它们来调用我自己的函数?或者,也许我应该尝试使用“API Hooking with MS Detours”(同样,我无法发布链接:<)
我该怎么办?
编辑我发现我的电脑上没有 npsr4.dll。那么火狐如何在没有这个库的情况下构建 HTTP 请求呢?
当前 DLL 代码(基于 Chrom 的 VirtualProtect() 用法)
#define …Run Code Online (Sandbox Code Playgroud) 我正在制作一个修改目标进程行为的'mod'dll.我成功地注入了我的dll并挂了一些目标函数.
但是当我需要在主模块启动之前挂钩一些API(更清楚地,在入口点之前)时,需要做更多的工作.我需要使用CREATE_SUSPENDED属性手动启动目标程序,注入,然后恢复.但是一些应用程序从它自己的启动程序开始,有些应用程序通常从x64进程开始......这样的各种环境使其很难实现自动化.
似乎是最好的方法是为所有进程注入挂钩dll并处理CreateProcess.但有时它需要UAC,x64开发.
任何意见,将不胜感激.
以下代码将注入dll并将调用DllMain.我如何从DLL中调用特定函数,而不仅仅是DllMain?
DWORD pid;
HANDLE hd;
LPVOID gp, rs, proc;
gp = (LPVOID)GetProcAddress(GetModuleHandle(L"Kernel32.dll"), "LoadLibraryA");
pid = 6096;
hd = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
rs = (LPVOID)VirtualAllocEx(hd, 0, sizeof(DLL_NAME), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
if (!WriteProcessMemory(hd, (LPVOID)rs, DLL_NAME, strlen(DLL_NAME), 0))
{
printf("WriteProcessMemory %d", GetLastError());
}
if (!CreateRemoteThread(hd, 0, 0, (LPTHREAD_START_ROUTINE)gp, rs, 0, 0))
{
printf("CreateRemoteThread %d", GetLastError());
}
Run Code Online (Sandbox Code Playgroud) 我有一个DLL我注入其他进程使用SetWindowsHookEx.在DLL内部,我通过调用增加模块的引用计数器,GetModuleHandleEx这样我可以控制何时卸载模块.
此时,这两个API调用的模块引用计数"应为"2.当调用进程关闭时,它会调用UnhookWindowsHookEx,将引用计数减少到1. DLL有一个等待一些东西的线程,其中一个是调用进程的句柄SetWindowsHookEx.当进程消失时,DLL会进行一些清理,终止所有线程,清理内存和句柄然后调用FreeLibraryAndExitThread.这会减少计数器并卸载DLL.
这是我的问题.有一些进程,尤其是没有UI的进程,DLL永远不会被卸载.我很自信我清理了一切.而且我知道我的线程都没有运行.
首先,如果您有任何疑难解答提示以帮助发现原因,那将会有所帮助.否则,我正在考虑使用一些API NtQueryInformationProcess来获取模块地址并确认模块句柄计数实际上为零,然后调用CreateRemoteThread注入一个调用来LdrUnloadDll从进程内卸载模块地址.你对这种方法有什么看法?有没有人有任何示例代码?我很难找到如何获得模块句柄计数.
using System;
using System.Diagnostics;
using System.Reflection.Emit;
using System.Threading;
using EasyExploits;
namespace ConsoleApp1
{
class Program
{
EasyExploits.Module module = new EasyExploits.Module();
static void Main(string[] args)
{
Module.LaunchExploit();
Console.ForegroundColor = ConsoleColor.Green;
Label:
Console.WriteLine("Please Type 'Inject'");
string proccess1 = Console.ReadLine();
if (proccess1 == "Inject")
{
Console.WriteLine("");
Console.WriteLine("Injected!");
goto Begin;
}
else
{
goto Label;
}
Begin:
Console.WriteLine("");
Console.WriteLine("Enter a script and press enter to execute it.");
string answer = Console.ReadLine();
Module.ExecuteScript(answer);
goto Begin
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,我尝试寻找解决这个问题的方法,但找不到解决方案,所以我来到了堆栈溢出。无论如何,我的控制台应用程序应该在将脚本粘贴到输入时注入 EasyExploits.DLL 并执行 Lua 脚本。但是,我收到错误消息“非静态字段、方法或属性‘Module.LaunchExploit()’需要对象引用” …
在 C# 中,当尝试获取类型时,使用下面的代码从文件夹加载 DLL,获取下面的堆栈跟踪。
var assembly = Assembly.LoadFile(assemblyInfo.FullName); // assembly loads perfectly using the absolute path.
var types = assembly.GetTypes(); // this line throws the below stacktrace.
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
at System.Reflection.Assembly.GetTypes()
Run Code Online (Sandbox Code Playgroud)
我还检查了现有的解决方案:错误消息“无法加载一种或多种请求的类型”。检索 LoaderExceptions 属性以获取更多信息。,在 C# 中运行时加载 DLL(不起作用)