Форум: "Основная";
Текущий архив: 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