Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+3 невидимых)

 eXeL@B —› Программирование —› Несложный вопрос по Delphi
Посл.ответ Сообщение

Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 13 мая 2008 15:31
· Личное сообщение · #1

Короче, эта функция должна работать на Delphi.
Подскажите пожалуйста где ошибка и как её можно исправить.
Заранее спасибо.

Собственно сам код:

//Функция ловит бряку на железяке.
function AHBPX: LongBool; stdcall;
var
OrgEbp: string;
OrgEsp: string;
SaveEip: string;
Title: string;
Text: string;
begin
Result := False;
OrgEbp:= 'dd ?';
OrgEsp:= 'dd ?';
SaveEip:= 'dd ?';
Title:= 'Hmmmm....';
Text:= 'Hook detected!';
asm
MOV EAX, offset @Exit
MOV DWORD PTR[OrgEbp],EAX
MOV DWORD PTR[SaveEip],EBP
PUSH offset @DetectHardwareBPX
PUSH FS:[0]
MOV DWORD PTR[OrgEsp],ESP
MOV FS:[0], ESP
XOR EAX,EAX
XCHG DWORD PTR DS:[EAX],EAX
@Exit:
POP FS:[0]
ADD ESP,4
PUSH 0
CALL ExitProcess
@DetectHardwareBPX:
PUSH EBP
MOV EBP,ESP
MOV EAX,DWORD PTR SS:[EBP+10h]
MOV EBX,DWORD PTR[OrgEbp]
MOV DWORD PTR DS:[EAX+0B8h],EBX
MOV EBX,DWORD PTR[OrgEsp]
MOV DWORD PTR DS:[EAX+0C4h],EBX
MOV EBX,DWORD PTR[SaveEip]
MOV DWORD PTR DS:[EAX+0B4h],EBX
CMP DWORD PTR DS:[EAX+4h],0
JNE @hardware_bpx_found
CMP DWORD PTR DS:[EAX+8h],0
JNE @hardware_bpx_found
CMP DWORD PTR DS:[EAX+0Ch],0
JNE @hardware_bpx_found
CMP DWORD PTR DS:[EAX+10h],0
JNE @hardware_bpx_found
JMP @quit
@hbpx_exit:
MOV EAX,0
LEAVE
RET
@hardware_bpx_found:
PUSH 30h
PUSH Title
PUSH Text
PUSH 0
CALL MessageBoxA
JMP @hbpx_exit
@quit: // Тут должна возврощаться в программу, но невозвращается.
end;
end;




Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 13 мая 2008 21:43
· Личное сообщение · #2

MasterSoft пишет:
@quit: // Тут должна возврощаться в программу, но невозвращается.

А ты после @quit: не забыл поставить ret?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 14 мая 2008 06:00 · Поправил: PE_Kill
· Личное сообщение · #3

MasterSoft пишет:
MOV EAX, offset @Exit
MOV DWORD PTR[OrgEbp],EAX
MOV DWORD PTR[SaveEip],EBP

Это как так?

Жесть
MasterSoft пишет:
JMP @quit


Т.е. прямо из обработчика исключения идем дальше работать?

-----
Yann Tiersen best and do not fuck




Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 14 мая 2008 13:19
· Личное сообщение · #4

Так как мне отпустить обработчик исключений?



Ранг: 63.8 (постоянный), 2thx
Активность: 0.030
Статус: Участник

Создано: 14 мая 2008 15:17 · Поправил: drin
· Личное сообщение · #5

я может чего не допонимаю, но зачем OrgEbp, OrgEsp, SaveEip строки? вы вообще в курсе куда вас приведет DWORD PTR[OrgEsp] ?

этот код случайно не с Си портирован?



Ранг: 51.7 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 14 мая 2008 17:12
· Личное сообщение · #6

PUSH FS:[0]
А делфи разве разрешает менять сегментные регистры?



Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 17 мая 2008 14:13
· Личное сообщение · #7

Спасибо всем за ответы.
Тему можно закрывать




Ранг: 748.2 (! !), 390thx
Активность: 0.370
Статус: Участник
bytecode!

Создано: 17 мая 2008 20:58
· Личное сообщение · #8

MasterSoft
Дык закрой сам (внизу кнопка такая есть).

-----
Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску.





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 17 мая 2008 22:22 · Поправил: Hellspawn
· Личное сообщение · #9

procedure ExceptionDrx;
begin
asm
MOV EAX,DWORD PTR SS:[EBP+$10]
CMP DWORD PTR DS:[EAX+$4],0
JNZ @DETECT
CMP DWORD PTR DS:[EAX+$8],0
JNZ @DETECT
CMP DWORD PTR DS:[EAX+$C],0
JNZ @DETECT
CMP DWORD PTR DS:[EAX+$10],0
JNZ @DETECT
JMP @END
@DETECT:
MOV EBX,[EAX+$4]
MOV drx0,EBX
MOV EBX,[EAX+$8]
MOV drx1,EBX
MOV EBX,[EAX+$C]
MOV drx2,EBX
MOV EBX,[EAX+$10]
MOV drx3,EBX
@END:
MOV EAX,DWORD PTR SS:[EBP+$10]
ADD DWORD PTR DS:[EAX+$B8],2
MOV EAX,0
end
...
procedure DetectDrx();
asm
PUSH Offset ExceptionDrx
PUSH DWORD PTR FS:[0]
MOV DWORD PTR FS:[0],ESP
xor eax,eax
idiv eax
POP DWORD PTR FS:[0]
ADD ESP,4
end;
end;


-----
[nice coder and reverser]





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 17 мая 2008 23:08
· Личное сообщение · #10

GlOFF пишет:
А делфи разве разрешает менять сегментные регистры?

В делфи это еще проще сделать, чем например в masm32, где по умолчанию, нельзя использовать регистр fs и gs, так как модель .flat запрещает адресацию с их использованием. Поэтому надо отвязывать соответствующие регистры через: assume fs:nothing.

-----
Yann Tiersen best and do not fuck



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