Сейчас на форуме: tyns777, zombi-vadim, zds (+4 невидимых)

 eXeL@B —› Программирование —› RtlCreateUserThread - приложение падает с ошибкой 0xC0000005
Посл.ответ Сообщение

Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 мая 2013 13:38 · Поправил: AlexSun
· Личное сообщение · #1

Собственно, у меня проблема подобная на рассматриваемую в этой теме.
Только я пишу на C# и система Windows 8 x64.
Хочу в каком-то другом процессе вывести сообщение "Hello world". Вот код:
Code:
  1.     public partial class Form1 : Form
  2.     {
  3.         [DllImport("kernel32.dll")]
  4.         static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
  5.  
  6.         //[DllImport("user32.dll")]
  7.         //static extern int MessageBox(IntPtr hWnd, String text, String caption, int options);
  8.  
  9.         [DllImport("ntdll.dll")]
  10.         public static extern uint RtlCreateUserThread(
  11.             [In] IntPtr Process,
  12.             [In] IntPtr ThreadSecurityDescriptor,
  13.             [In] bool CreateSuspended,
  14.             [In] int StackZeroBits,
  15.             //[In] [Optional] IntPtr MaximumStackSize,
  16.             uint MaximumStackSize,
  17.             [In] [Optional] IntPtr InitialStackSize,
  18.             [In] IntPtr StartAddress,
  19.             [In] IntPtr Parameter,
  20.             [Out] out IntPtr Thread,
  21.             [Out] out ClientId ClientId
  22.         );
  23.  
  24.         [StructLayout(LayoutKind.Sequential)]
  25.         public struct ClientId
  26.         {
  27.             public ClientId(int processId, int threadId)
  28.             {
  29.                 this.UniqueProcess = new IntPtr(processId);
  30.                 this.UniqueThread = new IntPtr(threadId);
  31.             }
  32.  
  33.             public IntPtr UniqueProcess;
  34.             public IntPtr UniqueThread;
  35.  
  36.             public int ProcessId { get { return this.UniqueProcess.ToInt32(); } }
  37.             public int ThreadId { get { return this.UniqueThread.ToInt32(); } }
  38.         }
  39.  
  40.         public Form1()
  41.         {
  42.             InitializeComponent();
  43.         }
  44.  
  45.         public void HelloWorld()
  46.         {
  47.             MessageBox.Show("Hello world");
  48.             //MessageBox(IntPtr.Zero, "test", "test", 0);
  49.             return;
  50.         }
  51.  
  52.         public delegate void HelloProcess();
  53.  
  54.         private void button1_Click(object sender, EventArgs e)
  55.         { // инъекция
  56.             IntPtr hProc = OpenProcess(0x001F0FFF, false, 3740);
  57.             HelloProcess managedMethod = new HelloProcess(HelloWorld);
  58.             Delegate untypedManagedMethod = (Delegate)managedMethod;
  59.             IntPtr nativeThunk = Marshal.GetFunctionPointerForDelegate(untypedManagedMethod);
  60.  
  61.             IntPtr thread = new IntPtr();
  62.             ClientId clientid = new ClientId();
  63.  
  64.             uint res = RtlCreateUserThread(hProc, IntPtr.Zero, false, 0, 4096, IntPtr.Zero, nativeThunk, IntPtr.Zero, out thread, out clientid);
  65.         }
  66.     }

Другое приложение падает с ошибкой 0xC0000005. RtlCreateUserThread возвращает 0, thread и clientid инициализируются. Приложения x64.
Экспериментирую на notepad.exe, пока что руками пишу его pid в OpenProcess.



Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 мая 2013 14:16
· Личное сообщение · #2

notepad.exe:
Code:
  1. Сигнатура проблемы:
  2.   Имя события проблемы:    BEX64
  3.   Имя приложения: notepad.exe
  4.   Версия приложения:       6.2.9200.16384
  5.   Отметка времени приложения:       501099bc
  6.   Имя модуля с ошибкой:    StackHash_5177
  7.   Версия модуля с ошибкой: 0.0.0.0
  8.   Отметка времени модуля с ошибкой: 00000000
  9.   Смещение исключения:     PCH_0B_FROM_ntdll+0x000000000000315B
  10.   Код исключения: c0000005
  11.   Данные исключения:       0000000000000008
  12.   Версия ОС:      6.2.9200.2.0.0.256.48
  13.   Код языка:      1049
  14.   Дополнительные сведения 1:        5177
  15.   Дополнительные сведения 2:        51772aac790a45f41f2d59c789eb0956
  16.   Дополнительные сведения 3:        6812
  17.   Дополнительные сведения 4:        681265a696a429762844460fc751bcb1




Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 07 мая 2013 14:19
· Личное сообщение · #3

Ничего что nativeThunk находится в адресном пространстве совсем не того процесса, в котором вы создаете поток?

-----
старый пень




Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 мая 2013 14:24
· Личное сообщение · #4

Использовать VirtualAllocEx & WriteProcessMemory? Как с помощью WriteProcessMemory записать один метод?




Ранг: 136.0 (ветеран), 360thx
Активность: 0.270.14
Статус: Участник
Qt Developer

Создано: 07 мая 2013 14:31
· Личное сообщение · #5

AlexSun пишет:
Использовать VirtualAllocEx & WriteProcessMemory? Как с помощью WriteProcessMemory записать один метод?

http://www.programmersforum.ru/showthread.php?t=93673

-----
http://ntinfo.biz




Ранг: 65.3 (постоянный), 10thx
Активность: 0.020
Статус: Участник

Создано: 10 мая 2013 00:27
· Личное сообщение · #6

ДЛЛ пиши, подгружай в АП цели, и будет счастье.
Передача указателя на свою обертку вокруг managed-метода - жесть. Даже если скопировать этот метод в АП цели (хз как), всё равно там ведь не будет всей .NET FW подгруженной, не будет ВМ. В общем, запускать managed-код в АП нативного приложения - имхо, жуткий изврат.



Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 17 мая 2013 23:23 · Поправил: AlexSun
· Личное сообщение · #7

r_e
Написал так:
Code:
  1. IntPtr nativeThunk = GetProcAddress(GetModuleHandle("ntdll.dll"), "RtlExitUserProcess");

Работает. RtlExitUserProcess находится в том же адресном пространстве, что и notepad?

А так не работает:
Code:
  1. IntPtr nativeThunk = GetProcAddress(LoadLibrary("D:\hello.dll"), "HelloAlexSun");

Та же C0000005.



Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 17 мая 2013 23:38 · Поправил: AlexSun
· Личное сообщение · #8

Загружаю функцию из своей DLL на С++ в чужой процесс, все возвращаемые значения ок, RtlCreateUserThread возвращает 0, чужой процесс падает с ошибкой 0xC0000005...
Итого код:
Code:
  1.         private void button1_Click(object sender, EventArgs e)
  2.         { // инъекция
  3.             IntPtr hProc = OpenProcess(0x001F0FFF, false, 1260);
  4.             
  5.             IntPtr thread = new IntPtr();
  6.             ClientId clientid = new ClientId();
  7.  
  8.             //IntPtr nativeThunk = GetProcAddress(GetModuleHandle("ntdll.dll"), "RtlExitUserProcess");
  9.             IntPtr nativeThunk = GetProcAddress(LoadLibrary("D:\hello.dll"), "HelloAlexSun");
  10.  
  11.             byte[] bytes = Encoding.ASCII.GetBytes("D:\hello.dll");
  12.  
  13.             IntPtr alloc = VirtualAllocEx(hProc, IntPtr.Zero, bytes.Length, MemoryState.Commit | MemoryState.Reserve, MemoryProtection.ReadWrite);
  14.             int written;
  15.             bool write = WriteProcessMemory(hProc, alloc, bytes, bytes.Length, out written);
  16.             uint res = RtlCreateUserThread(hProc, IntPtr.Zero, false, 0, 4096, IntPtr.Zero, alloc, IntPtr.Zero, out thread, out clientid);
  17.             MessageBox.Show(res.ToString("X"));
  18.         }

У кого какие мысли?



Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 17 мая 2013 23:53 · Поправил: UnameR
· Личное сообщение · #9

alloc это у тебя адрес строки, а ты на него поток создаешь...
Тебе поток надо создавать на адрес LoadLibrary и StartParameter как alloc
Так ты свою библиотеку загрузишь в чужой процесс.

Потом можно как-нибудь получить базу твоей загруженой либы.
Ну а там адрес нужной функции легко уже можно вычислить и создать поток.

>>Работает. RtlExitUserProcess находится в том же адресном пространстве, что и notepad?
kernel32 user32 ntdll и некоторые другие для всех процессов имеют одинаковую базу (с оптимизацией связанно, CopyOnWrite)

Твоя либа каждый раз при загрузке на новом месте. Да и плюс её может просто не быть в процессе нужном.



Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 17 мая 2013 23:57 · Поправил: AlexSun
· Личное сообщение · #10

UnameR
Код можно? Или четкую последовательность действий... А то не очень понял.



Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 18 мая 2013 00:07
· Личное сообщение · #11

Кажется, понял о чем ты. Переписал:
Code:
  1.         private void button1_Click(object sender, EventArgs e)
  2.         { // инъекция
  3.             IntPtr hProc = OpenProcess(0x001F0FFF, false, 3560);
  4.             
  5.             IntPtr thread = new IntPtr();
  6.             ClientId clientid = new ClientId();
  7.  
  8.             //IntPtr nativeThunk = GetProcAddress(GetModuleHandle("ntdll.dll"), "RtlExitUserProcess");
  9.             IntPtr nativeThunk = GetProcAddress(LoadLibrary("D:\hello.dll"), "HelloAlexSun");
  10.  
  11.             byte[] bytes = Encoding.ASCII.GetBytes("D:\hello.dll");
  12.  
  13.             IntPtr alloc = VirtualAllocEx(hProc, IntPtr.Zero, bytes.Length, MemoryState.Commit | MemoryState.Reserve, MemoryProtection.ReadWrite);
  14.             int written;
  15.             bool write = WriteProcessMemory(hProc, alloc, bytes, bytes.Length, out written);
  16.  
  17.             IntPtr lr = LoadLibrary("kernel32.dll");
  18.             IntPtr load = GetProcAddress(lr, "LoadLibraryA");
  19.  
  20.             uint res = RtlCreateUserThread(hProc, IntPtr.Zero, false, 0, 0, 4096, load, alloc, out thread, out clientid);
  21.             //MessageBox.Show(res.ToString("X"));
  22.         }

Теперь чужой процесс не падает, но моя функция из dll не выполняется. Код dll:
Code:
  1. #include <Windows.h>
  2.  
  3. BOOL APIENTRY DllMain( HMODULE hModule,
  4.                                       DWORD  ul_reason_for_call,
  5.                                       LPVOID lpReserved
  6.                                     )
  7. {
  8.          switch (ul_reason_for_call)
  9.          {
  10.          case DLL_PROCESS_ATTACH:
  11.          case DLL_THREAD_ATTACH:
  12.          case DLL_THREAD_DETACH:
  13.          case DLL_PROCESS_DETACH:
  14.                  break;
  15.          }
  16.  
  17.          return TRUE;
  18. }
  19.  
  20.  extern "C" __declspec(dllexport) void _cdecl HelloAlexSun()
  21. {
  22.          MessageBoxA(NULL, "Hello, AlexSun!", "Test", 0);
  23. }




Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 18 мая 2013 00:32 · Поправил: UnameR
· Личное сообщение · #12

Расшифровка шел кода:
01405301 E8 00000000 CALL 01405306
01405306 58 POP EAX
01405307 83C0 16 ADD EAX,0x16
0140530A 50 PUSH EAX
0140530B 50 PUSH EAX
0140530C FF50 FC CALL DWORD PTR DS:[EAX-0x4]
0140530F 59 POP ECX
01405310 8941 F8 MOV DWORD PTR DS:[ECX-0x8],EAX
01405313 C3 RETN
DD сюда запишется база твоей либы
DD сюда надо записать адрес LoadLibrary
Дальше null-terminated путь до либы (D:\hello.dll например)


Псевдокод:
unsigned char ddd[] = "\xE8\x00\x00\x00\x00\x58\x83\xC0\x16\x50\x50\xFF\x50\xFC\x59\x89\x41\xF8\xC3\x00\x00\x00\x00\x00\x00\x00\x00C:\Hello.dll\x00";
unsigned char *dd = ddd;
*((unsigned int*)(dd+23)) = (unsigned int)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
unsigned char *alloc = VirtualAllocEx(hProc, 0, sizeof(ddd), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTEREADWRITE);
WriteProcessMemory(hProc, alloc, ddd, sizeof(ddd), written);
RtlCreateUserThread(на alloc без параметра);
int fff = 0;
ReadProcessMemory(hProc, alloc+19, &fff, 4, readen);
fff будет содержать базу твоей либы в новом процессе
myBASE = LoadLibrary("D:\hello.dll");
XAddr = GetProcAddress(myBASE, "HelloAlexSun")-myBASE ;
RtlCreateUserThread(создать поток на fff+XAddr);

Не проверял, но идея должна быть понятна




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 21 мая 2013 05:19
· Личное сообщение · #13

> Теперь чужой процесс не падает

Должен падать, так как тред нэйтивный(зачем хз) и возвращается на 0:0.



Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 21 мая 2013 14:09
· Личное сообщение · #14

Dr0p
Пора уже слезть с виндоус хп и открыть для себя NT6X и x64. Функционал этой рутины существенно отличается в современных версиях венды от того как он выглядел в гавне мамонта, см. матчасть NtCreateThreadEx. Твой пост не имеет смысла.

AlexSun
Инжекты длл через RtlCreateUserThread осилили даже на autoit-e, что говорит о том что у вас кривой код.




Ранг: 136.0 (ветеран), 360thx
Активность: 0.270.14
Статус: Участник
Qt Developer

Создано: 21 мая 2013 15:59
· Личное сообщение · #15

AlexSun пишет:
У кого какие мысли?


http://www.delphisources.ru/pages/sources/system/2010-year/dll-injector.html

Alchemistry пишет:
Пора уже слезть с виндоус хп


Не нужно.

-----
http://ntinfo.biz


| Сообщение посчитали полезным: Abraham

Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 22 мая 2013 05:26
· Личное сообщение · #16

hors
NtCreateThreadEx нет в Windows XP. И тема про инжект в Windows 8, CreateRemoteThread там работать не будет. И смысл твоего поста? Еще раз показать какой ты дурак?




Ранг: 136.0 (ветеран), 360thx
Активность: 0.270.14
Статус: Участник
Qt Developer

Создано: 22 мая 2013 11:08
· Личное сообщение · #17

Alchemistry пишет:
И тема про инжект в Windows 8, CreateRemoteThread там работать не будет


Всё там работает. --> Link <--

Alchemistry пишет:
И смысл твоего поста? Еще раз показать какой ты дурак?


Почти в каждом своём сообщении Вы жалуетесь на то, что плохо понимаете смысл, который окружающие Вас люди пытаются до Вас донести.
Не переживайте, на начальном этапе легкие расстройства прекрасно лечатся. Главное вовремя принять меры, чтобы не мучать себя и близких родственников.

-----
http://ntinfo.biz


| Сообщение посчитали полезным: Dr0p


Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 22 мая 2013 17:49
· Личное сообщение · #18

hors
Мну ему ответил, но аверы/модеры покиляли мой пост. Тут киляется всё негодное. Вы должны петь дифирамбы им, иначе вас забанят :D




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 22 мая 2013 18:39
· Личное сообщение · #19

клерк вали к себе




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 23 мая 2013 19:51 · Поправил: Dr0p
· Личное сообщение · #20

reversecode

Там тролить некого, все банятся


 eXeL@B —› Программирование —› RtlCreateUserThread - приложение падает с ошибкой 0xC0000005
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати