26-05-2010, 03:09 PM
بسم الله الرحمن الرحيم
السلام عليكم ورحمة اللهباختصار لأن الموضوع طويل...
بداية هذه بعض الطرق والخدع لاكتشاف المنقح:
FindWindow: البحث عن واجهة OllyDbg باستخدام FindWindow
PHP كود :
function IsOllyDbgRunnig:Boolean;
const
OllyName='ollydbg';
begin
Result := (FindWindow(OllyName,nil) <> 0) or (FindWindow(PChar(UpperCase(OllyName)),nil) <> 0);
end;
IsDebuggerPresent: التابع IsDebuggerPresent من المكتبة Kernel32
PHP كود :
function IsDebuggerPresent: BOOL; stdcall; external 'kernel32.dll';
كود :
function IsDebugging: Boolean;
var
DllHnd: HWND;
DebugPresentFunc: function: BOOL; stdcall;
begin
DllHnd := LoadLibrary('kernel32.dll');
if DllHnd <> INVALID_HANDLE_VALUE then begin
DebugPresentFunc := GetProcAddress(DllHnd, 'IsDebuggerPresent');
Result := DebugPresentFunc;
end else Result := False;
end;PHP كود :
function CheckRemoteDebuggerPresent(hProcess: HWND; out pbDebuggerPresent: BOOL): BOOL; stdcall; external 'kernel32.dll';
أيضا يمكن استخدام اسم مستعار.
ProcessName: فحص اسم الـ Process مثال:
PHP كود :
uses
tlhelp32;
function GetPidByPName(Selected_Process: String): DWORD;
var
hSnap: THandle;
lppe: TProcessEntry32;
dwPID: DWORD;
begin
dwPID := 0; //initializing the variable
lppe.dwSize := sizeof(lppe);
hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if Process32First(hSnap, lppe) <> False then
begin
if lppe.szExeFile = Selected_Process then dwPID := lppe.th32ProcessID;
while Process32Next(hSnap, lppe) do
if lppe.szExeFile = Selected_Process then dwPID := lppe.th32ProcessID;
end;
Result := dwPID;
end;
PHP كود :
if GetPidByPName('ollydbg.exe') <> 0 then
MessageBox(0, 'OllyDbg detected!', 'Warning', MB_OK + MB_ICONEXCLAMATION)
PHP كود :
//***************************************************
// Check the parent process to detect OllyDBG
//***************************************************
function CheckParentProcess:Boolean;
const
ParentName='\EXPLORER.EXE';
var
hSnap,hProcess:THandle;
szBuffer:array[0..MAX_PATH] of char;
FileName:array[0..MAX_PATH] of char;
Process32:PROCESSENTRY32;
LoopFlag:BOOL;
begin
Result:=False;
//// List of snapshots of all processes
hSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hSnap=INVALID_HANDLE_VALUE then
begin
Result:=False;
Exit;
end;
Process32.dwSize:=sizeof(PROCESSENTRY32);
// Find process
LoopFlag:=Process32First(hSnap,Process32);
if LoopFlag=False then
begin
CloseHandle(hSnap);
Result:=False;
Exit;
end;
while Integer(LoopFlag)<>0 do
begin
if Process32.th32ProcessID=GetCurrentProcessId() then
begin
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,FALSE,Process32.th32ParentProcessID);
if hProcess<>0 then
begin
if GetModuleFileNameEx(hProcess,0,FileName,MAX_PATH)<>0 then
begin
//Get the system directory
GetWindowsDirectory(szBuffer,MAX_PATH);
//Merge the system directory and \ EXPLORER.EXE
StrCat(szBuffer,ParentName);
//Converted to uppercase compare the current debugger after the process is the parent process
if UpperCase(String(FileName))<>UpperCase(String(szBuffer)) then
Result:=True
else
Result:=False;
end;
end
else
Result:=False;
end;
LoopFlag:=Process32Next(hSnap,Process32);
end;
CloseHandle(hSnap);
end;
PHP كود :
//***************************************
//Use the PEB structure inspection OllyDBG
//***************************************
function IsBeingDebugged:Boolean; //detection of the debugger
asm
mov eax,fs:[$30]
//Get PEB offset value 2h Department BeingDebugged
movzx eax,byte ptr[eax+$2]
end;
التوابع السابقة موجهة لاكتشاف المنقح الشهير OllyDbg ويمكن تنفيذها على بقية برامج التنقيح بنفس المبدأ
طبعا كل الطرق السابقة يتم تجاوزها دون تعب، بسهولة باستخدام الإضافات (Plugins) الشهيرة
...لكن هناك خدعة صغيرة لم يبرمج لها أي Plugin حتى الآن

قبل أن أطرح الكود، دعونا نجعله في تمرين صغير

المثال مرفق لاكتشاف الخدعة، وهو مشفر بتوابع مكتوبة بدلفي سأرفقها أيضا
المطلوب: فك التشفير ثم اكتشاف اسم التابع/النمط المستخدم (المطلوب ليس الكسر، هذا ليس CrackMe)
ملاحظة: التشفير المستخدم يتسبب في False Positive لدى بعض المضادات (Kaspersky بالتجربة)
التمرين سهل جدا فلا تترددوا
بالتوفيق.
اللهم احقن دماء المسلمين، لا تنسوهم بالدعاء...

