فرا سوی ویندوز nt

همان گونه که شاید بدانید ویندوز های xp و vista ویندوز های nt به شمار می روند. در این گونه ویندوز ها برای به کار گیری سرویس های پایه ای سیستم باید دستور های زیر را به کار برد. (این دستور ها دستور های IA-32 هستند و برای ویندوز های 64 بیتی باید از دستور های IA-32e یا IA-64 کمک گرفت) :

mov eax,sevice code 

mov edx,pointer to parameters 

sysenter 

service code در بالا شماره سرویس سیستم می باشد که در هر ویندوز و یا شاید در هر یک از  service pack های یک ویندوز شماره ها شماره هایی ویژه هستند. لیست شماره،نام و پارامترهای این سرویس ها را می توانید از این لینک بگیرید. (من خودم همه این کد هارو آزمایش نکردم. پس اگر می خواهید ویروسی، تروجانی و ... بنویسید پیش از رها سازی اش آن را بیازمایید). 

pointer to parameters آدرس (virtual address یا همان linear address) جای پارامتر های سرویس در RAM است. این پارامتر ها همان پارامتر های سرویس های ntdll.dll هستند که به آنها یک پارامتر که همان آدرس بازگشت به برنامه هست افزوده گشته. 


برای نمونه برای به کار گیری سرویس NtCreateFile که در ntdll.dll این پارامتر ها را دارا می باشد: 

NTSYSAPI
NTSTATUS
NTAPI
NtCreateFile(
	OUT PHANDLE FileHandle,
	IN ACCESS_MASK DesiredAccess,
	IN POBJECT_ATTRIBUTES ObjectAttributes,
	OUT PIO_STATUS_BLOCK IoStatusBlock,
	IN PLARGE_INTEGER AllocationSize OPTIONAL,
	IN ULONG FileAttributes,
	IN ULONG ShareAccess,
	IN ULONG CreateDisposition,
	IN ULONG CreateOptions,
	IN PVOID EaBuffer OPTIONAL,
	IN ULONG EaLength
	); 
در رجیستر edx آدرس یک ساختار 12 واژه ای گذاشته شود که 11 پارامتر نخست آن مانند بالا  است 
و پارامتر پایانی آن همان آدرس بازگشت می باشد. برای سادگی کار می توانید از یک روال کمکی  
کمک بگیرید: 
NtSyscall: 
    mov edx,esp 
    sysenter 
هنگام کار با این روال کافی است پارامتر های سرویس (بدون آدرس بازگشت) را در پشته گذاشته و 
NtSyscall را فراخوانی کنید. 
شاید بپرسید که هنگامی که در kernell32.dll،user32.dll و بسیاری دیگر از dll ها به ویژه خود 
 ntdll.dll در دسترس می باشد چرا باید چنین کاری کرد؟ در پاسخ می توان گفت که اگر برنامه شما 
به kernell32.dll یا ntdll.dll آسیب برساند چگونه می تواند سرویس های آن را به کار گیرد. همچنین 
با این کار نام هیچ سرویسی به برنامه شما افزوده نخواهد گشت چرا که ما به جای نام سرویس ها 
و نام dll ها، تنها شماره سرویس ها را به کار می گیریم و به این روش می توان برخی از نرم افزار ها 
که می خواهند برنامه شما را crack کنند گمراه خواهند شد.