نمایش نتایج 1 تا 39 از 39

نام تاپیک: درس اول : Debugger - Disassembler - Decompiler

Hybrid View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #1
    نقل قول نوشته شده توسط Inprise
    احتمالا" داری تلاش میکنی نحوهء عملکرد Machine ID و روش Cr@ck اون رو بفهمی ؛ بسیاری از روشهای حفاظتی با استفاده از پارامترهای مختلف ، یک عدد یکتای وابسته به ماشین ، برای هر سیستم تولید میکنند و مبتنی بر اون عدد یکتا و با استفاده از الگوریتم به خصوصی ، کد صحیح ورودی رو تولید میکنند ؛ عموما" وقتی داری از یک Key Generator استفاده میکنی در واقع با یک سیستم مبتنی بر Machine ID روبرو هستی ؛ برای Cr@ck روشهائی از این دست لازم نیست به سورس کد ! دسترسی داشته باشی یا نرم افزار رو Decompile ! کنی ؛ صرفا" کافیه نحوهء تولید Machine ID ( که عموما" زیاد پیچیده نیست ) رو بفهمی و با استفاده از الگوریتم تولید کد صحیح ( مطالعهء باینری و Disassemble باینری اغلب کافیه ) یک KeyGen بنویسی .

    توضیح : اگر واقعا" نمیتونی از محیط SICE استفاده کنی و اصرار داری یک رابط کاربری بصری داشته باشی میتونی از نسخهء Dual Machine این محصول استفاده کنی ؛ Visual SoftICE کلیهء امکانات SICE استاندارد رو داره به همراه یک رابط کاربری اما محیط کنترل با محیط دیباگ باید از روی دو ماشین مختلف باشند ؛ یعنی از Visual SoftICE روی یک سیستم نمیشه استفاده کرد ؛
    شب خوش :wise2:
    سلام
    به مورد بالا Remote Debugging میگن.
    ضمنا معمولا برنامه هایی که با اکتیویشن کی فعال میشن یا میشه فرمول بدست آوردن کدشون رو بدست آورد یا فرمول MachineID شون رو یا اینکه در صورت امکان قسمت تست کلید ورودی رو غیر فعال کرد (patch کردن). اینکار میتونه به سادگی گذاشتن چند تا nop یا یک jmp باشه یا خیلی سخت تر و مشکلتر مثل غیر فعال کردن کدهای آنتی دیباگ، بازکردن کد اجرایی فشرده شده و...
    در مورد دیکمپایل کردن کدهای ماشین به اسمبلی هم همونطور که فرمودید الزاما به کد اولیه نمیرسیم. مثلا قدیما در توربو پاسکال تحت داس چون این کامپایلر نمیتونست برای سی پی یو های ۳۲ بیتی (386 به بالا) کد خروجی بده مجبور بودیم برای نوشتن کد زیر :

    mov eax,ebx

    از کد زیر استفاده کنیم :

    db 66h
    mov ax,bx

    حقه جالبی بود. در واقع 66h پیشوند Instruction های 32 بیتی در زبان ماشین بود. از نظر اسمبلر داخلی توربو پاسکال این یک کد ۱۶ بیتی است اما از نظر برنامه در حال اجرا یک کد ۳۲ بیتی خواهد بود.

    دوستی هم که براشون یاد گرفتن فرامین SICE سخته اگر نیازشون واقعا فقط توسط SICE مرتفع میشه که هیچ. وگرنه اگر با IDA کار کنند بد نیست. خیلی امکاناتش زیاده.
    ضمنا تاپیک جالبی رو مطرح کردید میتونه خیلی آموزنده باشه.

    ممنون علی

  2. #2

    ضد دیباگر.

    با سلام به آقای اینپرایز عزیز و معذرت به خاطر دوری طولانی مدت. و ممنون از این بحثی که آغاز شده.
    در زیر به چند روش اولیه برای antidebugging اشاره میکنم.
    1 :تابع isdebuggerpresent: (kernel32.dll)
    این تابع مشخص میکند که آیا پروسه ما تحت یک دیباگر صورت میگیرد یا خیر.
    مقدار بازگشتی : اگز جواب بله باشد <>0 در غیر اینصورت =0 میباشد.
    (فقط با دیباگر های سطح ring3 عمل میکند)
    .586p

    .model flat

    extrn GetProcAddress:PROC

    extrn GetModuleHandleA:PROC

    extrn MessageBoxA:PROC

    extrn ExitProcess:PROC

    .data

    szTitle db "IsDebuggerPresent Demonstration",0

    msg1 db "Application Level Debugger Found",0

    msg2 db "Application Level Debugger NOT Found",0

    msg3 db "Error: Couldn't get IsDebuggerPresent.",10

    db "We're probably under Win95",0

    @IsDebuggerPresent db "IsDebuggerPresent",0

    K32 db "KERNEL32",0

    .code

    antidebug1:

    push offset K32 ; Obtain KERNEL32 base address

    call GetModuleHandleA

    or eax,eax ; Check for fails

    jz error

    push offset @IsDebuggerPresent ; Now search for the existence

    push eax ; of IsDebuggerPresent. If

    call GetProcAddress ; GetProcAddress returns an

    or eax,eax ; error, we assume we're in

    jz error ; Win95

    call eax ; Call IsDebuggerPresent

    or eax,eax ; If it's not 0, we're being

    jnz debugger_found ; debugged

    debugger_not_found:

    push 0 ; Show "Debugger not found"

    push offset szTitle

    push offset msg2

    push 0

    call MessageBoxA

    jmp exit

    error:

    push 00001010h ; Show "Error! We're in Win95"

    push offset szTitle

    push offset msg3

    push 0

    call MessageBoxA

    jmp exit

    debugger_found:

    push 00001010h ; Show "Debugger found!"

    push offset szTitle

    push offset msg1

    push 0

    call MessageBoxA

    exit:

    push 00000000h ; Exit program

    call ExitProcess

    end antidebug1


    2: توقف application level debugger با SEH :
    در ابتدا FS را ذخیره میکنیم .
    push dword ptr fs:[0]
    و اکنون زمان ان است که شی را وادار کنیم به handler ما اشاره کند.
    push offset SEH_Handler

    mov fs:[0],esp
    برای برگرداندن SEH این دوشتور را انجام دهید.
    pop dword ptr fs:[0]
    مثال :
    (نحوه کامپایل : tasm32 /m3 /ml sehtest,,;

    tlink32 /Tpe /aa sehtest,sehtest,,import32.lib
    )

    .386p

    .model flat ; Good good... 32 bit r0x0r

    extrn MessageBoxA:PROC ; Defined APIs

    extrn ExitProcess:PROC

    .data

    szTitle db "Structured Exception Handler example",0

    szMessage db "Intercepted General Protection Fault!",0

    .code

    start:

    call setupSEH ; The call pushes the offset

    ; past it in the stack rigth?

    ; So we will use that :)

    exceptionhandler:

    mov esp,[esp+8] ; Error gives us old ESP

    ; in [ESP+8]

    push 00000000h ; Parameters for MessageBoxA

    push offset szTitle

    push offset szMessage

    push 00000000h

    call MessageBoxA

    push 00000000h

    call ExitProcess ; Exit Application

    setupSEH:

    push dword ptr fs:[0] ; Push original SEH handler

    mov fs:[0],esp ; And put the new one (located

    ; after the first call)

    mov ebx,0BFF70000h ; Try to write in kernel (will

    mov eax,012345678h ; generate an exception)

    xchg eax,[ebx]

    end start
    .386p

    .model flat ; Good good... 32 bit r0x0r

    extrn MessageBoxA:PROC ; Defined APIs

    extrn ExitProcess:PROC

    .data

    szTitle db "Structured Exception Handler example",0

    szMessage db "Intercepted General Protection Fault!",0

    .code

    start:

    call setupSEH ; The call pushes the offset

    ; past it in the stack rigth?

    ; So we will use that :)

    exceptionhandler:

    mov esp,[esp+8] ; Error gives us old ESP

    ; in [ESP+8]

    push 00000000h ; Parameters for MessageBoxA

    push offset szTitle

    push offset szMessage

    push 00000000h

    call MessageBoxA

    push 00000000h

    call ExitProcess ; Exit Application

    setupSEH:

    push dword ptr fs:[0] ; Push original SEH handler

    mov fs:[0],esp ; And put the new one (located

    ; after the first call)

    mov ebx,0BFF70000h ; Try to write in kernel (will

    mov eax,012345678h ; generate an exception)

    xchg eax,[ebx]

    end start
    (بازم در مقابل SI نمی تواند عمل کند)

    3: شناسایی SI :در win9x
    سرویس vmm به نام get_ddb . (00010146 h) :
    mov eax, Device_ID

    mov edi, Device_Name

    int 20h ; VMMCall Get_DDB

    dd 00010146h

    mov [DDB], ecx
    این تابع مشخص میکند که ایا vxd برای وسیله مورد نظر نصب شده است. در صورت نسب بودن یک ddb برای ان بر میگرداند.
    Device_ID : device identifier (این پارامتر برای توابع مبتنی بر نام صفر قرار بگیرد)
    Device_Name: An eight-character device name that is padded with blank

    characters. This parameter is only required if Device_ID is zero. The

    device name is case-sensitive.

    خوب ممکنه براتون شگفت انگیز باشه که این کد کار میکنه. فیلد Device_ID . vxd ی که SI نصب میکند همیشه ثابت است و میتوانیم از این موضوع برای شناساییSi بهره ببریم.
    این مقدار 202h است.
    mov eax,00000202h

    VxDCall VMM_Get_DDB

    xchg eax,ecx

    jecxz NotSoftICE

    jmp DetectedSoftICE

    4: شناسایی SI :در win9x روش 2

    وقفه 2fh :
    INT 2F - MS Windows - GET DEVICE API ENTRY POINT
    AX = 1684h
    BX = virtual device (VxD) ID (see #1921)
    ES:DI = 0000h:0000h
    Return: ES:DI -> VxD API entry point, or 0:0 if the VxD does not support an API
    Note: some Windows enhanced-mode virtual devices provide services that
    applications can access. For example, the Virtual Display Device
    (VDD) provides an API used in turn by WINOLDAP.
    بنابراین شما در bxکافی است 202h قرار دهید تا وجود si را ثابت کنید.

    4: شناسایی SI : عمومی

    استفاده از تابع : createfile
    .586p

    .model flat

    extrn CreateFileA:PROC

    extrn CloseHandle:PROC

    extrn MessageBoxA:PROC

    extrn ExitProcess:PROC

    .data

    szTitle db "SoftICE detection",0

    szMessage db "SoftICE for Win9x : "

    answ1 db "not found!",10

    db "SoftICE for WinNT : "

    answ2 db "not found!",10

    db "(c) 1999 Billy Belcebu/iKX",0

    nfnd db "found! ",10

    SICE9X db ".SICE",0

    SICENT db ".NTICE",0

    .code

    DetectSoftICE:

    push 00000000h ; Check for the presence of

    push 00000080h ; SoftICE for Win9x envirome-

    push 00000003h ; nts...

    push 00000000h

    push 00000001h

    push 0C0000000h

    push offset SICE9X

    call CreateFileA

    inc eax

    jz NoSICE9X

    dec eax

    push eax ; Close opened file

    call CloseHandle

    lea edi,answ1 ; SoftICE found!

    call PutFound

    NoSICE9X:

    push 00000000h ; And now try to open SoftICE

    push 00000080h ; for WinNT...

    push 00000003h

    push 00000000h

    push 00000001h

    push 0C0000000h

    push offset SICENT

    call CreateFileA

    inc eax

    jz NoSICENT

    dec eax

    push eax ; Close file handle

    call CloseHandle

    lea edi,answ2 ; SoftICE for WinNT found!

    call PutFound

    NoSICENT:

    push 00h ; Show a MessageBox with the

    push offset szTitle ; results

    push offset szMessage

    push 00h

    call MessageBoxA

    push 00h ; Terminate program

    call ExitProcess

    PutFound:

    mov ecx,0Bh ; Change "not found" by

    lea esi,nfnd ; "found"; address of where

    rep movsb ; to do the change is in EDI

    ret

    end DetectSoftICE

  3. #3

    Loader چیست؟

    سلام
    جای یه توضیح کلی و اساسی در مورد لودرها جدا" خالیه
    آخرین ویرایش به وسیله Developer Programmer : جمعه 09 دی 1384 در 13:38 عصر

  4. #4
    کاربر دائمی
    تاریخ عضویت
    آبان 1385
    محل زندگی
    مشهد
    سن
    38
    پست
    449

    نقل قول: درس اول : Debugger - Disassembler - Decompiler

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

    آیا برای برنامه های دات نت راهی وجود دارد که حداقل این پروسه سخت یا حتی غیر ممکن شود ؟

    با توجه بهDecompile شدن اینگونه برنامه ها اگر کسی نسبت به کد برنامه اش حساس باشد توصیه میکنید با Delphi کد بنویسد ؟

    و یک سوال دیگر اینکه چرا کلیه کدهای مقابل با دیباگ ، دامپ و ... به زبان دلفی است ؟

تاپیک های مشابه

  1. قدرتمندترین DisAssembler و دیباگر موجود - IDA
    نوشته شده توسط Inprise در بخش برنامه نویسی اسمبلی خانواده x86
    پاسخ: 5
    آخرین پست: پنج شنبه 20 فروردین 1388, 18:45 عصر
  2. MSIL Disassembler و کرک برنامه ها
    نوشته شده توسط omidmehraban در بخش VB.NET
    پاسخ: 6
    آخرین پست: دوشنبه 14 مرداد 1387, 12:41 عصر
  3. Debugging with IDA - The Interactive Disassembler
    نوشته شده توسط matrix_commandline در بخش مهندسی مجدد و معکوس
    پاسخ: 0
    آخرین پست: پنج شنبه 17 آبان 1386, 12:12 عصر
  4. Buffer overrun در Disassembler
    نوشته شده توسط saeedIRHA در بخش امنیت در نرم افزار و برنامه نویسی
    پاسخ: 1
    آخرین پست: سه شنبه 21 شهریور 1385, 14:19 عصر
  5. Online x86 Disassembler
    نوشته شده توسط Inprise در بخش امنیت در نرم افزار و برنامه نویسی
    پاسخ: 0
    آخرین پست: جمعه 13 آبان 1384, 04:44 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •