ورود

View Full Version : تبدیل سورس x86 به x64



p3m4ni
پنج شنبه 21 شهریور 1392, 17:57 عصر
سلام
من FASM رو گرفتم ولی OBJ نمیسازه و EXE و FAS درست میکنه .NASM هم ک اصلا انگار فایل اجرایی نداره!
به هر حال سورسم اینه :

;============================================
; FUNC.asm file
;============================================
.486
.model flat, stdcall
option casemap :none
.code
;--------------------------------------------
shift PROC, Arg1:DWORD, Arg2:DWORD, Arg3:DWORD ,Arg4:DWORD,Arg5:DWORD

mov esi,Arg1
mov eax,Arg1
mov eax,[eax]
rcl al,1
mov [esi],al


mov esi,Arg2
mov eax,Arg2
mov eax,[eax]
rcl al,1
mov [esi],al


mov esi,Arg3
mov eax,Arg3
mov eax,[eax]
rcl al,1
mov [esi],al


mov esi,Arg4
mov eax,Arg4
mov eax,[eax]
rcl al,1
mov [esi],al

mov esi,Arg5
mov eax,Arg5
mov eax,[eax]
rcl al,1
mov [esi],al

ret
shift ENDP

;----------------------------------------------
roll PROC, Arg6:DWORD

mov esi,Arg6
mov eax,Arg6
mov eax,[eax]
rol al,4
mov [esi],al

ret
roll ENDP
;----------------------------------------------
;----------------------------------------------
ass PROC, Arg7:DWORD,Arg8:BYTE

mov esi,Arg7
mov eax,Arg7
mov eax,[eax]
mov al,Arg8
mov [esi],al

ret
ass ENDP



;----------------------------------------------
END
;----------------------------------------------

fjm11100
پنج شنبه 21 شهریور 1392, 19:10 عصر
اینو ببین
http://www.nasm.us/doc/nasmdoc8.html (http://www.nasm.us/doc/nasmdoc8.html)
اما چرا از masm استفاده نمیکنی؟

p3m4ni
پنج شنبه 21 شهریور 1392, 20:45 عصر
آماتوریه دیگه...
این دوستمون فقط همین 2تا رو معرفی کرده بود تو تاپیکش منم فکر کردم فقط همین 2تاس...نمیدونم که...
MASM دارم ولی 32 هست...دارم میگردم ولی هنو 64 پیدا نکردم:اشتباه:در ضمن با فایل ML64.EXE هم که تو دات نت هست نمیدونم چه جوری کار کنم...اصلا نمیدونم 64 چه فرقایی با 32 داره..همون 32 رو هم به زور میفهمم:لبخند:

fjm11100
جمعه 22 شهریور 1392, 00:06 صبح
خیلی فرق نداره! بزرگترین فرقشون همون رجیسترهاست که حالا 64 بیتی هم داره که با پیشوند R نامگذاری شده اند(مثلا RAX که 64 بیتی EAX یا AX خدابیامرزه)
8 تا رجیستر عمومی جدید اضافه شده(R8-R15) و 8 تا رجیستر 128 بیتی SSE جدید و تغییراتی در آدرس دهی و چندتا دستور
خب اسمبلی سخته وگرنه گیر از مخ شما نیست خیالت راحت!!!:چشمک:

p3m4ni
جمعه 22 شهریور 1392, 00:49 صبح
حالا مشکل کامپایلر دارم آخه...masm64 اصلا داریم؟
من 32 رو از masm32.com گرفتم خیلی هم خوب بود ولی تو 64 موندم!

p3m4ni
جمعه 22 شهریور 1392, 14:19 عصر
سلام.بالاخره تصمیم گرفتم با همون fasm کار کنم
vC++‎‎:

extern "C" byte __fastcall lshift (byte *,byte *,byte *,byte *,byte *);
اسمبلی:

format MS64 COFF
include 'win32a.inc'
section '.text' code readable executable
proc shift Arg1:DWORD, Arg2:DWORD, Arg3:DWORD ,Arg4:DWORD,Arg5:DWORD
mov esi,Arg1
mov eax,Arg1
mov eax,[eax]
rcl al,1
mov [esi],al
mov esi,Arg2
mov eax,Arg2
mov eax,[eax]
rcl al,1
mov [esi],al
mov esi,Arg3
mov eax,Arg3
mov eax,[eax]
rcl al,1
mov [esi],al
mov esi,Arg4
mov eax,Arg4
mov eax,[eax]
rcl al,1
mov [esi],al
mov esi,Arg5
mov eax,Arg5
mov eax,[eax]
rcl al,1
mov [esi],al
ret
endp

ولی vC++‎‎ ارور میده که:"unresolved external symbol shift"

هم اکنون نیازمند یاری اسمبلیتان هستیم:خجالت:

p3m4ni
جمعه 22 شهریور 1392, 23:06 عصر
سلام.
فهمیدم که باید اینو اضاف کنم تا vC++‎ تابع رو بشناسه:
public shift
ولی بعد از اون به تمام آرگومان ها ارور "invalid value " میده و وقتی تمام انتصاب ها رو بر میدارم هم کامپایل میشه هم vC++‎ توابع رو میشناسه.یعنی اینجوری:


format MS64 COFF
include 'win64a.inc'
public shift
section '.text' code readable executable
proc shift Arg1:DWORD, Arg2:DWORD, Arg3:DWORD ,Arg4:DWORD,Arg5:DWORD
;mov esi,Arg1
;mov eax,[eax]
rcl al,1
mov [esi],al
;mov eax,Arg2
;mov eax,[eax]
rcl al,1
mov [esi],al
;mov esi,Arg3
;mov eax,Arg3
mov eax,[eax]
rcl al,1
mov [esi],al
;mov esi,Arg4
;mov eax,Arg4
mov eax,[eax]
rcl al,1
mov [esi],al
;mov esi,Arg5
;mov eax,Arg5
mov eax,[eax]
rcl al,1
mov [esi],al
ret
endp

fjm11100
شنبه 23 شهریور 1392, 15:46 عصر
بسیار عالی موفق باشی

p3m4ni
یک شنبه 24 شهریور 1392, 02:22 صبح
32 بیت رو جواب گرفتم کامل که با masm32 هم گرفته بودم مشکل64 بیت بود ک اودم سراغ fasm
خوب وضعیت اینه:vc++ با obj های fasm کامپایل میشه توابع رو هم میشناسه ولی اجرا که میکنم این ارورو میده:violation reading location 0x000000003f761788
و وقتی break میکنم و show assembly رو میزنم به این خط اشاره میکنه:
000000013FC4106B mov eax,dword ptr [eax]

راستی اینم سورس اسمبلی:format MS64 COFF
include 'C:\fasmw17003\INCLUDE\win64a.inc'

public shift

section '.text' code readable executable
proc shift Arg1:DWORD, Arg2:DWORD, Arg3:DWORD ,Arg4:DWORD,Arg5:DWORD
mov esi,[Arg1]
mov eax,[Arg1]
mov eax,[eax]
rcl al,1
mov [esi],al
mov esi,[Arg2]
mov eax,[Arg2]
mov eax,[eax]
rcl al,1
mov [esi],al
mov esi,[Arg3]
mov eax,[Arg3]
mov eax,[eax]
rcl al,1
mov [esi],al
mov esi,[Arg4]
mov eax,[Arg4]
mov eax,[eax]
rcl al,1
mov [esi],al
mov esi,[Arg5]
mov eax,[Arg5]
mov eax,[eax]
rcl al,1
mov [esi],al
ret
endp

p3m4ni
یک شنبه 24 شهریور 1392, 03:26 صبح
دقیقا مشکلش این سطرهایی هست که کامنتشون کردم:mov esi,[Arg1]
mov eax,[Arg1]
;mov eax,[eax]
rcl al,1
;mov [esi],al
mov esi,[Arg2]
mov eax,[Arg2]
;mov eax,[eax]
rcl al,1
;mov [esi],al
mov esi,[Arg3]
mov eax,[Arg3]
;mov eax,[eax]
rcl al,1
;mov [esi],al
mov esi,[Arg4]
mov eax,[Arg4]
;mov eax,[eax]
rcl al,1
;mov [esi],al
mov esi,[Arg5]
mov eax,[Arg5]
;mov eax,[eax]
rcl al,1
;mov [esi],al

با این شرایط بدون ارور اجرا میشه ولی دیگه ماهیت منطقیشو از دست داده.حالا چرا به dereferencing و انتصاب مقدار به محتوای آدرس که call by reference رو برامون فراهم میکنه گیر میده رو نمیدونم...اصلا مگه 32 و 64 تو این موارد با هم تفاوتی دارن؟؟
خیلی عقبم تورو خدا یکی پلیز هلپ میییییییییییییییی:ناراحت:

p3m4ni
یک شنبه 24 شهریور 1392, 14:12 عصر
من آماتور میگم باگه حالا اونایی که تو تاپیک شمارنده 64 بیتی داشتن همدیگرو میزدن بیان راهنمایی کنن...والا...

p3m4ni
چهارشنبه 27 شهریور 1392, 16:08 عصر
نتیجه اخلاقی این تاپیک:
"تو64 همه رو یا assembly بنویس یا c++"

xman_1365_x
پنج شنبه 04 مهر 1392, 17:54 عصر
قبل از هرچیز، دوست عزیز بعد از پرسش سوال از دادن پست های فاقد محتوی جلوگیری کنید(طبق قوانین سایت)
اول مثالی از dereference it برات مینویسم که واضح هست

int _tmain(int argc, _TCHAR* argv[])
{
int old=1;
int *p;
p=&old;
int _new=0;
__asm
{
mov eax,p ; copy address into eax
mov eax,[eax] ; dereference it
mov _new,eax ; copy eax into new variable
}
return 0;
}


خوب حالا مشکل شما اینه اومدین فایل اجرایی و آبجکت 64بیتی تولید کردید اما برای dereference it از ثبات های 32بیتی استفاده کردید،با این کار شما اومدین نیمی از آدرس رو خوندید و وقتی میخواین dereference it رو انجام بدین چون داره به سگمنتی خارج از برنامه اشاره میکنه،ویندوز بهتون اجازه خوندن اون آدرس رو نمیده و پیام خطا دریافت کردید.
موفق باشید.