PDA

View Full Version : سوال: تغيير رشته دلفي با كد اسمبلي



zidane
چهارشنبه 28 اردیبهشت 1390, 11:43 صبح
با سلام
چطور مي تونم داخل بلوك asm كدي رو بنويسم (به زبان اسمبلي) كه كار كد كامنت شده رو برام انجام بده؟
var
s:string;
begin
s:='AA';
asm
//s[2]:='B';
end;
ShowMessage(s);
end;

یوسف زالی
پنج شنبه 29 اردیبهشت 1390, 15:33 عصر
سلام.
بالاخره انجامش دادم!



procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
begin
s := '----------';
asm
lea eax, s
call system.@UniqueStringA
mov byte ptr [eax+$01], 'X'
end;
ShowMessage(s);
end;



من فکر می کنم که دستور call system.@UniqueStringA باعث دسترسی مستقیم به محتوای آدرس متغیرها میشه.
این دستور رو هم تو System Unit می تونید پیدا کنید.
بدون اون دستور من به هیچ عنوان نتونستم از پس AV بر بیام.
دوستان اگه نظری دارن Share کنن .

tdkhakpur
پنج شنبه 29 اردیبهشت 1390, 17:14 عصر
اسمبلی فقط ادرس داده رو قبول میکنه که باید بهش پاس بدید.


procedure TForm1.Button1Click(Sender: TObject);
var
p : pchar;
s1: string;
begin
s1 := '----------';
p := @s1[1];
asm
mov ebx, p
mov byte ptr [ebx+2], 'X'
end;
ShowMessage(s1);
end;

یوسف زالی
پنج شنبه 29 اردیبهشت 1390, 22:26 عصر
میشه بگی call system.@UniqueStringA چکار میکنه؟
راستی مگه LEA آدرس متغیر نیست؟
پس چرا بدون گذاشتن اون ارجاع AV میگیرم؟

tdkhakpur
جمعه 30 اردیبهشت 1390, 00:00 صبح
میشه بگی call system.@UniqueStringA چکار میکنه؟

وقتی شما ادرس لوکال s1 رو داخل ax قرار میدی متد فوق از این پرامتر یعنی محتوای ax استفاده میکنه و سوای از اینکه چه کاری انجام میده آدرس اصلی رو بصورتی که ارسال شد برگشت میده.


راستی مگه LEA آدرس متغیر نیست؟

برای string و متغییرهایی که پویا هستن و میتونن هر مقداری به هنگام runtime بگیرن جواب نمیده چون هنوز این فضا رزرو نشده.


var
s : array[0..30] of byte;
begin
strcopy(pchar(@s), pchar('------------'));
asm
lea ebx, s
mov byte ptr [ebx+2], 'X'
end;
ShowMessage(pchar(@s));
end;

zidane
شنبه 31 اردیبهشت 1390, 09:37 صبح
جواب هاي tdkhakpur خيلي جالب بودن
من سعي مي كردم كدي شبيه پست 3 با pointer بنويسم كه متاسفانه همش به پيغام av مي خوردم