ايران ويج

نسخه‌ی کامل: ساخت Loader برای فایل های DLL
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام. خدمت همه دوستات گرامی 028
من برنامه ایی دارم که نیاز به پچ شدن یه فایل DLL داره برای کرک کردنش. متاسفانه فایل DLL با روش ASLR یا Address Space Layout Randomization محافظت میشه و هر سری یه آدرس جدید میده
من خودم مناسفانه تا به حال برای DLL ها Loader نساختم و نمی دونم نحوه ساخت به چه شکل هستش.
اگر فایل پچ بشه متاسفانه نرم افزار ارور میده و اجرا نمیشه و احتمالا یه پروتکتور هم در این موضوع داره. به همین جهت علاقه دارم با Loader اجرا کنم.
دوستان تجربه ایی دارن من رو در این زمینه کمک کنن؟  لبخند - بهینه شده برای ورژن جدید
ASLR  رو فيكس كن !!!
 راهاي زيادي داره،ساده ترين براش ما استفاده از ابزار CFF EXPLORER هست
1-DLL رو درون برنامه درگ كنيد
2- به قسمت Optional Header
3- به فيلد DllCharacteristics بريد ودبل كليك كنيد
4- گزينه DLL can move رو غير فعال كنيد
5-ذخيره كنيد(قبلش ي بك  آپ از فايلتون بگيريد)

[تصویر:  PE-NT-Header-Optional.PNG]

روش دوم: همون روش اول با اسكريپ پايتون

کد php:
import argparse
import os
import pefile


class DllCharacteristics():
 
   def __init__(self):
 
       self.IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE False
        self
.IMAGE_DLLCHARACTERISTICS_WDM_DRIVER False
        self
.IMAGE_DLLCHARACTERISTICS_NO_BIND False
        self
.IMAGE_DLLCHARACTERISTICS_NO_SEH False
        self
.IMAGE_DLLCHARACTERISTICS_NO_ISOLATION False
        self
.IMAGE_DLLCHARACTERISTICS_NX_COMPAT False
        self
.IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY False
        self
.IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE False


def get_dll_characteristics
(path):
 
   foo DllCharacteristics()

 
   pe pefile.PE(pathfast_load=True)
 
   dll_characteristics pe.OPTIONAL_HEADER.DllCharacteristics

    if dll_characteristics 
0:
 
       if dll_characteristics >= 32768:
 
           foo.IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE True
            dll_characteristics 
-= 32768

        if dll_characteristics 
>= 8192:
 
           foo.IMAGE_DLLCHARACTERISTICS_WDM_DRIVER True
            dll_characteristics 
-= 8192

        if dll_characteristics 
== 2048 or dll_characteristics 2080:
 
           foo.IMAGE_DLLCHARACTERISTICS_NO_BIND True
            dll_characteristics 
-= 2048

        if dll_characteristics 
== 1024 or dll_characteristics 1056:
 
           foo.IMAGE_DLLCHARACTERISTICS_NO_SEH True
            dll_characteristics 
-= 1024

        if dll_characteristics 
== 512 or dll_characteristics 544:
 
           foo.IMAGE_DLLCHARACTERISTICS_NO_ISOLATION True
            dll_characteristics 
-= 512

        if dll_characteristics 
== 256 or dll_characteristics 288:
 
           foo.IMAGE_DLLCHARACTERISTICS_NX_COMPAT True
            dll_characteristics 
-= 256

        if dll_characteristics 
>= 128:
 
           foo.IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY True
            dll_characteristics 
-= 128

        if dll_characteristics 
== 64:
 
           foo.IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE True
            dll_characteristics 
-= 64

    return foo


if __name__ == '__main__':

 
   parser argparse.ArgumentParser()
 
   parser.add_argument('dir'help='Directory to scan')
 
   args parser.parse_args()

 
   dep_enabled = []
 
   dep_disabled = []

 
   aslr_enabled = []
 
   aslr_disabled = []

 
   for rootdirsfiles in os.walk(args.dir):
 
       for f in files:
 
           bar get_dll_characteristics(os.path.join(rootf))

 
           if bar.IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE:
 
               aslr_enabled.append(f)
 
           else:
 
               aslr_disabled.append(f)

 
           if bar.IMAGE_DLLCHARACTERISTICS_NX_COMPAT:
 
               dep_enabled.append(f)
 
           else:
 
               dep_disabled.append(f)

 
   print "ASLR Enabled: "
 
   print "=============="
 
   for i in aslr_enabled:
 
       print i
    print 
""

 
   print "ASLR Disabled: "
 
   print "==============="
 
   for i in aslr_disabled:
 
       print i
    print 
""

 
   print "DEP Enabled: "
 
   print "============="
 
   for i in dep_enabled:
 
       print i
    print 
""

 
   print "DEP Disabled: "
 
   print "=============="
 
   for i in dep_disabled:
 
       print i
    print 



روش سوم :ديباگ كردن (حوصله و وقت مثالش رو نداشتم)

روش چهارم لودر

روش پنجم  دستكاري سيستم عامل ك روي ي ادرس مشخص RELOCATE كنه (توصيه نميشه)
با تشکر از استاد عزیز لبخند - بهینه شده برای ورژن جدید
من چند راه رو تست کرده بودم ولی متاسفانه نامرد یه پروتکشن دیگه داره که بعد از ویرایش فایل میگه فایل مشکل داره و اجرا نمیشه
ولی بیشتر خودم علاقه دارم در مورد ساخت لودر برای فایل های DLL اطلاعاتی داشته باشم  :():
(۱۰-مهر-۱۳۹۹, ۱۲:۳۳:۱۵)Tiny Russell نوشته است: [ -> ]با تشکر از استاد عزیز لبخند - بهینه شده برای ورژن جدید
من چند راه رو تست کرده بودم ولی متاسفانه نامرد یه پروتکشن دیگه داره که بعد از ویرایش فایل میگه فایل مشکل داره و اجرا نمیشه
ولی بیشتر خودم علاقه دارم در مورد ساخت لودر برای فایل های DLL اطلاعاتی داشته باشم  :():

شما اول سوالتون رو مشخص كنيد
 در مورد سوال دومتون شايد CRC chk داره
می خوام برای یک نرم افزار که قفلش در یک DLL هستش و با ASLR محافظت میشه لودر درست کنم. آیا شدنی هستش؟  :(): چطوری میتونم CRC رو چک کنم؟ تعجب - بهینه شده برای ورژن جدید (البته میدونم سوالم خیلی کلی هستش)
(۱۳-مهر-۱۳۹۹, ۱۹:۵۶:۴۶)Tiny Russell نوشته است: [ -> ]می خوام برای یک نرم افزار که قفلش در یک DLL هستش و با ASLR محافظت میشه لودر درست کنم. آیا شدنی هستش؟  :(): چطوری میتونم CRC رو چک کنم؟ تعجب - بهینه شده برای ورژن جدید (البته میدونم سوالم خیلی کلی هستش)

احتياج به لودر نيست ولي اگه هدفت تمرين هست بله اونم ميشه منتهي اگه ASLR رو نخوايي فيكس كني بايد از تكنيك S&R استفاده كني به اينصورت كه توالي يكتا از بايت هايي رو پيدا كني كه بايت يا بايت هاي پچ شما هم درونش باشن

اگر متوجه نشدي Dll رو همينجا آپلود كن
منظوزتون Search and replace هستش؟ متاسفانه تو DUP2 و یه برنامه دیگه تست کردم ارور میده که نمیتونه لودر رو درست کنه  014
خودتون لودر بنویسید، روش pattern scan رو برای بدست آوردن آدرس پچ تست کنید ببینید جواب میده یا نه