امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
rebuild dump
نویسنده پیام
lord_viper غایب
مدیر کل انجمن
*****

ارسال‌ها: 3,949
موضوع‌ها: 352
تاریخ عضویت: بهمن ۱۳۸۴

تشکرها : 5193
( 9875 تشکر در 2650 ارسال )
ارسال: #1
rebuild dump
با سلام
یه برنامه نوشتم که پروسه در حال اجرا رو به طور کامل dump میکنه یک مقدار اطلاعات در مورد نحوه باز سازی section ها و IAT میخواهم که به چه نحوی انجام میشه

با تشکر
۲۵-فروردین-۱۳۸۸, ۱۴:۴۴:۵۲
وب سایت ارسال‌ها
پاسخ
yeketaz آفلاین
کاربر با تجربه
****

ارسال‌ها: 744
موضوع‌ها: 123
تاریخ عضویت: اسفند ۱۳۸۶

تشکرها : 520
( 1050 تشکر در 294 ارسال )
ارسال: #2
RE: rebuild dump
سلام
مبین این Dumper منه که پروسه رو توی حافظه دامپ و توی اطلاعات رو توی یه فایل ذخیره می کنه با پسوند dat
کد:
#Compile Exe
#Include "win32api.inc"
#Include "tlhelp32.inc"

Function DumpModule (ByVal dwPID As Dword, szModule As Asciiz, sBuf As String) As Dword
Local hModuleSnap As Dword, me32 As MODULEENTRY32, lResult As Long, szLModule As Asciiz * %MAX_PATH, lBytesRead As Dword
Local dwBase As Dword, dwSize As Dword, lpSystemInfo As SYSTEM_INFO, dwOffset As Dword, hProc As Dword, i As Dword
GetSystemInfo lpSystemInfo
szLModule = LCase$(szModule)
hModuleSnap = CreateToolhelp32Snapshot(%TH32CS_SNAPMODULE, dwPID)
If hModuleSnap <> %INVALID_HANDLE_VALUE Then
    me32.dwSize = SizeOf(MODULEENTRY32)
    lResult = Module32First (hModuleSnap, me32)
    While lResult
        If LCase$(me32.szExePath) = szLModule Then
            dwBase = me32.ModBaseAddr
            dwSize = me32.ModBaseSize
            Exit
        End If
        lResult = Module32Next (hModuleSnap, me32)
    Wend
    CloseHandle hModuleSnap
End If
If dwBase = 0 Then
    MsgBox "Couldn't locate module in target process", %mb_iconerror + %mb_ok, "Error"
    Exit Function
End If
If dwPID = GetCurrentProcessId Then
     hProc = GetCurrentProcess
Else
     hProc = OpenProcess(%PROCESS_VM_READ, %FALSE, dwPID)
     If hProc = 0 Then
         MsgBox "OpenProcess failed", %mb_iconerror + %mb_ok, "Error"
         Exit Function
     End If
End If

sBuf = String$(me32.ModBaseSize + lpSystemInfo.dwPageSize, 0)
For i = 1 To (me32.ModBaseSize \ lpSystemInfo.dwPageSize) + 1
    ReadProcessMemory (ByVal hProc, ByVal me32.ModBaseAddr + dwOffset, ByVal StrPtr(sBuf) + dwOffset, ByVal lpSystemInfo.dwPageSize, lBytesRead)
    dwOffset = dwOffset + lpSystemInfo.dwPageSize
Next
sBuf = Left$(sBuf, me32.ModBaseSize)
Function = Len(sBuf)
End Function


Function PBMain () As Long
'// Dump a module (szModule) from a process (dwPID) into string buffer (sBuf)
Local dwPID As Dword, sBuf As String, szModule As Asciiz * %MAX_PATH
dwPID = GetCurrentProcessID
GetModuleFilename(ByVal GetModuleHandle(ByVal 0), szModule, SizeOf(szModule))
If DumpModule(ByVal dwPID, szModule, sBuf) > 0 Then
     MsgBox "Success. First two bytes = " & Left$(sBuf,10) '// should be "MZ"
Else
     MsgBox "Failed"
End If

Local hFile As Dword: hFile = FreeFile
Open szModule & "-dumped.dat" For Binary Access Write Lock Shared As #hFile
  Put #hFile, 1, sBuf
Close #hFile
End Function
سورس بالا رو خیلی ساده سعی کردم طراحی کنم و وقتی برنامه رو اجرا می کنی و اطلاعات ذخیره می شه
اگه فایل رو با یه برنامه مثل PEiD باز کنی به راحتی Section ها شناسایی می شن و همین طور خیلی اطلاعات دیگه
ولی برنامه PEiD نتونست ImportTable رو نشون بده،اون برنامه ای که خودم دارم می نویسیم ، تونست محل
اجزای DataDirectory مثل ImportTable و Relocation
رو نشون بده ولی هیچی از اون قسمتها نتونست بدست بیاره مثلا همون توابع مورد استفاده برنامه از ImportTable
یعنی هدر برنامه و Section ها به درستی و در جای مشخص شده خود در فایل ذخیره می شوند ولی ImportTable و دیگر قسمتهای
DataDirectory جایی غیر از محل مشخص شده توی هدر ذخیره می شن که این دردسر سازه
بعد خودم فایل رو با یه HexViewer باز کردم دیدم اطلاعات ImportTable و در کل DataDirectory جایی ذخیره شده که برنامه هایی
مثل PEiD و امثالهم نمی تونن پیداش کنن
ولی هست،کامل هم هست،یعنی سورس بالا که اینطوری عمل می کنه
ولی هنوز نتونستم رابطه ای به دست بیارم که بگه چه جوری در برنامه های دامپ شده از روی حافظه می تونه IAT رو به ما بده
و همین طور بقیه قسمت های DataDirectory
البته برنامه تقصیری نداره چون کارش رو درست انجام می ده و برنامه رو به صورت کامل از روی حافظه دامپ و توی فایل ذخیره می کنه
ولی این مشکلی که برای ما پیش اومده بر می گرده به طرز قرار گیری برنامه در حافظه که باید یه اطلاعاتی از این ساختار بدست بیاری
حالا یه نگاه به مقاله خودت بنداز شاید یه کاری شد کرد،یعنی حتما می شه این مشکل رو حل کرد
اگه اطلاعاتی بدست اوردی یا همین جا بگو یا توی چت تا منم بتونم Dumper برنامم رو کاملتر کنم که بتونه مثل اینکه فایل رو از روی
هارد لود می کنه اطلاعات یک برنامه دامپ شده رو هم کامل بده
منم پیگیر قضیه می شم ببینیم به کجا می رسیم،به امید خدا
موفق باشی

ما که دیگه توی ایران ویج پیر شدیم 040 کم کم باید جامون رو بدیم به جوونا 028
(آخرین ویرایش در این ارسال: ۲۵-فروردین-۱۳۸۸, ۱۸:۱۴:۱۷، توسط yeketaz.)
۲۵-فروردین-۱۳۸۸, ۱۷:۲۰:۲۱
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : man4toman
lord_viper غایب
مدیر کل انجمن
*****

ارسال‌ها: 3,949
موضوع‌ها: 352
تاریخ عضویت: بهمن ۱۳۸۴

تشکرها : 5193
( 9875 تشکر در 2650 ارسال )
ارسال: #3
RE: rebuild dump
سلام علی رضا جان راستش شما از یه تابع به اسم dump module استفاده کردین که فکر نکنم جزو توابع api باشه من با استفاده از virtualqueryex اطلاعات سایز پروسه و ادرسش تو حافظه رو میگیرم و با readprocessmemory اطلاعات پروسه رو میخونم که به صورت hex هست بعد با create file یه فایل خالی می سازم و اطلاعات رو توش مینویسم مشکل من از اینجا به بعد هست که اطلاعات مورد نیاز import table رو چطور ازش دربیارم و .............
۲۵-فروردین-۱۳۸۸, ۲۳:۰۱:۵۴
وب سایت ارسال‌ها
پاسخ
amirjan آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 1,105
موضوع‌ها: 24
تاریخ عضویت: تير ۱۳۸۳

تشکرها : 348
( 697 تشکر در 251 ارسال )
ارسال: #4
RE: rebuild dump
من یه نیم چه تجربه توی این قضیه دارم (البته من که نه !! بچه های قدیمی ایران ویج ...)
یه مهدی داشتیم (impostor یا imposter یا ... نمیدونم دقیق ، یه همچین چیزی) ، یه پکر نوشته بود گفته بود که براش آنپکر بنویسیم ...
ما هم دو تا سورس کنار دستیم بود از سورس همین بچه های ایران ویج (یکی کامران ، یکی بهزاد) ...
کامران یه دامپر نوشته بود ، بهزاد هم یه برنامه که اطلاعات کامل درباره یه فایل PE رو استخراج میکرد (جفتش هم وی بی)
این دو تا رو ترکیب کردم ، با دامپر همون شکلی که خودتون گفتید حافظه مربوط به اون پروسه خاص رو دامپ کردم ، بعد توش دنبال نشونه MZ گشتم . وقتی پیدا شد ، هر چی اطلاعات قبلش بود پاک کردم . بعد این میشد یه فایل PE ، بعد ولی این بدرد نمیخوره ، اولش مشخصه ، ولی آخرش معلوم نیست (پایان نداره) ... برای این هم از سورس آقا بهزاد کمک گرفتم ، و stub size فایل رو حساب کردم و در نتیجه تونستم extra byte ها رو پاک کنم . حالا شد یه فایل PE درست حسابی ! سورسشم فک کنم هنوز هست ، خواستی بگو بگردم ...

میدونم که خیلی مبتدیانه نوشتم ... واقعا در این ارتباط اطلاعاتم خیلی کمه ... آقا سعید استاد بازسازی PE هستن ...

سید امیر حسین حسنینی

Human knowledge belongs to the world ...
(آخرین ویرایش در این ارسال: ۲۵-فروردین-۱۳۸۸, ۲۳:۵۴:۴۶، توسط amirjan.)
۲۵-فروردین-۱۳۸۸, ۲۳:۵۱:۰۵
ارسال‌ها
پاسخ
saeedsmk آفلاین
مدیر بخش کرک و کامپیوتر
*****

ارسال‌ها: 506
موضوع‌ها: 74
تاریخ عضویت: آبان ۱۳۸۴

تشکرها : 677
( 1179 تشکر در 348 ارسال )
ارسال: #5
RE: rebuild dump
سلام
خوب هستيد
امين جان اين روشتت فكر كنم براي فايل هاي باشه كه pe هدر درست باشه ولي براي همه دامپر ها جواب نميدهده. براي تصحيح سكشن ها بايد مقدار صحيح طول سكشن و شروع و... از توي برنامه پك شده استخراج بشه . كه بستگي به برنامه فرق ميكنه.
اما براي it شما ميتونيد از dll اي كه ImportREC استفاده كنيد كه با دادن oep به اين dll و مشخص كردن اميچ دامپ شده خودش مي ايد و IT رو ريبيلد ميكنه مثل خيلي از دامپر ها .( مثلا loardpe) به اميد ديدار

در دنياي كه مرگ شكارچي ان است بايد شكارچي بود - تعليمات دون خوان نوشته كارلوس كاستاندار
۲۶-فروردین-۱۳۸۸, ۰۹:۱۳:۱۵
ارسال‌ها
پاسخ
lord_viper غایب
مدیر کل انجمن
*****

ارسال‌ها: 3,949
موضوع‌ها: 352
تاریخ عضویت: بهمن ۱۳۸۴

تشکرها : 5193
( 9875 تشکر در 2650 ارسال )
ارسال: #6
RE: rebuild dump
ممنون امیر جان اگه بزاری که خیلی خوبه بتونم از روش یه ایده بگیرم کافیه
۲۶-فروردین-۱۳۸۸, ۰۹:۱۵:۵۱
وب سایت ارسال‌ها
پاسخ
amirjan آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 1,105
موضوع‌ها: 24
تاریخ عضویت: تير ۱۳۸۳

تشکرها : 348
( 697 تشکر در 251 ارسال )
ارسال: #7
RE: rebuild dump
(۲۶-فروردین-۱۳۸۸, ۰۹:۱۳:۱۵)saeedsmk نوشته است: سلام
خوب هستيد
امين جان اين روشتت فكر كنم براي فايل هاي باشه كه pe هدر درست باشه ولي براي همه دامپر ها جواب نميدهده. براي تصحيح سكشن ها بايد مقدار صحيح طول سكشن و شروع و... از توي برنامه پك شده استخراج بشه . كه بستگي به برنامه فرق ميكنه.

بله ، درست می فرمایید ... توی این پکر آقا مهدی جواب میداد فقط ...
ببینم مگه دامپر کارش این نیست که اطلاعاتی که توی رم هست رو به ما نشون بده ؟
آخه من برداشتم از این جمله شما اینه که هر دامپری یه خروجی داره ، اینطوریه واقعا ؟!

(۲۶-فروردین-۱۳۸۸, ۰۹:۱۵:۵۱)lord_viper نوشته است: ممنون امیر جان اگه بزاری که خیلی خوبه بتونم از روش یه ایده بگیرم کافیه

امشب دارم میرم تهران ، حتما اونجا پیداش می کنم برات ...

سید امیر حسین حسنینی

Human knowledge belongs to the world ...
۲۶-فروردین-۱۳۸۸, ۱۲:۲۲:۰۷
ارسال‌ها
پاسخ
yeketaz آفلاین
کاربر با تجربه
****

ارسال‌ها: 744
موضوع‌ها: 123
تاریخ عضویت: اسفند ۱۳۸۶

تشکرها : 520
( 1050 تشکر در 294 ارسال )
ارسال: #8
RE: rebuild dump
(۲۵-فروردین-۱۳۸۸, ۲۳:۰۱:۵۴)lord_viper نوشته است: سلام علی رضا جان راستش شما از یه تابع به اسم dump module استفاده کردین که فکر نکنم جزو توابع api باشه من با استفاده از virtualqueryex اطلاعات سایز پروسه و ادرسش تو حافظه رو میگیرم و با readprocessmemory اطلاعات پروسه رو میخونم که به صورت hex هست بعد با create file یه فایل خالی می سازم و اطلاعات رو توش مینویسم مشکل من از اینجا به بعد هست که اطلاعات مورد نیاز import table رو چطور ازش دربیارم و .............
سلام
نه جزو توابع API نیست و یه تابع برای دامپ پروسه ها توی حافظه هستش
روش کارشم توی سورس معلومه،فقط در بعضی جاها دیگه همش از API ها استفاده نکردم
چون شده با روشهای ساده تری انجامش بدم
همین تابع اطلاعات رو با همون تابع ReadProcessMemory می خونه
ولی دیگه برای ساخت فایل از API استفاده نکردم
برای خوندن ImportTable هم یه تابع دیگه نوشتم :
کد:
Function GetImports(    _
    wf As String,       _   'contains "whole file"
    ByVal pd As Dword,  _   'file offset to data
    ByVal de As Dword,  _   'value to subtract from ".link" offsets's
    ByVal ss As Dword,  _   'section size
    ByVal ba As Dword   _   'base address of process (not section)
    ) As Long

#Register All
Local fo    As Long
Local pa    As Dword 'array pointer
Local pi    As Dword 'ImportByname pointer
Local pt    As Dword 'pointer to import name address table
Local dn    As String
Local nm    As String
Local n     As Long
Local p     As Long

Local ic   As Long    'temporary import count
'dim   dl() as string  'DLL names with import counts
Dim   im(0) As String  'import names
Dim   ia(0) As Dword   'import jmp addresses

    's = s & $CrLf & "************* Imports *************" & $CrLf
    's = s & "The addresses are those used by API calls" & $CrLf

    fo = FreeFile
    Open $Imports  For Output As #fo

    For n = pd To pd + ss Step SizeOf(IMAGE_IMPORT_DESCRIPTOR)

        '------------------------------
        pa = CvDwd(wf, n + 12) 'get pointer to DLL's name
        If pa = 0 Then Exit For 'no more DLL names

        '------------------------------
        'get DLL name
        dn = Mid$(wf, pa - de + 1, 100) & $Nul
        dn = Left$(dn, InStr(dn, $Nul) - 1)
        p = InStr(dn, ".")
        If p Then dn = Left$(dn, p)

        'Print# fo, $Tab & $Tab & dn     's = s & $CrLf & $Tab & $Tab & dn & $CrLf & $CrLf

        '------------------------------
        '.Characteristics points to the array of ImportByName pointers
        pa = CvDwd(wf, n) - de + 1

        '.FirstThunk points to the import table
        pt = ba + CvDwd(wf, n + 16)

        '------------------------------
        Do

            pi = CvDwd(wf, pa)  'get pointer to import name

            '--------------------------
            'add 2 to point it past the hint. and then 1, since it's not zero-based
            If pi = 0 Then Exit Do Else pi = pi - de + 3 '+ 2 + 1

            '--------------------------
            'get import name
            nm = Mid$(wf, pi, 100) & $Nul : nm = Left$(nm, InStr(nm, $Nul) - 1)

            '--------------------------
            'collect the names and table addresses in arrays
            im(ic) = dn & "." & nm : ia(ic) = pt
            Incr ic : ReDim Preserve im(ic) : ReDim Preserve ia(ic)

            '--------------------------
            'append to result string
            Print# fo, Hex$(pt, 6) & $Tab & dn & nm 's = s & hex$(pt, 6) & "  " & nm & $CrLf

            '--------------------------
            'get ready for another one
            pa = pa + 4 : pt = pt + 4

        Loop

    Next n

    Close# fo

End Function

البته تابع به یه سری متغیر مثل Import نیاز داره که آدرس فایلیه که توابع مورد استفاده در برنامه
درش ذخیره می شه ولی در کل تابع کامله
پارامترها هم که توضیح انگلیسیش رو جلوش دادم

ما که دیگه توی ایران ویج پیر شدیم 040 کم کم باید جامون رو بدیم به جوونا 028
۲۶-فروردین-۱۳۸۸, ۱۶:۴۰:۵۳
وب سایت ارسال‌ها
پاسخ
lord_viper غایب
مدیر کل انجمن
*****

ارسال‌ها: 3,949
موضوع‌ها: 352
تاریخ عضویت: بهمن ۱۳۸۴

تشکرها : 5193
( 9875 تشکر در 2650 ارسال )
ارسال: #9
RE: rebuild dump
ممنون از لطف دوستان
تا اونجا که من فهمیدم سکشنها دونه دونه به طور کامل تو پروسه پشت سر هم load میشن
امیر جان اگه اون کد رو سریعتر پیدا کنی خیلی لطف میکنی
علی رضا جان کدت فکر کنم power basic هست واسم یه کم (خیلی) نامهومه سورس از cیا ++c نداری؟
البته یه چیزهایی از طریقه کار loader میدونم ولی تا بخواهم اینو تکمیل کنم تعطیلات منم تموم میشه
۲۶-فروردین-۱۳۸۸, ۲۳:۱۲:۳۱
وب سایت ارسال‌ها
پاسخ
saeedsmk آفلاین
مدیر بخش کرک و کامپیوتر
*****

ارسال‌ها: 506
موضوع‌ها: 74
تاریخ عضویت: آبان ۱۳۸۴

تشکرها : 677
( 1179 تشکر در 348 ارسال )
ارسال: #10
RE: rebuild dump
سلام
خوب هستيد
دقيقا منظورم اينكه براي دامپر هاي كه كاروشن ربيلد هم هست اين مشكل ساز ميشه . ( اگر فايل و يا سكشن كريپت شده و يا پك شده توي حافظه باشه نتيجه دامپر هاي جنرال و دامپر هاي ريبيدلر يكي نيست )
لرد جان فكر كنم اين همون فايل امير جان باشه پيوست يك
و پيوست دوم هم يك پيوست در مورد import table

اميدوارم كمك كنه


فایل‌(های) پیوست شده
.zip   exeDumper.zip (اندازه: 37.56 KB / تعداد دفعات دریافت: 73)
.zip   impreb.zip (اندازه: 529.39 KB / تعداد دفعات دریافت: 215)

در دنياي كه مرگ شكارچي ان است بايد شكارچي بود - تعليمات دون خوان نوشته كارلوس كاستاندار
(آخرین ویرایش در این ارسال: ۲۷-فروردین-۱۳۸۸, ۰۲:۳۲:۰۹، توسط saeedsmk.)
۲۷-فروردین-۱۳۸۸, ۰۲:۲۸:۱۴
ارسال‌ها
پاسخ
lord_viper غایب
مدیر کل انجمن
*****

ارسال‌ها: 3,949
موضوع‌ها: 352
تاریخ عضویت: بهمن ۱۳۸۴

تشکرها : 5193
( 9875 تشکر در 2650 ارسال )
ارسال: #11
RE: rebuild dump
ممنون سعید جان
درسته در مورد پکر هایی مثل ارمادیلو که تو حافظه هم پک شده هستن جواب نمیده ولی اینجور پکر ها اول میان یه بار کل برنامه رو انپک میکنن و رو هارد قرار میدن بعد تو هر لحضه 2 تا page رو انپک میکنن موقع دسترسی به صفحات پک شده ارور ایجاد میشه دیباگر داخلی این پکرها ارور رو انالیز میکنه و بسته به ادرس مورد نظر 2 صفحه بعدی رو انپک میکنه و بعد جاگذاری تو حافظه برنامه رو resume میکنه تا به کارش ادامه بده اینها رو هم میشه دور زد

مقاله های anti_unpacker tricks سایت utus4you خیلی جالبه و در مورد تمامی این روشها توضیح داده
۲۷-فروردین-۱۳۸۸, ۰۹:۰۴:۵۲
وب سایت ارسال‌ها
پاسخ


پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 4 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS