现在可以在同一个盒子上运行两个CLR,它们怎么能互相"说话"呢?
假设GUI在.NET 2.0 CLR下运行,并且在.NET 4.0 CLR上运行了一个脚本,例如,有没有办法从4.0环境修改基于2.0的GUI?
当我使用这种技术将.NET C#REPL环境注入另一个.net进程时,我遇到了这个问题:视频:将C#DLL注入托管(C#)和非托管(C++)进程
我正在使用此代码将我的64位dll注入到Windows 7 64位的64位进程中,CreateRemoteThread返回200但仍然没有注入dll,我用另一个源测试了我的dll并且它工作正常,Process Explorer显示我的代码不起作用,这个代码有什么问题,我正在使用delphi XE3,我已经在64位目标平台上编译代码.
function InjectDLL(dwPID: DWORD; DLLPath: pwidechar): integer;
var
dwThreadID: Cardinal;
hProc, hThread, hKernel: NativeUInt;
BytesWritten: NativeUInt;
pRemoteBuffer, pLoadLibrary: Pointer;
begin
try
hProc := OpenProcess(PROCESS_ALL_ACCESS, False, dwPID);
if hProc = 0 then
begin
Result := 0;
Exit;
end;
pRemoteBuffer := VirtualAllocEx(hProc, nil, Length(DLLPath) + 1, MEM_COMMIT,
PAGE_READWRITE);
if pRemoteBuffer = nil then
begin
Result := 0;
Exit;
end;
if WriteProcessMemory(hProc, Pointer(pRemoteBuffer), lpvoid(DLLPath),
Length(DLLPath) + 1, BytesWritten) = False then
begin
Result := 0;
Exit;
end;
hKernel := …Run Code Online (Sandbox Code Playgroud) 我已经用 C++ 编写了一个 dll 和注入器。dll代码如下:
#include <cstdio>
#include <stdio.h>
#include <windows.h>
#include <string>
#include <fstream>
#include <winsock.h>
using namespace std;
#pragma comment(lib, "wsock32.lib")
extern "C" __declspec(dllexport) void UploadFile()
{
.....
}
INT APIENTRY DLLMain(HMODULE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
switch(fdwReason)
{
case DLL_PROCESS_ATTACH:
MessageBox(0,"Process Attach","Info",MB_OK);
UploadFile();
break;
case DLL_THREAD_ATTACH:
MessageBox(0,"Thread Attach","Info",MB_OK);
UploadFile();
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_DETACH:
break;
default:
break;
}
return TRUE;
}
Run Code Online (Sandbox Code Playgroud)
dll 将特定文件上传到服务器。我能够使用 LoadLibrary() 和 CreateRemoteThread() 成功地将 dll 注入“notepad.exe”,但它没有被执行。甚至不是 dllmain() 函数。不知道出了什么问题。
我看到了一个类似但仍然不同的问题,所以只是为了澄清这不是13428881的欺骗(在注入的DLL中调用函数).
我现在所拥有的:一个DLL,注入到目标进程中,显示一个消息框并摆弄数学.
我将来想要的是:一个可以操纵和玩弄目标进程内部的DLL.
实现所需操作的下一步是在我注入的进程中调用远程线程中的方法.
让我们举一个例子:我有一个C++应用程序,它有int main,让我们说它看起来像这样:
int PrintText(string text)
{
cout << text;
return 1;
}
int main()
{
while (true)
{
PrintText("From the DLL");
}
}
Run Code Online (Sandbox Code Playgroud)
好的,这很可爱,我的目标应用程序目前正在打印一些文本,而且它似乎非常愉快地这样做.它以令人难以置信的速度向它发送垃圾邮件,但如果我需要的话,我可以使用线程和睡眠等来降低速度.事实是这不是问题,这里的代码没有编译或测试,我也不打算使用这个确切的代码.我实际上正在玩游戏.
现在,假设我创建了一个指向方法PrintText的指针,并且我知道该进程中的地址.我如何在外部调用它,传递参数?
在本地,我相信它看起来像这样:
int i;
int (*PrintSomeText)(string) = PrintText;
Run Code Online (Sandbox Code Playgroud)
然后,我可以使用引用调用此函数,如下所示:
i = operation("Text to be printed", PrintSomeText);
Run Code Online (Sandbox Code Playgroud)
根据我的理论,这应该声明一个名为i的整数,然后定义一个指向返回int的方法的指针,将一个字符串作为参数,指针存储PrintText中指针的值.(或者那种性质的东西).
非常好,所以我可以通过指针调用我自己的函数,这很好,实际上是破解.我真的对这种能力感到惊讶,现在我感觉像是超人.我会去保存一些婴儿或其他东西,brb.
回来,所以现在我想再继续下去,并采取下一步措施.假设我知道该方法位于目标进程中的地址100处(十进制,我可能会以十六进制表示,因为我使用CheatEngine/OllyDBG来查找目标进程中的方法,但对于此示例,我们'保持简单).
我假设我注入的DLL完全拥有自己的空间,它是否有更高的目标进程访问权限?我怎么能找到这个?
谢谢你的时间,乔希
编辑:一个小小的注释,我正在阅读C++教程书,到目前为止它已被证明是非常有用的.我注意到我忘了包含我的操作方法,所以对于遗失的道歉.如果需要,请告诉我.谢谢!
编辑nr 2:我刚刚编写了一些可编译的代码来测试这个,因为我在没有IDE的情况下从书中写下了大部分这个免费的手,而IDE终于自己配置了,所以这里是我目前的代码与...合作
#include "stdafx.h"
#include <iostream>
using namespace std;
int PrintText(char * Text)
{
cout << Text << endl;
return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
int (*Print)(char*) …Run Code Online (Sandbox Code Playgroud) 我想检查正在运行的程序正在调用哪个windows api.例如,如果进程调用timeGetTime(),endprocess()或其他一些api,我想知道这些信息,并且理想地实时显示或存储.如果我可以选择我想知道哪个api正在使用它也就足够了.我知道这可以通过api挂钩等技术来完成,但我正在寻找可以做到这一点的现有程序.有没有这样的东西?任何帮助,将不胜感激.
我想从应用程序本身获取已使用的DLL列表.我的目标是将列表与硬编码列表进行比较,以查看是否注入了任何DLL.我在Google中找不到任何示例.
我想编写一个程序,通过为所有进程创建一个监视器线程来分离 dll 注入或漏洞利用。我想在用户级别执行此操作,而不是插入驱动程序。
我尝试使用 AppInit_DLLs 在 DllMain 创建一个线程,但如果程序不加载 user32.dll,它就不起作用。
我尝试侦听新进程创建事件并挂起新进程以加载我的监视器 dll,但效果不佳。
是否有任何方法可以在所有新进程开始运行之前挂钩?
嗨,我想弄清楚如何确保提供的 DLL 是正确的。原因是我们的分布式解决方案是由许多小 DLL 构建的,每个 DLL 都包含应用程序的某些部分,有时我们会推出其中一些的新版本。
它不是“更新问题”,而是快乐 - 我们如何检查:
它是正确的二进制/汇编
客户/客户篡改了文件,并可能将其替换为具有类似功能的同名之一以返回错误值?
多种原因
这可以用于版权保护/许可测试或其他重要的验证问题,所以我想弄清楚 MD5 校验和 + 某种组装信息是否足够?(如果是这样,如何访问程序集详细信息或类似信息?)
当然,当您可以反编译 .NET DLL 时,没有什么是故障安全的,但正是因此我们要确保有人不只是反编译我们的函数列表,然后在那里编写我们“哦,如此重要”的 DLL 的替代 DLL。
我们的原因是调试/支持所需的麻烦数量,当我们遇到因错误或目的而破坏这些的客户时(我们不关心原因,我们只是试图防止大多数可能的错误)。
我刚刚开始进行逆向工程。
我创建了一个小型 C++ ConsoleApplication,并尝试通过注入的 DLL 调用 NewFunction。
void NewFunction()
{
DWORD dwImageBase = (DWORD)GetModuleHandle(NULL);
std::cout << "ImageBase: " << ToHex(dwImageBase) << std::endl;
std::cout << "NewFunction: " << ToHex((DWORD)&NewFunction) << std::endl;
std::cout << "Offset: " << ToHex((DWORD)&NewFunction - dwImageBase) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
ImageBase: F90000
NewFunction: FA111D
Offset: 1111D
Run Code Online (Sandbox Code Playgroud)
现在,当我使用注入的 DLL 调用 0xFA111D 时,它会按预期工作并再次打印。(DLL调用ImageBase + Offset)
但我不知道如何使用 IDA Pro 获取 NewFunction 的地址...
至少偏移量不应该是相同的吗?我在这里错过了一些重要的东西吗?
我有一个简单的DLL,我在记事本中注入仅用于测试目的.我的注射器代码是这样的:
uses
Windows;
var
BytesWritten: cardinal;
PID, Process, Thread, ThreadId, hKernel: dword;
pLoadLibrary, Paramaters: pointer;
DLL: AnsiString;
begin
DLL := 'C:\test.dll'; // Must be full path name.
PID := 3160;
Process := OpenProcess(PROCESS_ALL_ACCESS,
False,
PID);
Paramaters := VirtualAllocEx(Process,
nil,
Length(DLL),
MEM_COMMIT,
PAGE_EXECUTE_READWRITE);
WriteProcessMemory(Process,
Paramaters,
PAnsiChar(DLL),
Length(DLL),
BytesWritten);
hKernel := GetModuleHandle('KERNEL32.DLL');
pLoadLibrary := GetProcAddress(hKernel,
'LoadLibraryA');
Thread := CreateRemoteThread(Process,
nil,
0,
pLoadLibrary,
Paramaters,
0,
ThreadId);
WaitForSingleObject(Thread, INFINITE);
VirtualFreeEx(Process,
Paramaters,
0,
MEM_RELEASE);
CloseHandle(Thread);
CloseHandle(Process);
end.
Run Code Online (Sandbox Code Playgroud)
我的DLL代码很简单:
uses
SysUtils,
Classes,
Windows;
{$R *.res}
procedure …Run Code Online (Sandbox Code Playgroud) dll-injection ×10
dll ×4
c++ ×3
delphi ×3
windows ×3
c# ×2
.net ×1
assemblies ×1
checksum ×1
clr ×1
clr-hosting ×1
clr4.0 ×1
codecave ×1
debugging ×1
delphi-xe2 ×1
dllmain ×1
hook ×1
ida ×1
monitor ×1
winapi ×1