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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2012, 15:45   #11
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

Цитата:
почему все всегда начинают докапываться "зачем тебе это надо"???
да потому что, пока не увидишь смысла в задаче, ее не интересно решать.

Другими словами, хочется взглянуть на проблему в комплексе и, как правило, находятся обходные решения, которые топик-стартер просто не замечает в силу разного рода причин
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 04.05.2012, 16:20   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

внедряетесь и вызываете свой SetTimer.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.05.2012, 16:48   #13
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
да потому что, пока не увидишь смысла в задаче, ее не интересно решать.
хорошо. основание справедливо.
объясню смысл
пролог:
лет восемь назад попалась мне мне прога, которая определяла окно под курсором мыши. В то время я еще представить не мог, что винда сплошь состоит из окон, которые за секунду принимают чёртову кучу сообщений и очень удивился, как так прога это делает
------
в 2008 году начал изучать программирование и постепенно это узнал.
за это время мне попадались разные проги для сканирования окон, получения их стиля и т.п.
но каждая из них была либо не удобная в использовании, либо малофункциональная. Две из таких "Microsoft spy++" и "InqSoft windows scanner".
Полтора года назад я узнал, что с помощью функции SendMessage можно отправить любому окну любое сообщение, чего нельзя сделать существующими программами. "InqSoft" всё-же может это делать, но в ограниченном режиме. И интерфейс у нее крайне не удобен.
вот и появилась идея создать программу, которая бы делала с окнами и контролами почти всё, что позволяют функции WinAPI, имея при этом относительно удобный и понятный интерфейс.
я уже сделал следующее:
- Отображение списка всех Parent-окон. при нажатии на любое, отображается список его child-окон.
- переименование окон.
- применение showwindow, enablewindow;
- развернуть / свернуть окно.
- управление размером и позицией окна.
- получение / изменение Parent'а окна
- получение / изменение стилей окна с помощью checkbox'ов.
и т.п.
на данном этапе, меня интересует вопрос с таймером
BLACK_RAIN вне форума Ответить с цитированием
Старый 04.05.2012, 16:52   #14
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
внедряетесь и вызываете свой SetTimer.
я не умею! вот и спрашиваю! научите меня!
BLACK_RAIN вне форума Ответить с цитированием
Старый 04.05.2012, 18:57   #15
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

В теории надо сделать следущее.
Окном владеет чужой процесс.
Надо получить его PID: GetWindowThreadProcessId (HWND, LPDWORD dwProcessId)
Открыть его, получив хендл:
hProcess = OpenProcess (PROCESS_CREATE_THREAD |PROCESS_VM_OPERATION |PROCESS_VM_WRITE, FALSE, dwProcessId);

Написать длл и заставить процесс загрузить ее к себе.
Код выполняемый в длл, будет выполнятся в контексте чужого потока, что вообщем и требуется.
Чтобы заставить процесс загрузить эту длл надо, чтобы он вызвал функцию LoadLibrary.
Для этого выделяем память под строку с полным путем внедряемой длл:
VirtualAllocEx
Записываем строку WriteProcessMemory(hProcess , path, ....)
И вызываем создание удаленного потока:
pLL = GetProcAddress(GetModuleHandle("Ker nel32"), "LoadLibraryA");
hThread = CreateRemoteThread(hProcess, NULL, 0, pLL, path, 0, NULL);

Длл получит уведомление DLL_PROCESS_ATTACH и пошла мазута
EUGY вне форума Ответить с цитированием
Старый 05.05.2012, 08:57   #16
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

а какие именно аргументы передавать в функции VirtualAllocEx и WriteProcessMemory?
MSDN читал, но не понял, какие из них нужны в моем случае. А подбирать их методом тыка - полный бред.
какой тип у переменной pLL? Pointer?
BLACK_RAIN вне форума Ответить с цитированием
Старый 05.05.2012, 09:11   #17
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
MSDN читал, но не понял, какие из них нужны в моем случае
Очень жаль...

Код:
char path[] = "C:\\Path\\Myinject.dll";
size_t size = strlen(path); // или может еще +1 для '\0' ?
LPVOID ptr =  VirtualAllocEx(hProcess, NULL, size, MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
size_t dww;
WriteProcessMemory(hProcess, ptr, path, size,&dww);

PTHREAD_START_ROUTINE pLL = GetProcAddress(....
не тестирую, как-то так...
Влом проверять.

Последний раз редактировалось EUGY; 05.05.2012 в 09:18.
EUGY вне форума Ответить с цитированием
Старый 05.05.2012, 12:00   #18
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Очень жаль...
Ну а что вы хотели от самоучки?
для этого и существуют форумы по программированию. Если чего-то не знаешь или не понимаешь - задал вопрос, получил ответ.
Цитата:
Сообщение от EUGY
не тестирую, как-то так... Влом проверять.
я сделал так:

в программe:
Код:
var
t : string;
w : hwnd;
processid, tid, nob : cardinal;
hthread : thandle;
ptr1, pLL : pointer;
     begin
       t := gettext(edit2);  // Задаю хэндл окна
       w := strtoint(t);
       GetWindowThreadProcessId(W, @ProcessId);

  hProcess := OpenProcess( PROCESS_create_thread or
                   process_vm_operation or process_vm_write, false, ProcessId); 

t := cfg.SelfPath+'timerdll.dll'; //selfpath= папка с моей прогой и длл

ptr1 := virtualallocex(hprocess,nil,length(t),mem_reserve or mem_commit,page_readwrite);
writeprocessmemory(hprocess,ptr1,@t,length(t),nob);

pLL := GetProcAddress(GetModuleHandle('Kernel32.dll'), 'LoadLibraryA');
hThread := CreateRemoteThread(hProcess, Nil, 0, pLL, @t, 0, tid);

    if hthread>0 then
    begin
    WaitForSingleObject(hThread, INFINITE);
    CloseHandle(hThread);
    end;
end;
в dll:
Код:
procedure DllInit;
begin
  messagebox(0,'','',0);
end;

procedure DllMain(Reason: DWord);
begin
  case Reason of
    DLL_PROCESS_ATTACH:
      DllInit;
    DLL_PROCESS_DETACH:
      DllFin;
  end;
end;

begin
  DllProc := @DllMain;
  DllMain(DLL_PROCESS_ATTACH);
end.
как я понял, после вызова hThread := CreateRemoteThread(hProcess, Nil, 0, pLL, @t, 0, tid), в dll должна выполниться процедура DllInit и должен вылезти MessageBox, но этого не происходит.
hThread > 0
где я накосячил?
BLACK_RAIN вне форума Ответить с цитированием
Старый 05.05.2012, 12:28   #19
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Вроде суть уловили почти правильно.
size = length(t) + 1; MEM_RESERVE уберите.
В пятом параметре CreateRemoteThread не @t, а указатель на выделенную через VirtualAllocEx память ptr1

Ну и каждую функцию в отладчике проходите, смотрите, что они возвращают.
EUGY вне форума Ответить с цитированием
Старый 05.05.2012, 13:02   #20
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

переделал, но MessageBox не видно.
Код:
size := length(t)+1;
ptr1 := virtualallocex(hprocess,nil,size,mem_commit,page_readwrite);
writeprocessmemory(hprocess,ptr1,@t,size,nob);

pLL := GetProcAddress(GetModuleHandle('Kernel32.dll'), 'LoadLibraryA');
hThread := CreateRemoteThread(hProcess, Nil, 0, pLL, ptr1, 0, tid); //hthread > 0
Цитата:
Сообщение от EUGY Посмотреть сообщение
Ну и каждую функцию в отладчике проходите, смотрите, что они возвращают.
все переменные становятся чему-то равны (не 0 или nil), значит функции выполняются.

Последний раз редактировалось BLACK_RAIN; 05.05.2012 в 13:15.
BLACK_RAIN вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Таймер SetTimer и глюки с ним Jugger Win Api 2 09.03.2012 20:21
Settimer в winx64 не работает, рушит Excel?! budda999 Microsoft Office Excel 9 07.01.2012 13:43
Отследить изменение курсора в чужих окнах Lime Общие вопросы Delphi 2 02.07.2009 19:17
SetTimer, KillTimer NeiL Win Api 5 05.03.2008 07:37