我怎么会去阻止DLL注入
1个回答
展开全部
我怎么会去阻止DLL注入
于是有一天,我看到这个: 并且它会在三个DLL注入的。我将如何防止这些过程?或在最低限度,我该如何防止优先个? 我在想,也许一个Ring 0的驱动程序可能会停止所有三个的唯一途径,但我想看看有什么想。
-------------------------------------------------------------------------------------------------------------------------
1. 最佳的技术解决方案将做到这一点的装载代码不能正常运行你的程序初始化之后。这样做的一个办法就是通过采取NT加载程序锁,这将有效地防止任何加载操作的发生。其他选项包括直接修补装载代码拨打电话给LoadLibrary失败的攻击者(如插入INT3断点和自我调试,以处理预期的情况下).. 但是,作为一个hacker(一个管理员谁链接到你的网站,其实),你不会永远停止从获得代码的人进入你的过程中,这种或那种方式。调用LoadLibrary恰好是一个方便快捷 CodeGo.net,但也有吨不同的方式来手动加载的代码,你永远也别想完全停止,短的参与ring0代码。即使你做去到ring0,hacker将在那里你身边。 此外,还有大量的DLL注入。计划,辅助工具,并扩展操作系统函数的程序都可以DLL注入给附加函数的任何程序。
2. 如何对付那些3技术抗辩: CreateRemoteThread的 您可以通过挂钩的LoadLibrary防止优先种技术(CreateRemoteThread的其中调用LoadLibrary)。在你的钩子你核对你知道是过程的一部分,可以被加载的DLL列表,也可以核对你不希望加载已知的DLL列表。 当你发现一个DLL你不希望加载SetLastError(ERROR_ACCESS_DENIED),则返回NULL。我设置的最后一个错误,让人们编写代码查找错误代码得到一个。这似乎是工作,也许不同的代码可能更合适。 这将停止该DLL加载。 SetWindowsHookEx函数 我认为技术CreateRemoteThread的阻塞将工作SetWindowsHookEx函数,但只有当你可以在之前调用SetWindowsHookEx技术已经开始加载其代码(通常是在优先个窗口是在一个应用程序中创建得到你的钩子安装-在这么早的 代码洞 好的技术。之前没见过的。你可以抵御这一点,但你必须勾调用LoadLibrary入口点(不是IAT表)作为代码洞直接调用LoadLibrary。 作为文章的作者-有很多方法可以被攻击,你可能会很难击败他们。但往往你只想对某些DLL加载(如特定的第三方DLL,它是软件中的第三方DLL没有被正确写入到一个事实,即另一个钩子也可能存在辩护,让你从装载阻止它)。
3. 最好的办法是确保没有进程获得管理员访问权限,或者作为运行的用户帐户为您的应用程序。如果没有这个访问,代码注入到应用程序中是不可能的,而一旦这样的过程得到的访问,它可以各种恶作剧,而无需自身注入到其他进程-注入只是可以更容易隐藏。
4. 你为什么要阻止呢?这是一个实际的“生意”需要,或者是你在短短的兴趣了“hacker”,反对“hacker” 如果权限允许这一点,它是由设计-操作系统提供的设施,以您的系统管理员指派给下它们运行的帐户。 Raymond Chen的将很快被链接在这里...
5. 由于这张海报暗示,他正在投资反hacker,揭示出什么,我认为光。作为一个前任faker。 关于反hacker只是一个指针。 最好的办法是让服务器运行的核心逻辑。例如在优先人称射击游戏,监控客户端端发送到服务器。不要让他们随意走动。让服务器告诉每个玩家根据自己的逻辑的客户端端。千万不要只是他们可能是 如果hackerhacker自己的客户端,谁在乎呢?只是它在其他的人,一切都很好。对于星际争霸maphacks,解决方法很简单。不给出来,应该是未知的领域。它保存了带宽了。 我是在delta部队一个大faker(它的一个老的主要诀窍是由直接修改在任何地方翘曲。没有所需的DLL!
6. 您是否正在寻找一个解决方案,ring3下呢?如果是这样,你想建立额外的函数到系统中,是不是目前(至少据我所知)提供开箱即装即用,所以它需要的工作位。此外,这是可能从一个驱动,其实大部分的杀毒软件定期进行这种类型的活动。 至于停止它变得有点棘手,因为你不能只是自己注册为一个回调来创建进程或DLL加载。你可以,但是,如果你的进程已经他们之前开始,勾CreateRemoteThread的和类似的函数在全局和执行这种类型的检查自己的。 所以实际上你想要检查其中的CreateRemoteThread要创建一个线程,如果你不喜欢它返回一个错误。 这将否定优先个对于如果您在磁盘上的原程序有效的哈希值,那么你总是可以在装入前检查哈希值。如果你没有哈希,你至少可以只检查简单的地方将增加该类型的代码,寻找你不要指望在那里的DLL(如IAT,或运行字符串)。 这不是很简单的,但它似乎给你所要求的函数。
7. 我并不十分熟悉Windows的API,但我可以给你更广义的指针: 看看你的Windows数据执行保护(DPE)。它可能不适合所有(阅读:最)工作的情况下,在您的链接列出的过程是从OS的角度来看一个有效的过程。纵深防御,虽然 确保整个应用程序的assertions安全权限 静态分配空间,这样任何新主题催生了进去要么失败或覆盖的空间,你会需要大概一个沉重的大块 逻辑检测和纠正这虽然的。 因数你的代码到一个设备驱动程序或其他低级别类型的过程,你可以得到在Windows文件保护伞覆盖。 刚看到Cthulon的回答(顺便说一句好!)我怕他可能是正确的:任何人谁愿意在你的应用程序执行代码注入将找到一种方法来这样做。上述步骤使其更有点困难。 希望这有助于
8. 只是简单的想法的:) 使用代码洞穴CRC校验注入自己的代码也许会减慢其他其他代码洞穴。 polling进程模块列表未知DLL的加载是可能有助于减缓人们只是注入任何旧事与附加线程钩子。
9. 您可以防止优先种技术(CreateRemoteThread这就要求LoadLibrary)通过挂钩LoadLibrary。在你的钩子你核对你知道是过程的一部分,可以被加载的DLL列表,也可以核对你不希望加载已知的DLL列表。 ü如何检查可以siurce代码C#来检测或检查....下面的代码库注入器[DllImport("kernel32")]
public static extern IntPtr CreateRemoteThread(
IntPtr hProcess,
IntPtr lpThreadAttributes,
uint dwStackSize,
UIntPtr lpStartAddress, // raw Pointer into remote process
IntPtr lpParameter,
uint dwCreationFlags,
out IntPtr lpThreadId
);
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(
UInt32 dwDesiredAccess,
Int32 bInheritHandle,
Int32 dwProcessId
);
[DllImport("kernel32.dll")]
public static extern Int32 CloseHandle(
IntPtr hObject
);
[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
static extern bool VirtualFreeEx(
IntPtr hProcess,
IntPtr lpAddress,
UIntPtr dwSize,
uint dwFreeType
);
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
public static extern UIntPtr GetProcAddress(
IntPtr hModule,
string procName
);
[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
static extern IntPtr VirtualAllocEx(
IntPtr hProcess,
IntPtr lpAddress,
uint dwSize,
uint flAllocationType,
uint flProtect
);
[DllImport("kernel32.dll")]
static extern bool WriteProcessMemory(
IntPtr hProcess,
IntPtr lpBaseAddress,
string lpBuffer,
UIntPtr nSize,
out IntPtr lpNumberOfBytesWritten
);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetModuleHandle(
string lpModuleName
);
[DllImport("kernel32", SetLastError = true, ExactSpelling = true)]
internal static extern Int32 WaitForSingleObject(
IntPtr handle,
Int32 milliseconds
);
public Int32 GetProcessId(String proc)
{
Process[] ProcList;
ProcList = Process.GetProcessesByName(proc);
return ProcList[0].Id;
}
public void InjectDLL(IntPtr hProcess, String strDLLName, Process proc)
{
IntPtr bytesout = IntPtr.Zero;
IntPtr hThread = IntPtr.Zero;
// Length of string containing the DLL file name +1 byte padding
Int32 LenWrite = strDLLName.Length + 1;
// Allocate memory within the virtual address space of the target process
IntPtr AllocMem = IntPtr.Zero;
UIntPtr Injector = UIntPtr.Zero;
// Allocate some memory in the process for the loading of our .dll
AllocMem= (IntPtr)VirtualAllocEx(hProcess, (IntPtr)null, (uint)LenWrite, 0x1000, 0x40); //allocation pour WriteProcessMemory
// Write the name of the .dll to our new allocated space.
WriteProcessMemory(hProcess, AllocMem, strDLLName, (UIntPtr)LenWrite, out bytesout);
// Function pointer "Injector"
//Load dll
Injector = (UIntPtr)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
if (Injector == null)
{
Console.WriteLine(" Injector Error! \n ");
// return failed
return;
}
// Create thread in target process, and store handle in hThread
// Load our DLL
hThread = (IntPtr)CreateRemoteThread(hProcess, (IntPtr)null, 0, Injector, AllocMem, 0, out bytesout);
// Make sure thread handle is valid
if (hThread == null)
{
//incorrect thread handle ... return failed
Console.WriteLine(" hThread [ 1 ] Error! \n ");
return;
}
// Time-out is 10 seconds...
int Result = WaitForSingleObject(hThread, 10 * 1000);
// Check whether thread timed out...
if (Result == 0x00000080L || Result == 0x00000102L || Result == 0xFFFFFFFF)
{
/* Thread timed out... */
Console.WriteLine(" hThread [ 2 ] Error! \n ");
// Make sure thread handle is valid before closing... prevents crashes.
if (hThread != null)
{
//Close thread in target process
CloseHandle(hThread);
}
return;
}
// Sleep thread for 1 second
Thread.Sleep(1000);
// Clear up allocated space ( Allocmem )
VirtualFreeEx(hProcess, AllocMem, (UIntPtr)0, 0x8000);
// Make sure thread handle is valid before closing... prevents crashes.
if (hThread != null)
{
//Close thread in target process
CloseHandle(hThread);
}
// return succeeded
return;
}
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
String strDLLName = @"C:\Users\muhammad.qasim\Desktop\qasim\testdllinject\testdllinject\bin\Debug\testdllinject.dll";
String strProcessName = "WindowsFormsApplication9";
Int32 ProcID = GetProcessId(strProcessName);
Process proc = Process.GetProcessById(ProcID);
if (ProcID >= 0)
{
IntPtr hProcess = (IntPtr)OpenProcess(0x1F0FFF, 1, ProcID);
if (hProcess == null)
{
MessageBox.Show("OpenProcess() Failed!");
return;
}
else
{
InjectDLL(hProcess, strDLLName, proc);
MessageBox.Show("injected");
}
于是有一天,我看到这个: 并且它会在三个DLL注入的。我将如何防止这些过程?或在最低限度,我该如何防止优先个? 我在想,也许一个Ring 0的驱动程序可能会停止所有三个的唯一途径,但我想看看有什么想。
-------------------------------------------------------------------------------------------------------------------------
1. 最佳的技术解决方案将做到这一点的装载代码不能正常运行你的程序初始化之后。这样做的一个办法就是通过采取NT加载程序锁,这将有效地防止任何加载操作的发生。其他选项包括直接修补装载代码拨打电话给LoadLibrary失败的攻击者(如插入INT3断点和自我调试,以处理预期的情况下).. 但是,作为一个hacker(一个管理员谁链接到你的网站,其实),你不会永远停止从获得代码的人进入你的过程中,这种或那种方式。调用LoadLibrary恰好是一个方便快捷 CodeGo.net,但也有吨不同的方式来手动加载的代码,你永远也别想完全停止,短的参与ring0代码。即使你做去到ring0,hacker将在那里你身边。 此外,还有大量的DLL注入。计划,辅助工具,并扩展操作系统函数的程序都可以DLL注入给附加函数的任何程序。
2. 如何对付那些3技术抗辩: CreateRemoteThread的 您可以通过挂钩的LoadLibrary防止优先种技术(CreateRemoteThread的其中调用LoadLibrary)。在你的钩子你核对你知道是过程的一部分,可以被加载的DLL列表,也可以核对你不希望加载已知的DLL列表。 当你发现一个DLL你不希望加载SetLastError(ERROR_ACCESS_DENIED),则返回NULL。我设置的最后一个错误,让人们编写代码查找错误代码得到一个。这似乎是工作,也许不同的代码可能更合适。 这将停止该DLL加载。 SetWindowsHookEx函数 我认为技术CreateRemoteThread的阻塞将工作SetWindowsHookEx函数,但只有当你可以在之前调用SetWindowsHookEx技术已经开始加载其代码(通常是在优先个窗口是在一个应用程序中创建得到你的钩子安装-在这么早的 代码洞 好的技术。之前没见过的。你可以抵御这一点,但你必须勾调用LoadLibrary入口点(不是IAT表)作为代码洞直接调用LoadLibrary。 作为文章的作者-有很多方法可以被攻击,你可能会很难击败他们。但往往你只想对某些DLL加载(如特定的第三方DLL,它是软件中的第三方DLL没有被正确写入到一个事实,即另一个钩子也可能存在辩护,让你从装载阻止它)。
3. 最好的办法是确保没有进程获得管理员访问权限,或者作为运行的用户帐户为您的应用程序。如果没有这个访问,代码注入到应用程序中是不可能的,而一旦这样的过程得到的访问,它可以各种恶作剧,而无需自身注入到其他进程-注入只是可以更容易隐藏。
4. 你为什么要阻止呢?这是一个实际的“生意”需要,或者是你在短短的兴趣了“hacker”,反对“hacker” 如果权限允许这一点,它是由设计-操作系统提供的设施,以您的系统管理员指派给下它们运行的帐户。 Raymond Chen的将很快被链接在这里...
5. 由于这张海报暗示,他正在投资反hacker,揭示出什么,我认为光。作为一个前任faker。 关于反hacker只是一个指针。 最好的办法是让服务器运行的核心逻辑。例如在优先人称射击游戏,监控客户端端发送到服务器。不要让他们随意走动。让服务器告诉每个玩家根据自己的逻辑的客户端端。千万不要只是他们可能是 如果hackerhacker自己的客户端,谁在乎呢?只是它在其他的人,一切都很好。对于星际争霸maphacks,解决方法很简单。不给出来,应该是未知的领域。它保存了带宽了。 我是在delta部队一个大faker(它的一个老的主要诀窍是由直接修改在任何地方翘曲。没有所需的DLL!
6. 您是否正在寻找一个解决方案,ring3下呢?如果是这样,你想建立额外的函数到系统中,是不是目前(至少据我所知)提供开箱即装即用,所以它需要的工作位。此外,这是可能从一个驱动,其实大部分的杀毒软件定期进行这种类型的活动。 至于停止它变得有点棘手,因为你不能只是自己注册为一个回调来创建进程或DLL加载。你可以,但是,如果你的进程已经他们之前开始,勾CreateRemoteThread的和类似的函数在全局和执行这种类型的检查自己的。 所以实际上你想要检查其中的CreateRemoteThread要创建一个线程,如果你不喜欢它返回一个错误。 这将否定优先个对于如果您在磁盘上的原程序有效的哈希值,那么你总是可以在装入前检查哈希值。如果你没有哈希,你至少可以只检查简单的地方将增加该类型的代码,寻找你不要指望在那里的DLL(如IAT,或运行字符串)。 这不是很简单的,但它似乎给你所要求的函数。
7. 我并不十分熟悉Windows的API,但我可以给你更广义的指针: 看看你的Windows数据执行保护(DPE)。它可能不适合所有(阅读:最)工作的情况下,在您的链接列出的过程是从OS的角度来看一个有效的过程。纵深防御,虽然 确保整个应用程序的assertions安全权限 静态分配空间,这样任何新主题催生了进去要么失败或覆盖的空间,你会需要大概一个沉重的大块 逻辑检测和纠正这虽然的。 因数你的代码到一个设备驱动程序或其他低级别类型的过程,你可以得到在Windows文件保护伞覆盖。 刚看到Cthulon的回答(顺便说一句好!)我怕他可能是正确的:任何人谁愿意在你的应用程序执行代码注入将找到一种方法来这样做。上述步骤使其更有点困难。 希望这有助于
8. 只是简单的想法的:) 使用代码洞穴CRC校验注入自己的代码也许会减慢其他其他代码洞穴。 polling进程模块列表未知DLL的加载是可能有助于减缓人们只是注入任何旧事与附加线程钩子。
9. 您可以防止优先种技术(CreateRemoteThread这就要求LoadLibrary)通过挂钩LoadLibrary。在你的钩子你核对你知道是过程的一部分,可以被加载的DLL列表,也可以核对你不希望加载已知的DLL列表。 ü如何检查可以siurce代码C#来检测或检查....下面的代码库注入器[DllImport("kernel32")]
public static extern IntPtr CreateRemoteThread(
IntPtr hProcess,
IntPtr lpThreadAttributes,
uint dwStackSize,
UIntPtr lpStartAddress, // raw Pointer into remote process
IntPtr lpParameter,
uint dwCreationFlags,
out IntPtr lpThreadId
);
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(
UInt32 dwDesiredAccess,
Int32 bInheritHandle,
Int32 dwProcessId
);
[DllImport("kernel32.dll")]
public static extern Int32 CloseHandle(
IntPtr hObject
);
[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
static extern bool VirtualFreeEx(
IntPtr hProcess,
IntPtr lpAddress,
UIntPtr dwSize,
uint dwFreeType
);
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
public static extern UIntPtr GetProcAddress(
IntPtr hModule,
string procName
);
[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
static extern IntPtr VirtualAllocEx(
IntPtr hProcess,
IntPtr lpAddress,
uint dwSize,
uint flAllocationType,
uint flProtect
);
[DllImport("kernel32.dll")]
static extern bool WriteProcessMemory(
IntPtr hProcess,
IntPtr lpBaseAddress,
string lpBuffer,
UIntPtr nSize,
out IntPtr lpNumberOfBytesWritten
);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetModuleHandle(
string lpModuleName
);
[DllImport("kernel32", SetLastError = true, ExactSpelling = true)]
internal static extern Int32 WaitForSingleObject(
IntPtr handle,
Int32 milliseconds
);
public Int32 GetProcessId(String proc)
{
Process[] ProcList;
ProcList = Process.GetProcessesByName(proc);
return ProcList[0].Id;
}
public void InjectDLL(IntPtr hProcess, String strDLLName, Process proc)
{
IntPtr bytesout = IntPtr.Zero;
IntPtr hThread = IntPtr.Zero;
// Length of string containing the DLL file name +1 byte padding
Int32 LenWrite = strDLLName.Length + 1;
// Allocate memory within the virtual address space of the target process
IntPtr AllocMem = IntPtr.Zero;
UIntPtr Injector = UIntPtr.Zero;
// Allocate some memory in the process for the loading of our .dll
AllocMem= (IntPtr)VirtualAllocEx(hProcess, (IntPtr)null, (uint)LenWrite, 0x1000, 0x40); //allocation pour WriteProcessMemory
// Write the name of the .dll to our new allocated space.
WriteProcessMemory(hProcess, AllocMem, strDLLName, (UIntPtr)LenWrite, out bytesout);
// Function pointer "Injector"
//Load dll
Injector = (UIntPtr)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
if (Injector == null)
{
Console.WriteLine(" Injector Error! \n ");
// return failed
return;
}
// Create thread in target process, and store handle in hThread
// Load our DLL
hThread = (IntPtr)CreateRemoteThread(hProcess, (IntPtr)null, 0, Injector, AllocMem, 0, out bytesout);
// Make sure thread handle is valid
if (hThread == null)
{
//incorrect thread handle ... return failed
Console.WriteLine(" hThread [ 1 ] Error! \n ");
return;
}
// Time-out is 10 seconds...
int Result = WaitForSingleObject(hThread, 10 * 1000);
// Check whether thread timed out...
if (Result == 0x00000080L || Result == 0x00000102L || Result == 0xFFFFFFFF)
{
/* Thread timed out... */
Console.WriteLine(" hThread [ 2 ] Error! \n ");
// Make sure thread handle is valid before closing... prevents crashes.
if (hThread != null)
{
//Close thread in target process
CloseHandle(hThread);
}
return;
}
// Sleep thread for 1 second
Thread.Sleep(1000);
// Clear up allocated space ( Allocmem )
VirtualFreeEx(hProcess, AllocMem, (UIntPtr)0, 0x8000);
// Make sure thread handle is valid before closing... prevents crashes.
if (hThread != null)
{
//Close thread in target process
CloseHandle(hThread);
}
// return succeeded
return;
}
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
String strDLLName = @"C:\Users\muhammad.qasim\Desktop\qasim\testdllinject\testdllinject\bin\Debug\testdllinject.dll";
String strProcessName = "WindowsFormsApplication9";
Int32 ProcID = GetProcessId(strProcessName);
Process proc = Process.GetProcessById(ProcID);
if (ProcID >= 0)
{
IntPtr hProcess = (IntPtr)OpenProcess(0x1F0FFF, 1, ProcID);
if (hProcess == null)
{
MessageBox.Show("OpenProcess() Failed!");
return;
}
else
{
InjectDLL(hProcess, strDLLName, proc);
MessageBox.Show("injected");
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询