السلام عليكم ورحمة الله وبركاته .
منذ مدة كنت أتسائل كيف يعمل برنامج الـAutochk الذي يعمل مع الـStartup في الويندوز (برنامج فحص الملفات من الأخطاء) , المهم أني قمت بتحليل على السريع له فوجدت انه (Native Exe) وليس مرتبط إلا بالمكتبة ntdll.dll والتي تقريبا كل الدوال بها undocumented !!
بعد قليل من البحث في جوجل تأكدت مما سبق , لكن لاحظت أن كل الأمثلة تتحدث بأنه يجب صنع Native Exe عن طريق الـDDK , في الحقيقة يمكن فعل ذلك من مترجم الـVC++ 2005 العادي مع ضبط خيارات الـcompiler & linker بطريقة صحيحة + دمج مكتبة ntdll.lib وسوف أسوق مثال عملي إن شاء الله مع السورس كود .
أولا يجب أن نقوم بضبط الـCompiler و الـLinker كالآتي (VC++ 2005) :
Compiler:
int
printf(
[color=" blue"]char *format ,
...
)
{
UNICODE_STRING umsg;
ANSI_STRING amsg;
[color=" blue"]char buf[MAX_OUTPUT_LENGTH];
va_list args = va_start(format);
[color=" blue"]int szbuf;
szbuf = _vsnprintf(buf, MAX_OUTPUT_LENGTH, format, args);
RtlInitAnsiString(&amsg, buf);
[color=" blue"]if (0 == RtlAnsiStringToUnicodeString(&umsg, &amsg, [color=" blue"]true))
{
NtDisplayString(&umsg);
RtlFreeUnicodeString(&umsg);
}
[color=" blue"]return szbuf;
}قمنا أيضا بعمل دالتين بسيطتين لحجز كتل من الذاكرة عن طريق RtlAllocateHeap & RtlFreeHeap :
HANDLE
__declspec([color=" blue"]naked)
GetHeapProcess(
VOID
)
{
[color=" blue"]__asm mov eax,dword ptr fs:[0x18];
[color=" blue"]__asm mov eax,dword ptr [eax+0x30];
[color=" blue"]__asm mov eax,dword ptr [eax+0x18];
[color=" blue"]__asm ret;
}PVOID
mem_alloc(
size_t cb
)
{
[color=" blue"]return RtlAllocateHeap(GetHeapProcess(), HEAP_NO_SERIALIZE|HEAP_ZERO_MEMORY, cb);
}BOOLEAN
mem_free(
PVOID ptr
)
{
[color=" blue"]return RtlFreeHeap(GetHeapProcess(), HEAP_NO_SERIALIZE, ptr);
}في الدالة GetHeapProcess أولا نضع eax=fs:[0x18] وهو مؤشر الى الـTEB للثريد الحالي ثم eax=[eax+0x30] وهو يشير الى ProcessEnvironmentBlock وهو مؤشر الى الـPEB للعملية الحالية , بعد ذلك eax=[eax+0x18] و هو يشير الى ProcessHeap و هو عنوان مقبض أول heap قام النظام بإنشاؤه للعملية الحالية .
قمنا أيضا بعمل دالة تحاكي عمل Sleep وذلك عن طريق تغليف NtDelayExecution مع ملاحظة ان Sleep تأخذ الزمن بالـMilli أما NtDelayExecution فتأخذ الزمن بالـnano/100 أي 10^7 كما انه يجب وضع القيمة بالسالب للعلامة على بدأ العد من لحظة الآن :
VOID
Freeze(
DWORD dwMilliseconds
)
{
LARGE_INTEGER larg_int;
larg_int.QuadPart = -((LONGLONG)dwMilliseconds*10*1000);
NtDelayExecution([color=" blue"]false, (PLARGE_INTEGER)&larg_int);
}باقي السورس لا يحتاج تفصيل وواضح جدا ...
--------------------------------
لجعل البرنامج يعمل في Startup يجب اضافة اسمه في مفتاح الرجستري هذا :
HKLM\System\CurrentControlSet\Control\Session Manager\BootExecute
ثم تقوم بوضع البرنامج في WINDOWS\System32\
البرنــــــــــامج النهـــــائي :
http://img258.imageshack.us/img258/5714/bootec8.swf
GamingMasteR –AT4RE
