ورود

View Full Version : سوال: API Call In FASM



IamOverlord
یک شنبه 26 تیر 1390, 16:44 عصر
سلام دوستان،
چه طور می شود در Flat Assembler توابع API را Call کرد ؟

xman_1365_x
دوشنبه 27 تیر 1390, 00:52 صبح
دو راه استفاده 1-مستقيم 2-غير مستقيم
1-


format PE GUI 4.0

include 'win32a.inc'

; no section defined - fasm will automatically create .flat section for both
; code and data, and set entry point at the beginning of this section

invoke MessageBoxA,0,_message,_caption,MB_ICONQUESTION+MB _YESNO
invoke ExitProcess,0

_message db 'Do you need additional place for the beer?',0
_caption db 'Desktop configuration',0

; import data in the same section
data import

library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL',\
winmm,'WINMM.DLL'

import kernel32,\
ExitProcess,'ExitProcess'

import user32,\
MessageBoxA,'MessageBoxA'
end data


2-


include 'win32ax.inc' ; you can simply switch between win32ax, win32wx, win64ax and win64wx here
.code
start:
invoke MessageBox,HWND_DESKTOP,"Hi! I'm the example program!","Hello",invoke GetCommandLine,MB_OK
invoke ExitProcess,0
.end start

براي اطلاعات بيشتر به سايت فلت اسمبلر (http://flatassembler.net/) مراجعه كنيد.
موفق باشي

IamOverlord
دوشنبه 27 تیر 1390, 02:56 صبح
ولی من خیلی دوست دارم بدونم که قضیه ی استفاده از توابع API بدون هیچ include ای چیه؟
مثلا این برنامه که با FASM نوشته شده بدون هیچ include ای و فقط با استفاده از توابع API می تونه IP Address خودمون رو در شبکه ی اینترنت در بیاره :

;-------------------
;--By Cyb3r5h4d0w --
;-------------------

format PE GUI
entry start

section '' import data readable writeable

dd 0,0,0, rva _kernel32 ,rva kernel32_func
dd 0,0,0, rva _wininet ,rva wininet_func
dd 0,0,0, rva _user32 ,rva user32_func
dd 0,0,0,0,0


kernel32_func:
ExitProcess dd RVA _ExitProcess-2
dd 0

wininet_func:
InternetOpen dd RVA _InternetOpen-2
InternetReadFile dd RVA _InternetReadFile-2
InternetOpenUrl dd RVA _InternetOpenUrl-2
InternetCloseHandle dd RVA _InternetCloseHandle-2
dd 0

user32_func:
MessageBox dd RVA _MessageBox-2
dd 0

start:
push 0 0 0 0 szAgent
call [InternetOpen]
;invoke InternetOpen,szAgent,0,0,0,0
test eax,eax
jz exi
mov [InternetHandle],eax

push 0 0 0 0 szURL eax
call [InternetOpenUrl]
;invoke InternetOpenUrl,eax,szURL,0,0,0,0
test eax,eax
jz exi
mov [FileHandle],eax
push BytesRead fbs FileBuffer eax
call [InternetReadFile]
;invoke InternetReadFile,eax,FileBuffer,fbs,BytesRead
test eax,eax
jz exi
mov eax,[BytesRead]

push 0 ti FileBuffer 0
call [MessageBox]
;invoke MessageBox,0,FileBuffer,ti,0

exi:
push FileHandle
call [InternetCloseHandle]
;invoke InternetCloseHandle,[FileHandle]
push InternetHandle
call [InternetCloseHandle]
;invoke InternetCloseHandle,[InternetHandle]
push 0
call [ExitProcess]
;invoke ExitProcess,0

_kernel32 db 'KERNEL32.DLL',0
_GetModuleHandle db 'GetModuleHandleA',0
_ExitProcess db 'ExitProcess',0

_user32 db 'USER32.DLL',0
_MessageBox db 'MessageBoxA',0

_wininet db 'WININET.DLL',0
_InternetOpen db 'InternetOpenA',0
_InternetReadFile db 'InternetReadFile',0
_InternetOpenUrl db 'InternetOpenUrlA',0
_InternetCloseHandle db 'InternetCloseHandle',0

szAgent db 'btu#123456',0
szURL db 'http://www.whatismyip.org/',0
;szURL db 'http://www.your-host.net/update.php',0
ti db 'Cyb3r5h4d0w',0

InternetHandle dd ?
FileHandle dd ?
BytesRead dd ?
FileBuffer rb 2048
fbs = $-FileBuffer

xman_1365_x
دوشنبه 27 تیر 1390, 05:35 صبح
ولی من خیلی دوست دارم بدونم که قضیه ی استفاده از توابع API بدون هیچ include ای چیه؟
مثلا این برنامه که با FASM نوشته شده بدون هیچ include ای و فقط با استفاده از توابع API می تونه IP Address خودمون رو در شبکه ی اینترنت در بیاره :

خوب اين برنامه اومده همه تعاريف و ايمپورت هاي مورد نياز رو در دو قسمت داخل برنامه انجام داده (همون تعاريفي كه در فايل هاي inc قرار داره)
پس ديگه نيازي به وارد كردن فايلي نيست،يه نگاهي به درون فايل هاي inc بندازين متوجه ميشين
موفق باشي

IamOverlord
دوشنبه 27 تیر 1390, 15:43 عصر
خوب توابع API رو هم می شه با Assembly نوشت به جای فراخوانی اون ها از DLL ها ؟

xman_1365_x
دوشنبه 27 تیر 1390, 20:12 عصر
سیستم عامل عمدا اجازه دسترسی به این توابع سیستمی رو داده که جلوی ارتباط مستقیم با سخت افزار رو از کاربر بگیره مثلا نزاره خیلی از وقفه ها یا پورت هارو دسترسی داشته باشین(برای پایداری سیستم عامل) البته این بدلیل رینگ کاری کاربر هست که میشه با نوشتن یک درایور واسط خیلی از وقفه ها و پورت هارو دسترسی داشته باشیم


Ring (computer security) (https://secure.wikimedia.org/wikipedia/en/wiki/Ring_%28computer_security%29)

xman_1365_x
دوشنبه 27 تیر 1390, 20:35 عصر
راستی در ارتباط با برنامه ای که توابع api رو بدون ایمپورت کردن کردن در برنامه اصلی انجام داده بود در برنامه های بزرگ این کار باعث شلوغی برنامه میشه و خوانایی رو میگیره برای همین توابع در فایل های جدا گانه دسته بندی شده و نیاز به تعریف مجدد نداره و هنگام ایمپورت به فایل اضافه میشه ، در همین ارتباط اینم اضافه کنم وقتی شما ایمپورت میکنید به لینکر میگین توابعی که ایمپورت شده در کدوم فایل های DLL هست و چطور پارامتر رو بهش ارسال میکنید و اینجاست که فرقی نداره شما ایمپورت کردین یا داخل برنامه توابع رو معرفی کردید
موفق باشی