PDA

نسخه کامل مشاهده نسخه کامل : تابع Sendmessage_ Api



فاطـمه
21-04-2011, 11:23
سلام
اول امیدوارم جای درستی رو واسه سوالام انتخاب کرده باشم...

چند روزیه کار کردن با توابع api رو تو محیط vb شروع کردم.
بنابراین اگه سوالم ناشیانس شرمنده:5:
با توابع findwindow, sendmessage کار می کردم
با استفاده از تابع sendmessage خواستم متن داخل یه textbox رو بردارم
برا برداشتن متن معمولی مشکلی نداشتم ولی واسه textbox هایی که به صورت پسورد هستن
کدم کار نمیکنه
این تابع:

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

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنیدولی موفق نشدم
خطا نمیده ولی کارم نمی کنه
اگه کسی اطاعاتی داره ممنون میشم راهنمایی کنه

god of war 2
21-04-2011, 17:31
سلام.
کاري که ميخواهيد انجام بدهيد (بدست آوردن متن فيلد هاي پسورد) از چند راه مختلف ميتونه صورت بگيره که تمام آنها از يک روش مشابه استفاده ميکنند و آن تزريق کد به يک پروسه ميباشد.فيلد هاي پسورد معمولا بصورتي در حافظه ذخيره ميشوند که به برنامه هاي ديگر اجازه دسترسي به محتواي خود را نميدهند و به همين علت بدست آوردن مقدار آنها کمي پيچيده تر از بدست آوردن مقدار فيلدهاي معمولي هست.
روش هاي موجود همگي پيچيدگي هاي خودشونو دارند ولي بنده سعي ميکنم بهترين و واضح ترين روش را توضيخ بدم.
متاسفانه زياد با زبان VB6 میانه خوبی ندارم و همينطور هم فعلا به VB6 دسترسي ندارم و حتي نميدونم چيزهايي که ميخواهم بگم در VB6 قابل پياده سازي هست يا نه!اما با توجه به درخواستي که کرديد توضيح ميدم (البته بصورت مختصر) و اميدوارم که متوجه بشويد.(به زبان ++C)
کاري که قراره انجام دهيم اينه که ابتدا يک ساختار داده را در يک پروسه (پروسه اي که مربوط به فيلد پسورد ميشود) کپي ميکنيم این ساختار اطلاعات لازم را نگهداری میکند و سپس کد هایی که برای بدست آوردن این اطلاعات میباشد به پروسه کپی میکنیم و در نهایت آن را اجرا ميکنيم و نتيجه نهايي که همون متن داخل فيلد پسورد هست را بدست مياريم.
پياده سازي ساختار ما به شکل زير است:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در ساختار بالا:
hwnd: این مقدار برابر با hwnd خود پنجر میشود.
fnSendMessage: این یک اشاره گر به تایع SendMessageA در User32 میباشد که پس از طزریق کد از طریق همین تابع اقدام به دریافت مقدار فیلد خواهیم کرد.
psText: بافری که متن فیلد در آن قرار میگیرد.

1- ابتدا يک Handle از پروسه مورد نظر بدست مياريم اين کار توسط تابع OpenProces به شکل زير انجام ميشه.(براي اطلاع از نوع پارامتر ها و توضيحات بيشتر به MSDN مراجعه کنيد)

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

2- سپس حافظه اي را در پروسه مورد نظر براي تزريق کدهايمان توسط تايع VirtualAllocEx معين ميکنيم.(تخصيص حافظه)

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
hProcess برابر با پروسه مورد نظر ما ميباشد.

3- ساختار INJDATA را مقدار دهی و یک کپی از آن را توسط تابع WriteProcessMemory به حافظه تخصیص داده شده طزریق میکنیم.
مقدار دهی ساختار INJDATA:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
hWnd پنجره مورد نظر را انتقال میدهیم و نوع تابع SendMessage را تعیین میکنیم که یونیکد باشد یا اسکی.
تزریق یک کپی از ساختار به حافظه تخصیص یافته:

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

4- حافظه پروسه را دوباره Allocate میکنیم اینبار برای طزریق کد های اجرایی.
تابعی که قرار هست در حافظه پروسه کپی شود به شکل زیر هست.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
nXferred: طول رشته بدست آمده را در خود نگه میدارد که در آخر هم برگردانده میشود.
این تابع توسط خود پروسه اجرا خواهد شد بنابر این دسترسی به مقدار فیلد پسورد امکان پذیر میشود.این تابع توسط فراخوانی تابع SendMessage اقدام به دریافت مقدار فیلد پسورد میکند و سپس آن را در pbText که در ساختار طزریق شده قرار داشت میریزد.
نحوه Allocate و طزریق تابع:

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

5- حالا باید Thread که حاوی کد های ما هست رو توسط تابع CreateRemoteThread اجرا کنیم به شکل زیر:

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

6- منتظر میمانیم تا Thread اجرا شده به پایان برسه برای این منظور میتونیم از تابع WaitForSingleObject استفاده کنیم.به شکل زیر:

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

7- حالا وقت آن شده تا نتایج زحماتمونو (مقدار فیلد پسورد) بدست بیاریم یعنی باید مقدار ساختاری که قبلا طزریق کردیم و توسط تابع طزریق شده پر شده را بخوانیم.برای این کار از دو تابع ReadProcessMemory یا GetExitCodeThread استفاده میکنیم(بنده از تابع ReadProcessMemory استفاده میکنم).به شکل زیر:
ابتدا ساختار را از حافظه میخوانیم سپس با توجه به یونیکد یا اسکی بودن آن آنرا بازیابی میکنیم.

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

در آخر هم باید تمام منابع استفاده شده را آزاد کنید.
کد ها کامل نیستند اما برای این کار هیچ تابع اضافه دیگری استفاده نمیشود و بنده تمام توابع لازم و اصلی را توضیح دادم و فقط سعی کردم نحوه کلی کار را توضیح بدم و از هر تابع برای فهم بهتر یک مثال زدم.
تمام توابع جزئی از API های ویندوز هستند و در VB6 قابل استفاده هستند.
شاید راههای ساده تری هم وجود داشته باشد اما من از آنها مطلع نیستم.
روشی که بنده توضیح دادم یکی از چندین روش CodeInjection هست که یکی از کاربرد های آن را هم بیان میکنه.
امیدوارم متوجه شوید و بدردتان بخورد.
موفق باشید.

فاطـمه
21-04-2011, 18:01
سلام.
کاري که ميخواهيد انجام بدهيد (بدست آوردن متن فيلد هاي پسورد) از چند راه مختلف ميتونه صورت بگيره که تمام آنها از يک روش مشابه استفاده ميکنند و آن تزريق کد به يک پروسه ميباشد.فيلد هاي پسورد معمولا بصورتي در حافظه ذخيره ميشوند که به برنامه هاي ديگر اجازه دسترسي به محتواي خود را نميدهند و به همين علت بدست آوردن مقدار آنها کمي پيچيده تر از بدست آوردن مقدار فيلدهاي معمولي هست.
روش هاي موجود همگي پيچيدگي هاي خودشونو دارند ولي بنده سعي ميکنم بهترين و واضح ترين روش را توضيخ بدم.
متاسفانه زياد با زبان VB6 میانه خوبی ندارم و همينطور هم فعلا به VB6 دسترسي ندارم و حتي نميدونم چيزهايي که ميخواهم بگم در VB6 قابل پياده سازي هست يا نه!اما با توجه به درخواستي که کرديد توضيح ميدم (البته بصورت مختصر) و اميدوارم که متوجه بشويد.(به زبان ++C)
کاري که قراره انجام دهيم اينه که ابتدا يک ساختار داده را در يک پروسه (پروسه اي که مربوط به فيلد پسورد ميشود) کپي ميکنيم این ساختار اطلاعات لازم را نگهداری میکند و سپس کد هایی که برای بدست آوردن این اطلاعات میباشد به پروسه کپی میکنیم و در نهایت آن را اجرا ميکنيم و نتيجه نهايي که همون متن داخل فيلد پسورد هست را بدست مياريم.
پياده سازي ساختار ما به شکل زير است:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنیددر ساختار بالا:
hwnd: این مقدار برابر با hwnd خود پنجر میشود.
fnSendMessage: این یک اشاره گر به تایع SendMessageA در User32 میباشد که پس از طزریق کد از طریق همین تابع اقدام به دریافت مقدار فیلد خواهیم کرد.
psText: بافری که متن فیلد در آن قرار میگیرد.

1- ابتدا يک Handle از پروسه مورد نظر بدست مياريم اين کار توسط تابع OpenProces به شکل زير انجام ميشه.(براي اطلاع از نوع پارامتر ها و توضيحات بيشتر به MSDN مراجعه کنيد)

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید2- سپس حافظه اي را در پروسه مورد نظر براي تزريق کدهايمان توسط تايع VirtualAllocEx معين ميکنيم.(تخصيص حافظه)

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنیدhProcess برابر با پروسه مورد نظر ما ميباشد.

3- ساختار INJDATA را مقدار دهی و یک کپی از آن را توسط تابع WriteProcessMemory به حافظه تخصیص داده شده طزریق میکنیم.
مقدار دهی ساختار INJDATA:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنیدhWnd پنجره مورد نظر را انتقال میدهیم و نوع تابع SendMessage را تعیین میکنیم که یونیکد باشد یا اسکی.
تزریق یک کپی از ساختار به حافظه تخصیص یافته:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید4- حافظه پروسه را دوباره Allocate میکنیم اینبار برای طزریق کد های اجرایی.
تابعی که قرار هست در حافظه پروسه کپی شود به شکل زیر هست.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنیدnXferred: طول رشته بدست آمده را در خود نگه میدارد که در آخر هم برگردانده میشود.
این تابع توسط خود پروسه اجرا خواهد شد بنابر این دسترسی به مقدار فیلد پسورد امکان پذیر میشود.این تابع توسط فراخوانی تابع SendMessage اقدام به دریافت مقدار فیلد پسورد میکند و سپس آن را در pbText که در ساختار طزریق شده قرار داشت میریزد.
نحوه Allocate و طزریق تابع:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید5- حالا باید Thread که حاوی کد های ما هست رو توسط تابع CreateRemoteThread اجرا کنیم به شکل زیر:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید6- منتظر میمانیم تا Thread اجرا شده به پایان برسه برای این منظور میتونیم از تابع WaitForSingleObject استفاده کنیم.به شکل زیر:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید7- حالا وقت آن شده تا نتایج زحماتمونو (مقدار فیلد پسورد) بدست بیاریم یعنی باید مقدار ساختاری که قبلا طزریق کردیم و توسط تابع طزریق شده پر شده را بخوانیم.برای این کار از دو تابع ReadProcessMemory یا GetExitCodeThread استفاده میکنیم(بنده از تابع ReadProcessMemory استفاده میکنم).به شکل زیر:
ابتدا ساختار را از حافظه میخوانیم سپس با توجه به یونیکد یا اسکی بودن آن آنرا بازیابی میکنیم.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنیددر آخر هم باید تمام منابع استفاده شده را آزاد کنید.
کد ها کامل نیستند اما برای این کار هیچ تابع اضافه دیگری استفاده نمیشود و بنده تمام توابع لازم و اصلی را توضیح دادم و فقط سعی کردم نحوه کلی کار را توضیح بدم و از هر تابع برای فهم بهتر یک مثال زدم.
تمام توابع جزئی از API های ویندوز هستند و در VB6 قابل استفاده هستند.
شاید راههای ساده تری هم وجود داشته باشد اما من از آنها مطلع نیستم.
روشی که بنده توضیح دادم یکی از چندین روش CodeInjection هست که یکی از کاربرد های آن را هم بیان میکنه.
امیدوارم متوجه شوید و بدردتان بخورد.
موفق باشید.
ممنون از راهنماییتون
البته هنوز کامل استفاده نکردم ازش
اگه ممکنه کتاب یا منبعی رو واسه مطالعه معرفی کنین ممنون میشم:20:

god of war 2
21-04-2011, 18:41
اگه ممکنه کتاب یا منبعی رو واسه مطالعه معرفی کنین ممنون میشم
اگر منظورتون آشنایی با API هاست که کتابهای زیادی برای آن نوشته شده که میتونید تو همین انجمن هم در بخش کتابهای برنامه نویسی اونهارو مشاهده کنید.
ولی اگر منظورتون آشنایی متود های Injection هست مطالب در نت هست اما بصورت پراکنده و یا ناقص.
کلا از متود های Injection برای اهداف مختلفی (مثل: کرک نرمافزارها - ویروسها - برنامه های Decompiler و ....) استفاده میشه که هرکدام مبحث خاص خودشونو دارند و یادگیری تمام مباحث از این قبیل کار ساده ای نیست.(به علت کمبود منابع و پراکنده بودن منابع)
موفق باشید.