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

 eXeL@B —› Программирование —› ASM вставки в Delphi
Посл.ответ Сообщение

Ранг: 221.3 (наставник), 135thx
Активность: 0.190.07
Статус: Участник

Создано: 23 марта 2007 22:17
· Личное сообщение · #1

Такой код:
asm
push 0
push 0
push 10003000h
push 0
push 10003004h
push 0
push 0
push 0
call GetVolumeInformationA
mov eax,10003000h
mov ebx,10003004h
mov eax,dword ptr ds:[eax]
mov ebx,dword ptr ds:[ebx]
xor eax,21350921h
rol eax,3
xor eax,ebx
ror ebx,3
mov [res],eax
end;
edit1.Text:=IntToHex(res,8);

Ошибка вываливается в mov eax,dword ptr ds:[eax], под оллей пишет такое:
ds:[10003000]=???
eax=10003000
Хотя в рабочей dll выдает:
ds:[10003000]=000700FF
eax=10003000

А если заменить mov eax,dword ptr ds:[eax] на mov eax,000700FFh, то все нормально, но вскакивает ошибка здесь edit1.Text:=IntToHex(res,8);.

Кто знает в чем ошибка, подскажите.

-----
xchg dword [eax], eax





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 23 марта 2007 22:24 · Поправил: s0larian
· Личное сообщение · #2

бегом на http_://msdn.microsoft.com


BOOL GetVolumeInformation(
LPCTSTR lpRootPathName,
LPTSTR lpVolumeNameBuffer,
DWORD nVolumeNameSize,
LPDWORD lpVolumeSerialNumber,
LPDWORD lpMaximumComponentLength,
LPDWORD lpFileSystemFlags,
LPTSTR lpFileSystemNameBuffer,
DWORD nFileSystemNameSize
);


Аргументы которые ты посылаешь - кривые. Например - самый последний push должен содержать указатель на lpRootPathName:


[in] A pointer to a string that contains the root directory of the volume to be described.
If this parameter is NULL, the root of the current directory is used. A trailing backslash is required. For example, you would specify \\MyServer\MyShare as \\MyServer\MyShare\, or the C drive as "C:\".





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

Создано: 23 марта 2007 22:45
· Личное сообщение · #3

v0id2k пишет:
А если заменить mov eax,dword ptr ds:[eax] на mov eax,000700FFh, то все нормально, но вскакивает ошибка здесь edit1.Text:=IntToHex(res,8);.


Нужно явно указать предка TEdit, т.к возможно при вызове твоего ASM кода Handle TEditBox затирается, и поэтому возкикает ошибка доступа к памяти.

напиши так:
Form1.edit1.Text := IntToHex( res, 8 ) и все отработает нормально.



Ранг: 221.3 (наставник), 135thx
Активность: 0.190.07
Статус: Участник

Создано: 23 марта 2007 22:53
· Личное сообщение · #4

ShEriF
Спасибо за совет, работает!

s0larian
При передаче в последний push 00450458h(это 'c:'), та же фигня:
ds:[10003000]=???
eax=10003000

-----
xchg dword [eax], eax





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

Создано: 23 марта 2007 23:27
· Личное сообщение · #5

v0id2k пишет:
ds:[10003000]=???
eax=10003000


от куда такие адресса? перевадай переменные блин!
асм код, бери в рамки pushad/popad ты же как вставку юзаешь, зачем усложнять себе жизнь?
да и вообще можно было АПИ заюзать!

Function GetHDDInfo(Disk : Char;Var VolumeName, FileSystemName : String;
Var VolumeSerialNo, MaxComponentLength, FileSystemFlags:LongWord) : Boolean;

implementation

function GetDisks(TypeOfDisk : Word) : String;{Получить имена нужных дисков}
var
DriveArray : array[1..26] of Char;
I : integer;
begin
DriveArray:='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
for I := 1 to 26 do
if GetDriveType(PChar(DriveArray[I]+':')) = TypeOfDisk then
Result := Result+DriveArray[I];
end;
Function GetHDDInfo(Disk : Char;Var VolumeName, FileSystemName : String;
Var VolumeSerialNo, MaxComponentLength, FileSystemFlags:LongWord) : Boolean;
Var
_VolumeName,_FileSystemName:array [0..MAX_PATH-1] of Char;
_VolumeSerialNo,_MaxComponentLength,_FileSystemFlags:LongWord;
Begin
if GetVolumeInformation(PChar(Disk+':'),_VolumeName,MAX_PATH,@_VolumeSeri alNo,
_MaxComponentLength,_FileSystemFlags,_FileSystemName,MAX_PATH) then
Begin
VolumeName:=_VolumeName;
VolumeSerialNo:=_VolumeSerialNo;
MaxComponentLength:=_MaxComponentLength;
FileSystemFlags:=_FileSystemFlags;
FileSystemName:=_FileSystemName;
Result:=True;
End else Result:=False;
End;
end.


-----
[nice coder and reverser]





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 23 марта 2007 23:28 · Поправил: s0larian
· Личное сообщение · #6

v0id2k, четвёртый push с конца это lpVolumeSerialNumber - туда нужно тоже указатель. Напиши сначала на делфи, уюедись что всё работает, а потом не же аргументы на асме.



Ранг: 221.3 (наставник), 135thx
Активность: 0.190.07
Статус: Участник

Создано: 23 марта 2007 23:48 · Поправил: v0id2k
· Личное сообщение · #7

Hellspawn

Эти адреса из Olly.
Просто получить ID диска С в этом нет проблем, как видишь в АСМ вставке присутствует это:
mov eax,10003000h
mov ebx,10003004h
mov eax,dword ptr ds:[eax]
mov ebx,dword ptr ds:[ebx]
xor eax,21350921h
rol eax,3
xor eax,ebx
ror ebx,3

Как организовать xor средствами Делфи я конечно знаю, но rol и ror понятия не имею.
Если сохранять регистры(pushad/popad), прога с тем же ексепшеном вылетает(mov eax,dword ptr ds:[eax])

s0larian

На Делфи набросал:
function GetNum: string;
var
VolumeSerialNo : DWord;
MaxComponentLength,FileSystemFlags:cardinal;
begin
VolumeSerialNo:=10003004;
FileSystemFlags:=10003000;
GetVolumeInformation('c:',0,0,@VolumeSerialNo,MaxComponentLength,FileS ystemFlags,0,0);
result:=copy(inttohex(VolumeSerialNo,8),1,4);
end;

Функция работает, как я понял в АСМ вставке у меня последний параметр тупит, это параметр lpRootPathName. Хоть циры верные вставляю все равно не пашет(push 00450458h(это 'c:')).

-----
xchg dword [eax], eax





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 24 марта 2007 00:02
· Личное сообщение · #8

v0id2k, у тебя почти все аргументы не верны. На асме надо делать push указателя (адреса) для пути и всего остального. То есть, путь это строка - сделай push её адреса; lpVolumeSerialNumber это int32 - выдели на стеке и пошли его адрес; buffer - выдели на где угодно и пошли адрес и размер.



Ранг: 221.3 (наставник), 135thx
Активность: 0.190.07
Статус: Участник

Создано: 24 марта 2007 01:22
· Личное сообщение · #9

s0larian

Я понял, дело не в передаваемых параметрах.
mov eax,10003000h <- косяк здесь
mov ebx,10003004h <- и здесь
mov eax,dword ptr ds:[eax]
mov ebx,dword ptr ds:[ebx]
Заранее в регистры EAX и EBX мы помещаем адреса, а командой mov eax,dword ptr ds:[eax]
мы пытаемся в регистр EAX поместить DWORD по адресу [eax], т.е. по адресу 10003000h, а
у меня в файле нет такого адреса, вот он и ругается, придестя по другому переписывать.
Спасибо всем за ответы!

-----
xchg dword [eax], eax




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

Создано: 24 марта 2007 09:29
· Личное сообщение · #10

На пробуй
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
s1,s2,s3 : Pchar;
c1,c2 : DWord;
ser : Cardinal;
res:integer;

implementation

{$R *.dfm}
procedure GetHDDSerial (Drive : string);
begin
getmem (s1,20);
getmem (s2,20);
getmem (s3,20);
ser := 0;
s1 := Pchar(Drive);
GetVolumeInformationA (s1,s2,255,@ser,c1,c2,s3,255);
//result := Ser;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
GetHDDSerial('D:');
asm
pusha
mov eax,[ser]
mov ebx,[c2]
xor eax,21350921h
rol eax,3
xor eax,ebx
ror ebx,3
mov [res],eax
popa
end;
Form1.Edit1.Text:=inttohex(res,8);
end;

end.




Ранг: 221.3 (наставник), 135thx
Активность: 0.190.07
Статус: Участник

Создано: 24 марта 2007 16:45
· Личное сообщение · #11

Veliant

Спасибо.
Но я уже нашел ошибку:
v0id2k пишет:
Заранее в регистры EAX и EBX мы помещаем адреса, а командой mov eax,dword ptr ds:[eax] мы пытаемся в регистр EAX поместить DWORD по адресу [eax], т.е. по адресу 10003000h, а у меня в файле нет такого адреса, вот он и ругается


-----
xchg dword [eax], eax




Ранг: 221.3 (наставник), 135thx
Активность: 0.190.07
Статус: Участник

Создано: 24 марта 2007 16:48
· Личное сообщение · #12

Тему можно закрывать, спасибо за ответы.
Кста, кому интересно, я дизассемблил HardLock.dll из RLProtector v0.7.4 beta, хотел на Delphi переписать.

-----
xchg dword [eax], eax



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