مشكلة : عند عملية حقن DLL في Process !
#1
السلام عليكم ورحمة الله وبركاتة

لدي مشكلة في عملية الحقن ... عندما احقن DLL في عملية تعمل بالذاكرة

الحالة ... :
كنت اعمل على XP ... وكنت استعمل دالة الحقن(InjectDLL كتبتها بالاسفل) وكان كل شيء سليم Smile
لكن بعد إنتقالي لـ Win7 ... قمت بتجربة الدالة وعند الحقن يصبح البرنامج الحاقن والعملية المحقونة
كلاهم في حالة عدم إستجابة ... بعد ان قمت بتنقيح البرنامج الحاقن وجدته يتوقف على دالة من دوال API
وهي الدالة WaitForSingleObject وبعد ان بحثت بمشاكل هذه الدالة وجدت
صفحة من صفحات microsoft والتي اشارات إلى نفس الخطاء الذي واجهني ... وذكرت السبب وذكرت كذلك الحل ... حيث كان بإستعمال الدالة
الاخرى MsgWaitForMultipleObjects ...

الدالة :
PHP كود :
function InjectDLL(dwPID: DWORD; DLLPath: PWideChar): integer;
var
  
dwThreadID: Cardinal;
  
hProc, hThread, hKernel: THandle;
  
BytesToWrite, BytesWritten: SIZE_T;
  
pRemoteBuffer, pLoadLibrary: Pointer;
begin
  hProc 
:= OpenProcess(PROCESS_CREATE_THREAD or PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_VM_READ, False, dwPID);
  if 
hProc = 0 then
    
exit(0);
  try
    
BytesToWrite := SizeOf(WideChar)*(Length(DLLPath) + 1);
    
pRemoteBuffer := VirtualAllocEx(hProc, nil, BytesToWrite, MEM_COMMIT, PAGE_READWRITE);
    if 
pRemoteBuffer = nil then
      
exit(0);
    try
      if 
not WriteProcessMemory(hProc, pRemoteBuffer, DLLPath, BytesToWrite, BytesWritten) then
        
exit(0);
      
hKernel := GetModuleHandle('kernel32.dll');
      
pLoadLibrary := GetProcAddress(hKernel, 'LoadLibraryW');
      
hThread := CreateRemoteThread(hProc, nil, 0, pLoadLibrary, pRemoteBuffer, 0, dwThreadID);
      try
        
WaitForSingleObject(hThread, INFINITE); // Here I did get the error
      
finally
        
CloseHandle(hThread);
      
end;
    finally
      
VirtualFreeEx(hProc, pRemoteBuffer, 0, MEM_RELEASE);
    
end;
  finally
    
CloseHandle(hProc);
  
end;
  exit(
1);
end; 

أريـد احد الاخوة الذي يستطيع ترجمة C++ إلى Delphi ان يقوم بترجمة الحل في صفحة ماكروسوفت
وإن كان هناك طريقة افضل من التي استعملتها او بدون استعمال دوال API فاافيدوني بها جزاكم الله خير Smile

وشكراً لحسن القراءة
الرد
#2
لا أعلم ما المشكل .. لكن الدالة التي و ضعتها تعمل بشكل طبيعي ..
تم تجريبها على Win 7 Pro & DXE3


الملفات المرفقة
.rar   Inject.part1.rar (الحجم : 500 ك ب / التحميلات : 49)
.rar   Inject.part2.rar (الحجم : 500 ك ب / التحميلات : 52)
.rar   Inject.part3.rar (الحجم : 441.78 ك ب / التحميلات : 48)
الرد
#3
إقتباس : لا أعلم ما المشكل .. لكن الدالة التي و ضعتها تعمل بشكل طبيعي ..
تم تجريبها على Win 7 Pro & DXE3

فعلاً ... هذا ما يحصل معي ... لكن مرات يحصل ما تم ذكرة بالاعلى ... !!
وكنت في شك من امري ... لكن بعد ان قرأت الموجود بـ صفحة ماكيروسوفت تأكدت انها من الدالة WaitForSingleObject

وكانت هذه المشكلة في البداية تحصل مع مستخدمين البرنامج ... وكنت اقول لهم ان البرنامج لا توجد به اي مشكلة ...
لكن مع الوقت صادفت هذه المشكلة ... واستطعت معرفة من اين تأتي...

ولاحظت كذلك ان المشكلة مستمرة مع انظمة 64bit ... بينما انظمة 32 قليلاً ما تحصل معهم هذه المشكلة ...
على اي حال ... إذا كان هناك طريقة لحقن الـ DLL بدون إستعمال هذه الدالة ... فستكون الحل الأمثل
الرد
#4
لقد قمت البتجريب على 64 بت .. وكل شيئ طبيعي ..
أعتقد أني وضعت سابقا دالة لعمل الحقن ....
على كل حال هذه مجموعة من الدوال لعمل حقن :

كود :
http://www.progamercity.net/delphi/647-delphi-dll-injection-functions.html
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم