Работа с описателями: практикум

Обсуждение статей, опубликованных на сайте.
gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Работа с описателями: практикум

Сообщение gaidar » 31.07.2006 (Пн) 16:40

Максим Павлов
Работа с описателями: практикум


http://vbstreets.ru/VB/Articles/66404.aspx
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 02.08.2006 (Ср) 5:27

gaidar
А ассемблеровский код как-то криво отображается, табуляции кое-где лишние выскакивают... :)
А я все практикую лечение травами...

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 03.08.2006 (Чт) 23:45

Похоже HTML портится контролом... Подумаю, что сделать.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 07.08.2006 (Пн) 8:58

gaidar
Ты слово "хэндл" в статье заменял на "описатель" обычным поиском с заменой? А то встречаются слова, типа "описательу"... :)
А я все практикую лечение травами...

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 18.08.2006 (Пт) 22:33

дело в том, что для написания многопоточной программы на VB не достаточно вызвать CreateThread(AddressOf ThreadProc), нормально такая программа работать не будет. Можно, конечно, мудрить с TLS, но мы пойдем другим, более легким путем – мы напишем нужный нам код на ассемблере.

Гы, а я счтаю что написание дллки на ассемблере являеться крайностью, если без этого можна обойтись, то почему бы так не сделать. Почему VB выбивает когда в созданом потоке вызываеться API функция? А потому что API функции объявленные с помощью Declare, не вызываються напрямую. Их вызов происходит через функцию экспортироемую "msvbvm60" - DllFunctionCall. Она же обращаеться к TLS, что и приводит к крешу откомпилированого приложения. Чтобы решить эту проблему достаточно создать tlb(ф-ции прописаные в TLB вызываються через таблицу импорта), с API функциями которые используються в потоке. :wink:

Поэтому я рекомендую новичкам, спрашивающим: «А как узнать полный путь к EXE?», пользоваться этим методом.

Можна еще воспользоваться GetProcessImageFileName(WinXp) или найти путь к первому подключеному модулю.
Естественно, что внедрять чистый VB код мы не будем (думаю причины объяснять не нужно?), поэтому опять обратимся за помощью к ассемблеру.

А зачем? Я вот например для закрития описателей в чужом процессе юзал следущую функцию:
Код: Выделить всё
Function RemoteCall(pid As Long, FunctionName As String, Library As String, ByVal param As Long, Optional ByRef Result As Boolean = 0) As Long
    Dim hProcess As Long, threadid As Long, ret As Long, hThread As Long, h As Long
    hProcess = OpenProcess(PROCESS_CREATE_THREAD Or &H8 Or PROCESS_VM_READ Or &H200 Or PROCESS_VM_WRITE Or PROCESS_QUERY_INFORMATION, False, pid)
    ret = GetProcAddress(GetModuleHandle(Library), FunctionName)

    If ret <> 0 Then
        Dim lpAddress As Long, hModule As Long
        hModule = GetModuleHandle(Library)

        If hModule = 0 Then hModule = LoadLibrary(Library)
        lpAddress = GetProcAddress(hModule, FunctionName)

        If lpAddress = 0 Then
            Result = False
        Else
            hThread = CreateRemoteThread(hProcess, 0, 0, ByVal lpAddress, param, 0&, threadid)
            If hThread <> 0 Then
                ret = WaitForSingleObject(hThread, 5000)
                If ret = 0 Then
                    ret = GetExitCodeThread(hThread, h)
                    RemoteCall = h
                Else
                    Result = False
                End If
                CloseHandle hThread
            End If

        Else
            Result = False
        End If
    End If

    CloseHandle hProcess
End Function

А для закрития хэндла я использовал, не СloseHandle, а NtClose,
Код: Выделить всё
Free = RemoteCall(s.ProcessId, "NtClose", "ntdll", s.handle)

Так что у меня код вообще не юзает отдельной библиотеки.

Код: Выделить всё
Единственная функция, после вызова которой поток еще можно будет хоть как ни будь прибить – это GetFileType.

А NtQueryFileInformation разве не подходит?

Пока все.
الفيجوال بيسك الرابح

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 21.08.2006 (Пн) 8:20

А NtQueryFileInformation разве не подходит?
Нет. Я пробовал - умирает.

По поводу ассемблера скажу так - с TLS возиться я не захотел, поэтому и сделал либу на АСМе, хотя способ закрытия хэндлов, предложенный тобой, дествительно лучше, да еще и на чистом ВБ. Не знаю, почему я про него не вспомнил - видать потому, что писал в перерывах между работой, впопыхах.
А я все практикую лечение травами...

Geksogen
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 11.03.2008 (Вт) 14:15

Caption

Сообщение Geksogen » 12.03.2008 (Ср) 19:30

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


Вернуться в Статьи

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

    TopList