Сейчас на форуме: hgdagon, asfa, bartolomeo (+5 невидимых) |
eXeL@B —› Программирование —› Помогите Delphi struct -> Asm |
Посл.ответ | Сообщение |
|
Создано: 10 октября 2006 07:36 · Личное сообщение · #1 У Ms-Rem`а есть такая штука: SYSTEM_HANDLE_INFORMATION_EX = packed record NumberOfHandles: dword; Information: array [0..0] of SYSTEM_HANDLE_INFORMATION; end; Не совсем понятно, как это будет выглядеть на асме Я сделал так: SYSTEM_HANDLE_INFORMATION_EX STRUCT NumberOfHandles DWORD ? Information SYSTEM_HANDLE_INFORMATION <> SYSTEM_HANDLE_INFORMATION_EX ENDS Но насколько я понимаю, Information должна быть массивом.. Вобщем, я запутался и мне не хватает знаний по делфи, чтоб это понять. Кто знает эту заразу, помогите, плиз. |
|
Создано: 10 октября 2006 07:51 · Личное сообщение · #2 Я думаю так: SYSTEM_HANDLE_INFORMATION_EX STRUCT NumberOfHandles DWORD ? Information SYSTEM_HANDLE_INFORMATION 1 dup(<>) SYSTEM_HANDLE_INFORMATION_EX ENDS скорее всего array [0..0] был сделан для объявления массива переменной длины. Т.е. определен как состоящий из 1 элемента, но обращаться можно и к большим. |
|
Создано: 10 октября 2006 08:08 · Личное сообщение · #3 |
|
Создано: 10 октября 2006 09:15 · Личное сообщение · #4 Всё хуже и хуже. Кто может помочь с переводом целой функции с делфи на асм? [HIGHLIGHT=delphi]{ получение хэндла процесса альтернативным методом } Function OpenProcessEx(dwProcessId: DWORD): THandle; var HandlesInfo: PSYSTEM_HANDLE_INFORMATION_EX; ProcessInfo: _PROCESS_BASIC_INFORMATION; idCSRSS: dword; hCSRSS : dword; tHandle: dword; r : dword; begin Result := 0; //открываем процесс csrss.exe idCSRSS := GetProcessId('csrss.exe'); hCSRSS := OpenProcess(PROCESS_DUP_HANDLE, false, idCSRSS); if hCSRSS = 0 then Exit; HandlesInfo := GetInfoTable(SystemHandleInformation); if HandlesInfo <> nil then for r := 0 to HandlesInfo^.NumberOfHandles do if (HandlesInfo^.Information[r].ObjectTypeNumber = $5) and //тип хэндла - процесс (HandlesInfo^.Information[r].ProcessId = idCSRSS) then //владелец - CSRSS begin //копируем хэндл себе if DuplicateHandle(hCSRSS, HandlesInfo^.Information[r].Handle, INVALID_HANDLE_VALUE, @tHandle, 0, false, DUPLICATE_SAME_ACCESS) then begin ZwQueryInformationProcess(tHandle, ProcessBasicInformation, @ProcessInfo, SizeOf(_PROCESS_BASIC_INFORMATION), nil); if ProcessInfo.UniqueProcessId = dwProcessId then begin VirtualFree(HandlesInfo, 0, MEM_RELEASE); CloseHandle(hCSRSS); Result := tHandle; Exit; end else CloseHandle(tHandle); end; end; VirtualFree(HandlesInfo, 0, MEM_RELEASE); CloseHandle(hCSRSS); end; [/HIGHLIGHT] Вот этот код надо переписать на асм, у меня получилось так: [HIGHLIGHT=asm]OpenProcessEx proc dwProcessId:DWORD invoke GetProcessId, OFFSET csrss mov idCSRSS, eax invoke OpenProcess, PROCESS_DUP_HANDLE, FALSE, idCSRSS mov hCSRSS, eax .IF eax == FALSE ret .ENDIF invoke GetInfoTable, SystemHandleInformation mov HandlesInfo.NumberOfHandles, eax .IF eax != NULL mov r, 0 mov edi, HandlesInfo.NumberOfHandles .WHILE r <= edi .IF HandlesInfo.Information[r].ObjectTypeNumber == 5 .IF HandlesInfo.Information[r].ProcessId == idCSRSS invoke DuplicateHandle, hCSRSS, eax, INVALID_HANDLE_VALUE, OFFSET tHandle, NULL, FALSE, DUPLICATE_SAME_ACCESS .IF eax != 0 invoke ZwQueryInformationProcess, tHandle, ProcessBasicInformation, OFFSET ProcessInfo, sizeof _PROCESS_BASIC_INFORMATION, NULL mov eax, dwProcessId .IF ProcessInfo.UniqueProcessId == eax invoke VirtualFree, OFFSET HandlesInfo, 0, MEM_RELEASE invoke CloseHandle, hCSRSS mov eax, tHandle ret .ELSE invoke CloseHandle, tHandle .ENDIF .ENDIF .ENDIF .ENDIF mov edi, HandlesInfo.NumberOfHandles inc r .ENDW .ENDIF invoke VirtualFree, OFFSET HandlesInfo, 0, MEM_RELEASE invoke CloseHandle, hCSRSS ret OpenProcessEx endp [/HIGHLIGHT] Но это нифига не правильно, опятьже проблемы с ранее упомянутой структурой (кажись). Вот структурки, переведённые с делфи: [HIGHLIGHT=asm] SYSTEM_HANDLE_INFORMATION STRUCT ProcessId DWORD ? ObjectTypeNumber DWORD ? Flags BYTE ? Handle WORD ? pObject DWORD ? GrentedAccess DWORD ? SYSTEM_HANDLE_INFORMATION ENDS SYSTEM_HANDLE_INFORMATION_EX STRUCT NumberOfHandles DWORD ? Information SYSTEM_HANDLE_INFORMATION 1 dup (<>) SYSTEM_HANDLE_INFORMATION_EX ENDS[/HIGHLIGHT] Вот, кто чем может, помогите. Голова уже трещит по швам... |
|
Создано: 10 октября 2006 09:29 · Личное сообщение · #5 Bit-hack пишет: invoke GetInfoTable, SystemHandleInformation mov HandlesInfo.NumberOfHandles, eax Bit-hack пишет: HandlesInfo := GetInfoTable(SystemHandleInformation); HandlesInfo - указатель на структуру, GetInfoTable возвращает указатель на нее, а ты записываешь его в HandlesInfo.NumberOfHandles. HandlesInfo должен быть PTR SYSTEM_HANDLE_INFORMATION_EX. |
|
Создано: 10 октября 2006 09:45 · Личное сообщение · #6 |
|
Создано: 10 октября 2006 10:06 · Личное сообщение · #7 Тогда ещё вопросец: [HIGHLIGHT=asm] .WHILE r <= edi lea eax, HandlesInfo.Information mov edx, type HandlesInfo.Information mov ecx, r lea eax, [eax+edx*ecx] mov eax, [eax].ObjectTypeNumber [/HIGHLIGHT] Не знаешь, как работать со структурами с массивами вместе взятыми, как надо модифицировать приведённый код для перебора этого всего в цикле. |
|
Создано: 10 октября 2006 15:24 · Личное сообщение · #8 Хм… Bit-hack ну, возьми, скачай архив advapihook.rar открой файл OpenProcessEx.exe из этого архива в IDA Pro Advanced, переделай синтаксис под MASM32 (там чистый код и думаю, этот вариант подойдет и для всех остальных функций) заодно и сравнишь исходники Ms-Rem`а c реальным кодом я бы так и сделал, если бы мне нужно было чем с синтаксисом исходников воевать. (типа: рипнуть код.) Справочник ianzag.megasignal.com/ftp/pub/doc/books/Windows/ файл Windows NT Native API.pdf 2mb ;) Удачи! ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 10 октября 2006 20:21 · Личное сообщение · #9 |
eXeL@B —› Программирование —› Помогите Delphi struct -> Asm |
Эта тема закрыта. Ответы больше не принимаются. |