Сейчас на форуме: hgdagon, asfa, bartolomeo (+5 невидимых)

 eXeL@B —› Программирование —› Помогите Delphi struct -> Asm
Посл.ответ Сообщение


Ранг: 303.7 (мудрец), 4thx
Активность: 0.190
Статус: Участник
tPORt Manager

Создано: 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 должна быть массивом.. Вобщем, я запутался и мне не хватает знаний по делфи, чтоб это понять. Кто знает эту заразу, помогите, плиз.




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 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 элемента, но обращаться можно и к большим.




Ранг: 303.7 (мудрец), 4thx
Активность: 0.190
Статус: Участник
tPORt Manager

Создано: 10 октября 2006 08:08
· Личное сообщение · #3

Хммм, было бы интересно услышать коммент от самого Ms-Rem`а...




Ранг: 303.7 (мудрец), 4thx
Активность: 0.190
Статус: Участник
tPORt Manager

Создано: 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]
Вот, кто чем может, помогите. Голова уже трещит по швам...




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 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.




Ранг: 303.7 (мудрец), 4thx
Активность: 0.190
Статус: Участник
tPORt Manager

Создано: 10 октября 2006 09:45
· Личное сообщение · #6

HoBleen
Пасиб, реально!




Ранг: 303.7 (мудрец), 4thx
Активность: 0.190
Статус: Участник
tPORt Manager

Создано: 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]

Не знаешь, как работать со структурами с массивами вместе взятыми, как надо модифицировать приведённый код для перебора этого всего в цикле.



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 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





Ранг: 303.7 (мудрец), 4thx
Активность: 0.190
Статус: Участник
tPORt Manager

Создано: 10 октября 2006 20:21
· Личное сообщение · #9

Лан, спасибо всем, тему пока не закрываю, вдруг ещё что надо будет


 eXeL@B —› Программирование —› Помогите Delphi struct -> Asm
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати