Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2011, 14:01   #1
-LeV-
Пользователь
 
Регистрация: 05.06.2010
Сообщений: 29
По умолчанию CreateRemoteThread

Вызов функции через CreateRemoteThread считается вызовом от имени процесса, в который встраивается код?

Просто я вызываю через CreateRemoteThread функцию ActivatekeyboardLayout, которая меняет раскладку клавиатуры для вызывающего процесса, а она не меняется чет.

Если надо могу код выложить, только там жесть)
-LeV- вне форума Ответить с цитированием
Старый 09.06.2011, 16:59   #2
mdfyz
Новичок
Джуниор
 
Регистрация: 09.06.2011
Сообщений: 1
По умолчанию

Цитата:
Сообщение от -LeV- Посмотреть сообщение
Вызов функции через CreateRemoteThread считается вызовом от имени процесса, в который встраивается код?

Просто я вызываю через CreateRemoteThread функцию ActivatekeyboardLayout, которая меняет раскладку клавиатуры для вызывающего процесса, а она не меняется чет.

Если надо могу код выложить, только там жесть)
Вызов происходит из-под токена, которому принадлежит этот процесс и в адресном пространстве этого процесса.
mdfyz вне форума Ответить с цитированием
Старый 09.06.2011, 17:28   #3
-LeV-
Пользователь
 
Регистрация: 05.06.2010
Сообщений: 29
По умолчанию

Спасибо

Оказалось в неправильном порядке в стек параметры передавал, теперь работает

Поторопился я с "работает"

Язык меняется почему-то только на русский, на английский вообще ни в какую не хочет (причем независимо от начального языка в окне)
Хотя вызов просто ActivatekeyboardLayout(HKL_NEXT, KLF_SETFORPROCESS) меняет нормально и в обоих направлениях.
В чем может быть проблема - ума не приложу

Код:
  HWND hWnd = FindWindow(NULL ,"Neverwinter Nights    v1.67.8093");
  //HWND hWnd = FindWindow(NULL ,"Безымянный - Блокнот");
  HANDLE hProc = NULL;
  DWORD dwProcId = 0;
  GetWindowThreadProcessId(hWnd, &dwProcId);
  hProc = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_WRITE|
  PROCESS_VM_OPERATION, false, dwProcId);
  ShowMessage(BoolToStr(hProc != NULL, true));
  BYTE asmPush = 0x68;
  WORD asmCall = 0x15ff;
  HANDLE kl = (HANDLE)HKL_NEXT;
  UINT flag = KLF_SETFORPROCESS;
  DWORD exitArg = 0;
  DWORD ActKeyLayoutAddr = (DWORD)GetProcAddress(GetModuleHandle("User32.dll"),
                                                      "ActivateKeyboardLayout");
  DWORD ExitThreadAddr = (DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"),
                                                                  "ExitThread");

  int length = sizeof(asmPush)+sizeof(kl)+sizeof(asmPush)+sizeof(flag)+
                sizeof(asmCall)+sizeof(ActKeyLayoutAddr)+sizeof(asmPush)+
                sizeof(exitArg)+sizeof(asmCall)+sizeof(ExitThreadAddr)+
                sizeof(ActKeyLayoutAddr)+sizeof(ExitThreadAddr);

  BYTE* p_code = (BYTE*)VirtualAllocEx(hProc, 0, length,
                                   MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  ShowMessage(BoolToStr(p_code != NULL, true));

  /*DWORD ActKeyLayout = DWORD(p_code+sizeof(asmPush)+sizeof(kl)+sizeof(asmPush)+sizeof(flag)+
                sizeof(asmCall)+sizeof(ActKeyLayoutAddr)+sizeof(asmPush)+
                sizeof(exitArg)+sizeof(asmCall)+sizeof(ExitThreadAddr));
  DWORD ExitThreadParam = DWORD(p_code+sizeof(asmPush)+sizeof(kl)+sizeof(asmPush)+sizeof(flag)+
                sizeof(asmCall)+sizeof(ActKeyLayoutAddr)+sizeof(asmPush)+
                sizeof(exitArg)+sizeof(asmCall)+sizeof(ExitThreadAddr))+
                sizeof(ActKeyLayoutAddr); */
 DWORD ActKeyLayout = DWORD(p_code+27);
 DWORD ExitThreadParam = DWORD(p_code+31);

  BYTE* buf = new BYTE[length], *ptr;
  ptr = buf;
  memcpy(ptr, &asmPush, sizeof(asmPush));
  ptr += sizeof(asmPush);
  memcpy(ptr, &flag, sizeof(flag));
  ptr += sizeof(flag);
  memcpy(ptr, &asmPush, sizeof(asmPush));
  ptr += sizeof(asmPush);
  memcpy(ptr, &kl, sizeof(kl));
  ptr += sizeof(kl);
  memcpy(ptr, &asmCall, sizeof(asmCall));
  ptr += sizeof(asmCall);
  memcpy(ptr, &ActKeyLayout, sizeof(ActKeyLayout));
  ptr += sizeof(ActKeyLayout);
  memcpy(ptr, &asmPush, sizeof(asmPush));
  ptr += sizeof(asmPush);
  memcpy(ptr, &exitArg, sizeof(exitArg));
  ptr += sizeof(exitArg);
  memcpy(ptr, &asmCall, sizeof(asmCall));
  ptr += sizeof(asmCall);
  memcpy(ptr, &ExitThreadParam, sizeof(ExitThreadAddr));
  ptr += sizeof(ExitThreadAddr);
  memcpy(ptr, &ActKeyLayoutAddr, sizeof(ActKeyLayoutAddr));
  ptr += sizeof(ActKeyLayoutAddr);
  memcpy(ptr, &ExitThreadAddr, sizeof(ExitThreadAddr));
  ptr += sizeof(ExitThreadAddr);

  ULONG written;
  DWORD id;
  WriteProcessMemory(hProc, (void*)p_code, (void*)buf, length, &written);
  HANDLE MyThread = CreateRemoteThread(hProc, NULL, 0,
               (unsigned long (__stdcall *)(void *))p_code, 0, 0, &id);
  WaitForSingleObject(MyThread, INFINITE);
  VirtualFreeEx(hProc, (void*)p_code, length, MEM_RELEASE);
  delete[] buf;

Последний раз редактировалось -LeV-; 09.06.2011 в 23:09.
-LeV- вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск