Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.04;
Скачать: CL | DM;

Вниз

Delphi2Asm   Найти похожие ветки 

 
mixir   (2004-03-14 13:19) [0]

Помогите пожайлуста перевести код с Делфи в Ассемблер, а то я запарился
вроде сам перевел но всеравно глюк какой-то.

Вот исходный код на делфе:

procedure ReplaceIATEntryInOneMod(pszCallerModName:Pchar;pfnCurrent:FarProc;pfnNew:FARPROC;hmodCaller:hModule);
var ulSize:ULONG; pImportDesc:PIMAGE_IMPORT_DESCRIPTOR;pszModName:PChar;
  pThunk:PDWORD; ppfn:PFARPROC;ffound:LongBool;written:DWORD;
begin
pImportDesc := ImageDirectoryEntryToData(Pointer(hmodCaller), TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, ulSize);
if pImportDesc = nil then exit;
while pImportDesc.Name<>0 do
begin
 pszModName := PChar(hmodCaller + pImportDesc.Name);
 if (lstrcmpiA(pszModName, pszCallerModName) = 0) then break;
 Inc(pImportDesc);
end;
if (pImportDesc.Name = 0) then exit;
pThunk := PDWORD(hmodCaller + pImportDesc.FirstThunk);
while pThunk^<>0 do
begin
 ppfn := PFARPROC(pThunk);
 fFound := (ppfn^ = pfnCurrent);
 if (fFound) then
  begin
   VirtualProtectEx(GetCurrentProcess,ppfn,4,PAGE_EXECUTE_READWRITE,written);
   WriteProcessMemory(GetCurrentProcess, ppfn, @pfnNew, sizeof(pfnNew), Written);
   exit;
  end;
  Inc(pThunk);
end;
end;

А вот что получилось на асм (компилировал в делфе) :

procedure ReplaceIATEntryInOneMod(pszCallerModName:Pchar;pfnCurrent:FarProc;pfnNew:FARPROC;hmodCaller:hModule);
var     ulSize:ULONG;
       pImportDesc:PIMAGE_IMPORT_DESCRIPTOR;
       pszModName:PChar;
       pThunk:PDWORD;
       ppfn:PFARPROC;
       ffound:LongBool;
       written:DWORD;

begin
asm
push ulSize
push IMAGE_DIRECTORY_ENTRY_IMPORT
push TRUE
push  hmodCaller
call ImageDirectoryEntryToData
mov pImportDesc,eax

//if pImportDesc=nil then Exit;
cmp pImportDesc,0
je @Done

{
while pImportDesc.Name<>0 do
begin
 pszModName := PChar(hmodCaller + pImportDesc.Name);
 if (lstrcmpiA(pszModName, pszCallerModName) = 0) then break;
 Inc(pImportDesc);
end;
}

@Loop:

mov ebx,pImportDesc
add ebx,12
cmp dword ptr [ebx], 0
je @Next1; // if nil then next

mov ebx, hmodCaller
add ebx, dword ptr [pImportDesc]
add ebx, 12                      // .Name
mov  pszModName,eax

push    pszCallerModName
push    pszModName
call    lstrcmpiA
cmp EAX,0
je  @Next1
inc pImportDesc

jmp @loop

@Next1:

//if (pImportDesc.Name = 0) then exit;

mov ebx,pImportDesc
add ebx,12
cmp dword ptr [ebx], 0
je @Done; // if nil then next

//pThunk := PDWORD(hmodCaller + pImportDesc.FirstThunk);
mov ebx,pImportDesc
add ebx,14          //pImportDesc.FirstThunk
add ebx,hmodCaller
mov pThunk,ebx

{while pThunk^<>0 do
begin
 ppfn := PFARPROC(pThunk);
 fFound := (ppfn^ = pfnCurrent);
 if (fFound) then
  begin
   VirtualProtectEx(GetCurrentProcess,ppfn,4,PAGE_EXECUTE_READWRITE,written);
   WriteProcessMemory(GetCurrentProcess, ppfn, @pfnNew, sizeof(pfnNew), Written);
   exit;
  end;
  Inc(pThunk);
end;}

@loop2:
  mov eax,pThunk
  cmp DWORD ptr [eax], 0
  je @done

  push pThunk
  pop ppfn

  mov eax,ppfn
  mov ebx,pfnCurrent

  cmp DWORD ptr [eax], ebx
  jne @loop2end

  call GetCurrentProcess

  push written
  push PAGE_EXECUTE_READWRITE
  push 4
  push ppfn
  push eax
  call VirtualProtectEx

  call GetCurrentProcess

  push Written
  push sizeof [pfnNew]
  push offset pfnNew
  push ppfn
  push eax
  call WriteProcessMemory    //(GetCurrentProcess, ppfn, @pfnNew, , );

  jmp @done

@loop2end:
  inc pThunk

  jmp @loop2;

@done:

end;
end;

Буду признателен всем кто поможет.


 
Kerk ©   (2004-03-14 13:27) [1]

Может хотя бы намекнешь в каком месте ошибка?
А то как-то лениво в этой куче кода разбираться...


 
Gero ©   (2004-03-14 13:37) [2]

> но всеравно глюк какой-то

Delphi не запускается?
Компилятор не работает?
Компьютер не включается?

Или что-то другое?


 
Defunct ©   (2004-03-14 13:38) [3]

> вроде сам перевел но всеравно глюк какой-то

Hint:
В чем заключется глюк? Зацикливание? Пройдитесь по F8 внутри цикла (@loop2-@loop2end). Если длины параметров, передаваемых в функции соответстуют действительным, вы не выскочите за пределы цикла.


 
mixir   (2004-03-14 15:09) [4]

Программы пытается получить доступ к памяти, причем к неверному адресу который определяется в циклах.
Ошибка где-то  в циклах.
Может быть ошибка даже в  этом цикле

while pImportDesc.Name<>0 do
begin
pszModName := PChar(hmodCaller + pImportDesc.Name);
if (lstrcmpiA(pszModName, pszCallerModName) = 0) then break;
Inc(pImportDesc);
end;

потому, что я неособо-то  и умею работать в асме со строками.


 
Defunct ©   (2004-03-14 17:36) [5]

> Программы пытается получить доступ к памяти, причем к неверному адресу который определяется в циклах.

100% ошиблись в передаче параметров.
Какой-то из функций передается больше или меньше параметров чем требуется.

Здесь:
push    pszCallerModName
push    pszModName
call    lstrcmpiA


Я так понял после этого Call"a получаете Access Violation?
Трассируйте процедру (F7), обратите внимание есть ли внутри процедуры команда:
Sub ESP,8
если такой команды нет, значит параметры передаются не через стек.



Страницы: 1 вся ветка

Текущий архив: 2004.04.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.059 c
1-1079340178
pavlov
2004-03-15 11:42
2004.04.04
работа с файлами из под сервиса


7-1074178573
проблематик
2004-01-15 17:56
2004.04.04
ListView


1-1079101765
}|{yk
2004-03-12 17:29
2004.04.04
Хорошо, посылаю я сообщение другому приложению BroadcastSystemMes


3-1078412500
Евген
2004-03-04 18:01
2004.04.04
Проблема с Locate


14-1078976465
Думкин
2004-03-11 06:41
2004.04.04
С днем рождения! 11 марта