Прежде всего, я хотел бы сказать, что я не пытаюсь взломать игру. Я фактически нанят компанией, чей процесс я пытаюсь ввести. :)
Я хотел бы знать, как вызвать функцию из уже введенной DLL.
Итак, я успешно ввел и загрузил свою DLL в цель с помощью CreateRemoteThread(). Ниже вы можете увидеть фрагмент инъекции:Вызовте функцию из впрыскиваемой DLL
private static bool Inject(Process pToBeInjected, string sDllPath,out string sError, out IntPtr hwnd, out IntPtr hLibModule)
{
IntPtr zeroPtr = (IntPtr)0;
hLibModule = zeroPtr;
IntPtr hProcess = NativeUtils.OpenProcess(
(0x2 | 0x8 | 0x10 | 0x20 | 0x400), //create thread, query info, operation ,write, and read
1,
(uint)pToBeInjected.Id);
hwnd = hProcess;
IntPtr loadLibH = NativeUtils.GetProcAddress(NativeUtils.GetModuleHandle("kernel32.dll"),"LoadLibraryA");
IntPtr dllAddress = NativeUtils.VirtualAllocEx(
hProcess,
(IntPtr)null,
(IntPtr)sDllPath.Length, //520 bytes should be enough
(uint)NativeUtils.AllocationType.Commit |
(uint)NativeUtils.AllocationType.Reserve,
(uint)NativeUtils.MemoryProtection.ExecuteReadWrite);
byte[] bytes = CalcBytes(sDllPath);
IntPtr ipTmp = IntPtr.Zero;
NativeUtils.WriteProcessMemory(
hProcess,
dllAddress,
bytes,
(uint)bytes.Length,
out ipTmp);
IntPtr hThread = NativeUtils.CreateRemoteThread(
hProcess,
(IntPtr)null,
(IntPtr)0,
loadLibH, //handle to LoabLibrary function
dllAddress,//Address of the dll in remote process
0,
(IntPtr)null);
uint retV= NativeUtils.WaitForSingleObject(hThread, NativeUtils.INFINITE_WAIT);
bool exitR = NativeUtils.GetExitCodeThread(hThread, out hLibModule);
return true;
}
Примечание: проверка на наличие ошибок и высвобождая ресурсы были удалены для краткости, но будьте уверены, я проверяю все указатели и бесплатные мои ресурсы.
После того, как функция выше выходов, у меня есть ненулевой дескриптор модуля для моей DLL, возвращаемый LoadLibrary через hLibModule
, что означает, что DLL была загружена правильно.
My DLL - это библиотека классов C#, предназначенная для отображения окна сообщений (для тестирования). Я попытался проверить функцию, и появится окно сообщения. Это выглядит так:
public class Class1
{
public static void ThreadFunc(IntPtr param)
{
IntPtr libPtr = LoadLibrary("user32.dll");
MessageBox(IntPtr.Zero, "I'm ALIVE!!!!", "InjectedDll", 0);
}
[DllImport("kernel32", SetLastError = true)]
public static extern IntPtr LoadLibrary(string lpFileName);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int MessageBox(IntPtr hWnd, String text, String caption, int options);
}
Я скомпилирую его из Visual Studio, и DLL появится в папке Debug. Затем я передаю полный путь моей DLL к инжектору.
После инъекции в целевой процесс я не знаю, как вызвать ThreadFunc
из вложенной DLL, поэтому он никогда не выполняется.
Я не могу использовать GetProcAddress(hLibModule,"ThreadFunc")
, так как я вышел из процесса, поэтому ответ должен лежать в вызове CreateRemoteThread() как-то. Кроме того, я прочитал, что DllMain больше не разрешено для .NET DLL, поэтому я тоже не могу получить какое-либо бесплатное исполнение.
Кто-нибудь знает, как вызвать функцию из вложенной DLL?
Спасибо заранее.
Я нашел ссылку, используя ключевое слово, которое вы мне дали. Это то, что мне нужно сделать? Он говорит, что мне нужно написать загрузочную DLL, которая затем вводится. Они также говорят, что любой метод инъекций будет работать. Если я вставляю библиотеку bootstrap с помощью вышеприведенной техники, как я могу запустить загрузку DLL для начальной загрузки? Спасибо за ответ. –
prettyCode
Да, это подход. Следуйте ссылке на его код инъекции. –