PDA

نسخه کامل مشاهده نسخه کامل : درخواست برنامه اي كه بدون استفاده از جريانها سورس خودش رو چاپ كنه



sin66x
11-09-2006, 07:57
سلام دوستان
مسئله اي رو چند وقت پيش ديدم كه هنوز نتونستم راه حلي پيدا كنم سوال اين بود
- برنامه اي بنويسيد كه بدون استفاده از جريانها سورس خودش رو چاپ كنه!

someone
11-09-2006, 14:42
سلام.
يه مقدار در مورد سوال توضيح ميديد؟
منظور از سورس خودش رو چاپ كنه چيه؟ آيا منظورتون يكdisassembler هست؟
ميشه در يه فايل exe يه DataBox ايجاد و اطلاعاتي رو در اون قرار داد. يا اينكه اطلاعاتي رو به فايل exe مورد نظر Append كرد. مسلما در يه فايل exe , سورس خود برنامه وجود داره البته به كد ماشين كه در قسمت Code Segment يه فايل exe قرار داره.آيا منظورتون dump كردن اين قسمت هست؟ بيشتر توضيح بديد.
اگه سوال مربوط به كتاب يا سايتي هست لطفا اون رو معرفي كنيد.
ممنون.

sin66x
12-09-2006, 08:41
نه اصلا disassembler کردن منظور نیست! حتا برنامه باید include ها رو هم بنویسه! باید بشه از printf یه جوری استفاده بشه که حتی خودشم بنویسه! این سوال پارسال تکلیف بچه های سال اول شریف بوده و اونا حتی اسمبلی نخونده بودن!
من سعی کردم از روی RAM که حتما کد برنامه اونجا هست بخونم ( چون بعد از برگشتن از محیط اجرا به محیط نگارش متن برنامه هنوز هستش) اما نتونستم علاوه بر این اگر این برنامه Exe شد و اجرا شد دلیلی برای وجود متن اون توی RAM نیست!

someone
12-09-2006, 17:21
دوباره سلام.
خب پس منظور dump كردن CS يه فايل exe نيست.چون كار ساده اي نيست.
برنامه اي كه نوشتم فقط هنگامي برنامه رو از IDE اجرا كنيد source برنامه رو نشون ميده.كه البته منظور شما اين نبوده.چون اگه source برنامه كنار فايل exe نباشه كاري نميتونه انجام بده. اما همون طور كه قبلا گفتم ميشه اين كد رو به فايل exe مورد نظر Append كرد.(لبته به دور از چشم Antivirus چون اجازه اين كارو نميده.دليلش هم كه روشنه)
بعد از اين كار هر وقت كه فايل exe اجرا بشه source خودش رو نشون ميده. كه بازهم احتمالا منظورتون اين نبوده.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

يا اينكه به شكل كه ساده تر هم ميشه نوشت.دليل نوشتن برنامه اول استفاده از HANDLE براي دسترسي به file بود
كه يكي از دوستانم خواسته بود.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

كه فقط اين توضيح رو بدم كه دليل استفاده از tchar.h اينه كه در شكل جديد اصلاح توابع بضي از آرگومان ها از LPCSTR به LPCWSTR تبديل شده كه در صورت استفاده از VC6 ميشه tchar.h و ()T_ رو حذف كرد.
اين برنامه ناقص هست چون Append رو انجام نميده.البته روش هاي زيادي براي دور زدن اين قضيه وجود داره.
خوشحال ميشم بيشتر اين بحث ادامه داشته باشه.موضوع جالبي هست.
ممنون.

sin66x
12-09-2006, 18:48
بله منظور اين نبوده برنامه اجرا شده ممكن است كه اصلا Save نشده باشد! همچنين از فايلها و جريانها نمي تونيم استفاده كنيم
مثالي كه نوشته بود:
int a; //Code
a++; //Code
printf("int a;\na++\n") //Codi ke khodesham badan bayad chap she vali chejuri va oonke gharare khodesho chap kone koja gharare chap beshe?!!!!

سوالب دیگه من اینه چرا وقتی توی Ram دنبال متن برنامه گشتم پیداش نکردم؟!!! انگار تو Ram عادی ذخیره نمی شه!!!
با char far *Var دنبالش گشتم!!

someone
13-09-2006, 00:48
دوباره سلام.
درسته گفته بوديد از stream نبايد استفاده بشه.ولي در مورد يه فايل exe اين موارد وجود دارند.
يه فايل exe از چند قسمت تشكيل ميشه.
1-data Segment
2-code segment
4-stack segment
و فكر ميكنم اگه code Segment بيش از 64KB باشه ادامه اون در Segment ديگه اي قرار ميگيره
به نام Extra Segment . وقتي يك فايل exe در حافظه قرار ميگيره اين الگو ها با آدرسي كه براشون تعريف شده,قابل دسترسي هستند اما به شكل Hex .اگه يه برنامه در حال اجرا رو DEBUG كنيد ميتونيد اين كد ها رو ببينيد. كه مثلا به شكل زير هستند.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در حافظه شما به بيش از اين دسترسي نداريد. براي رسيدن به كد برنامه بايد آدرس هايي كه مربوط به
Code Segment و Data Segment ميشه رو به اصطلاح dump كنيد. هم چنين ميشه يه pointer به main برنامه ايجاد كرد و با افزايش اين pointer اين كار رو انجام داد. كه باز هم decode كردن ميشه. اين كاري هست كه به نظر ميآد شما ميخوايد انجام بديد.
در ضمن خيلي از virus ها همراه خودشون كد hex برنامه رو دارند كه قبلا بحثش رو كرديم ولي نظري نداديد.اينم يكي ديكه از روش ها براي اين كار هست.كه ميتونن با اون الگو خودشون رو تكثير كنن.
با بحثهايي كه داشتيم دو باره اين سوال پيش ميـاد كه:
آيا دنبال الگوريتمي بايد باشيم در كد برنامه كه كار مورد نظر رو انجام بده؟
يا اين كه يه decoder براي اين كار نوشت؟
ممنون.

sin66x
16-09-2006, 08:17
سلام مجدد شرمنده مدتي بود نتونستم بنويسم چون توي راه بودم!
همانطور كه گفتم بايد عين متن چاپ بشه كه Decode كردن اين كار رو نمي كنه و فقط دستوراتي رو كه به زبان ماشين ترجمه ميشن رو مي نويسه تازه بعد هم بايد از اسمبلي به C ترجمه شن! اما برنامه ما بايد حتي Remark ها رو هم چاپ كنه و اگر Space يا Enter اضافه بين دو خط يا كلمه باشه رو دقيقا بنويسه! كلا بايد يه راه C داشته باشه چون همونطور كه گفتم اصلا اين سوال براي كساني بوده كه اسمبلي و زبان ماشين پاس نكردن!!

someone
20-09-2006, 00:13
دوباره سلام.
خيلي جالب شد.ارزش كار كردن رو داره.

mil1243
20-09-2006, 00:22
be in barnameha QUINE migan ke tavanayi chap khodeshoon ro daran
age ebarate QUINE C ro search koni mitooni be natayeje khoobi beresi
man ham ye nemoonasho inja mizaram
mozoo ine ke na bayad az rooye file khoonde beshe ya az rooye ram



/*Yadollahi*/#include<stdio.h>
char*a="int main(){printf(b,34,a,34,10,34,b,34,10,a,10);}";
char*b="/*Yadollahi*/#include<stdio.h>%cchar*a=%c%s%c;%cchar*b=%c%s%c;%c%s%c";
int main(){printf(b,10,34,a,34,10,34,b,34,10,a,10);}



in ham yeki dige

char *f="%c%s%c,"; /******BY: Milad Yadollahi******/
#include <stdio.h>
char*x[]={
"char *f=%c%s%c; /******BY: Milad Yadollahi******/",
"#include <stdio.h>",
"charx[]={",
"},z=0;main(){int n;",
"printf(*x,34,f,34);puts(&z);",
"puts(x[1]);puts(x[2]);",
"for(n=0;n<8;n++)printf(f,34,x[n],34),puts(&z);",
"for(n=3;n<8;n++)puts(x[n]);}",
},z=0;main(){int n;
printf(*x,34,f,34);puts(&z);
puts(x[1]);puts(x[2]);
for(n=0;n<8;n++)printf(f,34,x[n],34),puts(&z);
for(n=3;n<8;n++)puts(x[n]);}

someone
20-09-2006, 00:37
سلام.
واقعا عالي بود "mil1243"
از زيباترين مسائلي هست كه تاحالا ديدم.
همون طور كه "mil1243" گفت ميشه در بارش search كرد.حتما به link زير يه نگاه بكنيد.
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

mil1243
20-09-2006, 21:40
اينم ده ها quine براي c كه برنامه نويسها تو يه مسابقه نوشتن
اگه خواستيد ميتونم بعضي هاش رو توضيح بدم

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]