Если не секрет, откуда столько любви к ассемблеру? Чем языки более высокого уровня не угодили?
Вот код не моего фреймворка для инжекта длл перенаправлением потока, код на C# но зная хоть примерно C++ можно понять. ManagedFasm это обертка над компилятором твоего любимого)
Код:
/// <summary>
/// Injects a dll into a process by hijacking the given thread and redirecting it to LoadLibrary.
/// </summary>
/// <param name="hProcess">Handle to process into which dll will be injected.</param>
/// <param name="hThread">Handle to thread that will be hijacked.</param>
/// <param name="szDllPath">Full path to the dll to be injected.</param>
/// <returns>Returns the base address of the injected dll on success, zero on failure.</returns>
public static uint InjectDllRedirectThread(IntPtr hProcess, IntPtr hThread, string szDllPath)
{
const uint INITIAL_EXIT_CODE = 0xFFFFFFFF;
if (hProcess == IntPtr.Zero)
throw new ArgumentNullException("hProcess");
if (hThread == IntPtr.Zero)
throw new ArgumentNullException("hThread");
if (szDllPath.Length == 0)
throw new ArgumentNullException("szDllPath");
if (!szDllPath.Contains("\\"))
szDllPath = System.IO.Path.GetFullPath(szDllPath);
if (!System.IO.File.Exists(szDllPath))
throw new ArgumentException("DLL not found.", "szDllPath");
uint dwBaseAddress = RETURN_ERROR;
uint lpLoadLibrary, lpAsmStub;
CONTEXT ctx;
StringBuilder AssemblyStub = new StringBuilder();
ManagedFasm fasm = new ManagedFasm(hProcess);
lpLoadLibrary = (uint)Imports.GetProcAddress(Imports.GetModuleHandle("kernel32.dll"), "LoadLibraryA");
if (lpLoadLibrary == 0)
return RETURN_ERROR;
lpAsmStub = SMemory.AllocateMemory(hProcess);
if (lpAsmStub == 0)
return RETURN_ERROR;
if (SThread.SuspendThread(hThread) != uint.MaxValue)
{
ctx = SThread.GetThreadContext(hThread, CONTEXT_FLAGS.CONTEXT_CONTROL);
if (ctx.Eip > 0)
{
try
{
//located at lpAsmStub+0, where we can monitor LoadLibrary's exit code.
fasm.AddLine("lpExitCode dd 0x{0:X}", INITIAL_EXIT_CODE);
//lpAsmStub+4, where the actual code part starts
fasm.AddLine("push 0x{0:X}", ctx.Eip);
fasm.AddLine("pushad");
fasm.AddLine("push szDllPath");
fasm.AddLine("call 0x{0:X}", lpLoadLibrary);
fasm.AddLine("mov [lpExitCode], eax");
fasm.AddLine("popad");
fasm.AddLine("retn");
//dll path
fasm.AddLine("szDllPath db \'{0}\',0", szDllPath);
fasm.Inject(lpAsmStub);
}
catch
{
SMemory.FreeMemory(hProcess, lpAsmStub);
SThread.ResumeThread(hThread);
return RETURN_ERROR;
}
ctx.ContextFlags = CONTEXT_FLAGS.CONTEXT_CONTROL;
ctx.Eip = lpAsmStub + 4; //skip over lpExitCode data
if (SThread.SetThreadContext(hThread, ctx))
{
if (SThread.ResumeThread(hThread) != uint.MaxValue)
{
for (int i = 0; i < 400; i++)
{
System.Threading.Thread.Sleep(5);
if ((dwBaseAddress = SMemory.ReadUInt(hProcess, lpAsmStub)) != INITIAL_EXIT_CODE)
break;
}
}
}
}
}
if (fasm != null)
{
fasm.Dispose();
fasm = null;
}
SMemory.FreeMemory(hProcess, lpAsmStub);
return dwBaseAddress;
}
Последний раз редактировалось n1ghtmare, 08.02.2013 в 21:52.
Если не секрет, откуда столько любви к ассемблеру? Чем языки более высокого уровня не угодили?
Начинал вообще с ольки, потом как то ни один язык так не прижился как фасм, масм слишком много писать, остальные языки слишком простые чтобы начинать, да и начал все это чтобы научится делать такую штуку как сделал GoldFinch
Добавлено через 18 минут
Спасибо Demion'у за помощь
Я не ту структуру записывал, нужно было
а я вместо неё засовывал структуру PROCESSENTRY32
+ еще поменять invoke CreateToolhelp32Snapshot,4,0
Дальше делаем мини цикл по отсеиванию ненужных потоков и готово!
Последний раз редактировалось St1mul, 08.02.2013 в 23:36.
Причина: Добавлено сообщение
Если не секрет, откуда столько любви к ассемблеру? Чем языки более высокого уровня не угодили?
Вот код не моего фреймворка для инжекта длл перенаправлением потока, код на C# но зная хоть примерно C++ можно понять. ManagedFasm это обертка над компилятором твоего любимого)
Сегодня днем я спрашивал его о том же...
St1mul, если бы ты внимательно смотрел пример с MSDN, в особенности начало ф-ции ListProcessThreads, то победил бы свою проблему гораздо раньше )
CreateToolhelp32Snapshot,4,0
Для твоей задачи надо передавать Pid процесса ( GetCurrentProcessId() ) в котором ты находишься, и не надо будет отсеивать чужие потоки.
Последний раз редактировалось Sherman, 08.02.2013 в 23:44.
Стал дальше копать.
Как открыть поток на полных правах? MSDN OpenThread Thread access
я вижу там есть THREAD_ALL_ACCESS, мне его и нужно, но там нету значения, а в фасме нет такой константы (это же фасм), со стандарт правами открывать не вариант т.к. эти все права нужны для SetThreadContext
Список имеющихся констант
Понадобилось перейти с win32 на win7.
Но при отладке кода в ольке завистает на моем коде в функции создания l2parameterstack, хотя в win32 все прекрасно работало
Вот чать кода: