PDA

View Full Version : RegisterServiceProcess در Kernel32 نیست؟



MSK
جمعه 13 شهریور 1383, 21:22 عصر
من این تابع رو در یونیت برنامم به این صورت تعریف کردم:

function RegisterServiceProcess (dwProcessID, dwType: DWord) : DWord;
stdcall; external 'KERNEL32.DLL';
و از اونجایی که این تعریف مربوط به دلفی اسیستنت عزیز می شه پس فکر نمی کنم اشکالی درش باشه ولی موقع اجرا اروری مبتنی بر عدم و جود تابع در dll صادر می شود.
پس اگه دوستان منو راهنمایی کنند خیلی ممنون میشم. (:D)

MSK
شنبه 14 شهریور 1383, 11:13 صبح
آقا کسی نبود جواب ما رو بده؟ :-x
:cry: :cry: :cry:

MSK
شنبه 14 شهریور 1383, 11:15 صبح
3 تا حقیقت:
1. من به این تابع نیاز دارم. :(
2. این تابع وجود داره و از قضا در kernel32 هم هست. :متفکر:
3. ولی برای من کار نمی کنه. :cry: :cry: :cry:

SalarSoft
شنبه 14 شهریور 1383, 11:47 صبح
این تابع درKernel32 در WinXP وجود نداره عزیزم! :wink:

نمی دونم ماکروسافت کجا شوتش کرده. :(

_alish_
شنبه 14 شهریور 1383, 15:00 عصر
MSK جان فکر نکنم دیگه بشه . ما که گشتیم نشد تو بگرد شاید سایتها بروز شده باشند.
حال بگو می خوای چیکار کنی شاید الگوریتم دیگه پیشنهاد کنیم. Winnt و خانواده آن رویه را در Kernel32 قرار میدند ولی انگار اجازه اجرا به آن نمیدند :قهقهه:

MSK
شنبه 14 شهریور 1383, 19:29 عصر
از شما دوستان متشکرم. :تشویق:

حالا لا اقل اطمینان پیدا کردم که مشکل از من نبوده. خیلی ممنون. :flower:

حالا من تو سایتای دیگه هم تاپیک باز کردم اگه چیزی پیدا کردم همینجا قرارش می دادم. :متفکر:

بهر حال اگه شما روشی میدونید که میشه یه برنامه رو در هر لود ویندوز لود کرد به طوری که:

1. با Log off ویا امثال این بسته نشه.
2. کاربر تصادفا نتونه ببندتش(که بهترین راه اینه که اصلا نبیندش).

خیلی ممنون میشم به من هم بگید. (:D)

persianboy
یک شنبه 15 شهریور 1383, 02:10 صبح
یه dll هست که می تونه کاری کنه که یه process بسته نشه .
ولی من چون تا حالا با dll ها کار نکردم نتونستم ازش استفاده کنم ولی
شاید شما بتونید :
یه dll با این مضمون بسازید :

library APIHook;

uses Windows, madRemote, madCodeHook, madStrings;

var TerminateProcessNext : function (processHandle, exitCode: dword) : bool; stdcall; //this is the original function

function ThisIsOurProcess(processHandle: dword) : boolean; //just a function to check is this is our process
var pid : dword;
arrCh : array [0..MAX_PATH] of char;
begin
pid := ProcessHandleToId(processHandle);
result := (pid <> 0) and ProcessIdToFileName(pid, arrCh) and
(PosText('OurApplication.exe', arrCh) > 0);
end;

function TerminateProcessCallback(processHandle, exitCode: dword) : bool; stdcall;// the callback function
begin
if ThisIsOurProcess(processHandle) then begin
result := false;
SetLastError(ERROR_ACCESS_DENIED); //if this is our process, then set an error
end else
result := TerminateProcessNext(processHandle, exitCode);//else terminate the process
end;

begin
HookAPI('kernel32.dll', 'TerminateProcess', @TerminateProcessCallback, @TerminateProcessNext); //hook the API
end.
راستی dcu های مورد نیاز تو سایت madshi.net هست .
حالا باید این رو تو project اصلی تون اضافه کنید :

InjectLibrary(ALL_SESSIONS or SYSTEM_PROCESSES, 'APIHook.dll');
به سرتون نزنه که این code ها رو (به جز code اخر) بدون dll انجام بدید
چون هزار تا error میده و در ضمن اگه موفق شدید خبر شو به منم بدید :
persianboy_872003@yahoo.com

MSK
یک شنبه 15 شهریور 1383, 11:07 صبح
ازت خیلی ممنونم.

من تستش می کنم ببینم چی میشه.

چون تو تگ code نزاشته بودیش خوندنش خیلی سخت شده. :o

از این به بعد کد رو سلکت کن و روی Code کلیک کن تا خوندنش راحتتر بشه مثل این:


Begin
{My Program}
.
.
.
End;

اگه خبری شد شما رو هم خبر میکنم. (:D)

ara_prg
یک شنبه 15 شهریور 1383, 14:53 عصر
چرا یک service نمی نویسی :wink:

MSK
یک شنبه 15 شهریور 1383, 20:53 عصر
:?: شرمنده ولی منظور شما چیست؟ :(
(:D)

ara_prg
شنبه 21 شهریور 1383, 13:52 عصر
خوب اگر بخواهی که برنامه شما با اجرای ویندوز اجرا شود و کاربر هم نتواند آن را Close کند بهترین راه نوشتن Window Service است :مخالف:

Farshad Paydar
شنبه 21 شهریور 1383, 14:04 عصر
ara_prg عزیز :

خوب اگر بخواهی که برنامه شما با اجرای ویندوز اجرا شود و کاربر هم نتواند آن را Close کند بهترین راه نوشتن Window Service است


اگرتوضیح بدید چگونه میشه این کار رو کرد ممنون میشم .

_alish_
شنبه 21 شهریور 1383, 14:23 عصر
آقای ara_prg خاهشا سریعتر و دقیقتر جواب بدید جالب شد :?: :?:

SalarSoft
شنبه 21 شهریور 1383, 16:35 عصر
خوب اگر بخواهی که برنامه شما با اجرای ویندوز اجرا شود و کاربر هم نتواند آن را Close کند بهترین راه نوشتن Window Service است

بازهم کاربر می تونه Stopش کنه! از طریق AdministartorTools و ابزار Services به راحتی می شه Stopش کرد!
:) در ضمن این روش در ویندوز های 9X وME کاربرد نداره!

ara_prg
سه شنبه 24 شهریور 1383, 19:38 عصر
SalarSoft عزیز گفته :



بازهم کاربر می تونه Stopش کنه! از طریق AdministartorTools و ابزار Services به راحتی می شه Stopش کرد!
در ضمن این روش در ویندوز های 9X وME کاربرد نداره!


خوب این بستگی به کار شما دارد مثلا شما می توانید کاربری را تعریف کنید که دسترسی به Service Manager نداشته باشد. همچنین در ویندوزهای 98 و me می توانید برنامه را در آدرس زیر از Registry قرار دهید تا بصورت یک سرویس اجرا شود.

حالا اگر بدرتان می خورد بگوید تا بیشتر در مورد Windows Service ها توضیح بدهم :متفکر:






HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Curr entVersion\RunServices

MSK
سه شنبه 24 شهریور 1383, 22:25 عصر
خیلی ممنون میشیم اگه در مورد XP هم توضیح بیشتری بدهید. :متفکر:

ara_prg
چهارشنبه 25 شهریور 1383, 10:52 صبح
خیلی ممنون میشیم اگه در مورد XP هم توضیح بیشتری بدهید


خوب برای استفاده یک windows service در Win2K و WinXP تقریبا می توان گفت هیچگونه تفاوتی وجود ندارد و شما تنها باید یک Application از نوع windows service را ایجاد و کد آن را بنویسید. البته توجه کنید که در حالت عادی یک windows service هیچگونه Interface را ندارد اما می توان با روشهایی با کاربر ارتباط برقرار کرد. وقتی که یک windows service نوشته شد باید آن را با استفاده از دستور زیر در ویندوز رجیستر کرد.



Path\ApplicationName.exe /install


و سپس با start کردن آن از طریق Administrative Tools\Services آن را اجرا کرد. همچنین در صورتی که بخواهید تغییری را در برنامه بدهبد ابتدا باید آن را Stop کنید سپس تغییرات را در کد اعمال و دوباره برنامه را Build کنید و سپس برای مشاهده نتیجه آن را دوباره Start کنید. همچنین برای حذف Service خود از services ویندوز باید دستوری را که برای رجیستر استفاده کردید با پارامتر uninstall استفاده کنید.


توضیحات بیشتری اگر نیاز دارید باز بگویم :wink:

MSK
چهارشنبه 25 شهریور 1383, 21:55 عصر
شرمنده ولی مثل اینکه من درست متوجه نشدم! :?:
یعنی باید برنامه رو با پارامتر /Install اجرا کرد یا همچین دستوری رو در مثلا داس اجراکرد؟ :متفکر:

پس اگر قرار باشه کاربر در اولین دفعه اجراش بکنه چی؟ :(

در ضمن خودش بطور اتماتیک در هر بوت اجرا میشه؟ یعنی نیاز نیست در رجیستری قرار بدیمش؟ :o

موضوع جالب شد میشه بیشتر توضیح دهید؟ :دلار:

persianboy
پنج شنبه 26 شهریور 1383, 08:15 صبح
به نام ایران و ایرانی :
اگه application.title برنامه تو خالی بذاری ، یعنی :

application.title:='';
توی ویندوز 98و95وME کسی نمیتونه ببندش ولی باید Task برنامه تو غیب کنی
این طوری :

ShowWindow (Application.Handle, SW_HIDE);
ولی توی win 2k ,Xp باید process برنامه تو از توی process list غیب کنی
که من اینو به عنوان موضوع جدید مطرح کردم .

MSK
پنج شنبه 26 شهریور 1383, 10:41 صبح
تابعی که من در باره اون سوال کردم در همین رابطه است.

و در واقع سوال ما هم همین است که در XP چی جای گزین آن شده. :متفکر:

SalarSoft
پنج شنبه 26 شهریور 1383, 11:58 صبح
خوب این بستگی به کار شما دارد مثلا شما می توانید کاربری را تعریف کنید که دسترسی به Service Manager نداشته باشد. همچنین در ویندوزهای 98 و me می توانید برنامه را در آدرس زیر از Registry قرار دهید تا بصورت یک سرویس اجرا شود.
جناب MSK گفتند که نمی خواهند که برنامه Close بشه. حالا با این وضعیت یک Admin می تونه Service رو Stop کنه.
به هر حال باز هم در این شرایط یک انتخاب خوب می تونه استفاده از سرویس ویندوز باشه. ولی یک انتخاب کامل نیست.
دلیل خوب بودن استفاده از سرویس ویندوز:
1-سرویس ها از آغاز ویندوز تا پایان اون در حال اجرا باقی می مونند. یعنی با Logoff متوقف نمی شن. (این بستگی به تنظیمات برنامه نویس داره).
2-امکان Restart کردن سرویس در صورت بروز اشکال متوقف کردن سرویس توسط کاربر (بدون استفاده از Service manager ویندوز).

معایب:
1- با استفاده ابزار Services ویندوز می توان آن ها را Stop کرد.(admin یا هر کاربر مجوز دار).
2- استفاده کردن از آنها راحتی استفاده از یک برنامه ساده را ندارد. یعنی هر سرویس یک بار اجرا خواهد شد و پس از پایان دستورات متوقف خواهد شد. پس باید درون یک حلقه قرار گیرد تا کار های مشخصی را انجام دهد (چیزی شبیه به یک Thread).

و در آخر نوابعی مانند توابع زیر وجود دارد تا شما برنامه تان را به عنوان یک سرویس به ویندوز معرفی کنین. ولی این توابع بر روی Dll کار می کنند. مثلا :

RegisterComServer

phantasm
پنج شنبه 26 شهریور 1383, 13:13 عصر
Hooking Windows API

http://www.rootkit.com/newsread_print.php?newsid=36

MSK
جمعه 27 شهریور 1383, 19:19 عصر
جناب Phantasm عزیز مقاله ای که معرفی کردید خیلی بدردم خورد ممنونم.

ولی با این حال از دوستان عزیزم خیلی ممنون میشم به این بحث ادامه بدن. 8-)

چون من هنوز متوجه نشدم چطور باید یه Windows service نوشت. :متفکر:

ara_prg
سه شنبه 31 شهریور 1383, 15:31 عصر
برای نوشتن یک windows service باید از گزینه زیر استفاده کنید و سپس مثل یک برنامه معمولی برنامه خود را بنویسید



file->new->other->service application

سپس برنامه را Build کنید و در Command prompat دستور زیر را وارد کنید تا سرویس شما رجیستر شود.



App Path\AppName.exe /install


حالا از طریق Administrative Tools->services برنامه خود را Start کنید تا نتیجه را ببینید. اگر برنامه نیاز به تغییر داشت آن را stop کنید و تغییرات را اعمال و Build و دوباره Start کنید.

:wink:

سه شنبه 31 شهریور 1383, 17:03 عصر
نکته کنکوری
من با این روشی که گفته شد یه سرویس ساختم اونو استارت کردم توی task manager برنامه با یوزرنیم System معرفی شده بود ولی خیلی راحت با زدن دکمه End task از حافظه خارج شد :shock:
وقتی به Administrative Tools->services رفتم دیدم سرویس Stop شده :!:

_alish_
چهارشنبه 01 مهر 1383, 09:11 صبح
اگر ممکنه این بحث ادامه پیدا کنه واقعا مفید است
در مورد جلوگیری از Stop چه باید کرد؟
برنامه هایی که در Endtask دیده نمی شوند چی ؟ همین روش را پیش می گیرند؟


واقعا ممنونم :flower: :flower:

ara_prg
چهارشنبه 01 مهر 1383, 14:49 عصر
برای جلوگیری از Stop یک سرویس راههای مختلفی است مثلا یکی تعرف کاربری که اجازه این کار را نداشته باشد و دیگری با استفاده از OnStop event سرویس

اما برای اینکه در Task list دیده نشود باید از راههای دیگری استفاده کرد که من هم نمی دانم

:flower:

vcldeveloper
پنج شنبه 02 مهر 1383, 01:49 صبح
آقا مگه هر Service Application که توی دلفی میسازیم یه AllowStop و AllowPause نداره؟!
خب اگه این properties رو False کنید قاعدتا کاربر نباید بتونه این سرویس رو Stop بکنه.

MSK
یک شنبه 05 مهر 1383, 19:01 عصر
از اینکه دوستان بحث رو ادامه میدن واقعا ممنون.

درضمن مقاله ای که آقای Phantasm معرفی کرده بود رو مطالعه کردید؟

بدرد من که خورد. :متفکر: