Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.041 c
1-1079385695
Ignoramus
2004-03-16 00:21
2004.04.04
Просмотр прикрепленніх файлов


1-1079640601
Ignoramus
2004-03-18 23:10
2004.04.04
Проблема с MDI окнами


1-1079369751
Layner
2004-03-15 19:55
2004.04.04
Возможно ли в приложении скрыть / показать MainMenu?


1-1079330022
senator
2004-03-15 08:53
2004.04.04
Работа с DLL


14-1079064002
тихий вовочка
2004-03-12 07:00
2004.04.04
перевод VCL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский