שאלה כללית על תכנות (מתחיל) - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

שאלה כללית על תכנות (מתחיל)


shay360

Recommended Posts

שלום לכולם.

נגעתי פעם קצת בנושא התיכנות בשפות כמו C ו- C++ (כרגע אני יותר בתחום של תיכנות באינטרנט בPHP).

ועכשיו לשאלה שלי.

עד כמה שאני יודע קובץ DLL הוא מעין ספריה שכוללת בתוכה פונקציות שניתן "לטעון" אותן לתוכנית שאני כותב ולהשתמש בהן(תקנו אותי אם אני טועה).

נניח שהורדתי את תוכנה X מהאינטרנט והיא משתמשת בקובץ DLL מסויים.

האם אני יכול לכתוב תוכנה בשפת C או בשפה אחרת ובה להשתמש בפונקציות שקיימות בקובץ הDLL הזה?

בתודה מראש.

קישור לתוכן
שתף באתרים אחרים

בעקרון - כן. אבל לא בהכרח בקלות:

בד"כ דרוש קובץ H אשר יעזור להגדיר איזה פונקציות קיימות ב-DLL (בדיוק כמו קובץ H רגיל של ספריה). בהיעדר הקובץ, כל מה שיש לך זה אוסף של פונקציות אבל אתה לא יודע איזה פרמטרים יש להן ומה הן מחזירות. בהיעדר המידע, כל מה שאתה יכול לעשות זה או לנחש או reverse engineering.

כמו כן בד"כ מספקים גם ספריה סטטית קטנה אשר טוענת את ה-DLL, אבל אתה יכול לעשות את הטעינה הזו בעצמך.

קישור לתוכן
שתף באתרים אחרים

יש מקרים שבהם זה דווקא יותר קל - לדוגמה, אם ה-DLL מכיל קוד שנכתב בשפת דוטנט כלשהי (כגון #C) אז הוא מכיל את כל המידע הדרוש בשביל הגישה אליו, ואז אפשר מתוך ה-visual studio פשוט להוסיף התייחסות לפרוייקט. את כל הקלאסים שמוגדרים בו אפשר לראות ב-object browser.

קישור לתוכן
שתף באתרים אחרים

כן,אין אם זה בעייה ולמעשה אתה עושה את זה בכל תוכנית C שאתה כותב.

(למשל כל קריאה הכי פשוטה ל malloc בסופו של דבר תקרא ל HeapAlloc() של וינדוס שנמצא ב Kernel32.dll)

בתנאי שאתה מכיר את החתימה של הפונקצייה, כלומר איזה פרמטרים היא מצפה לקבל,מה היא מחזירה, וקצת פחות קריטי לעכשיו אז אם אתה לא מבין על מה אני מדבר פשוט תתעלם, הCalling convention אז ניתן לעשות זאת ב2 דרכים:

---- 1 להגדיר ללינקר שלך (כל סביבת עבודה באשר היא, חפש הוראות מתאימות) להוסיף את הקובץ lib הרלוונטי שמגיע עם הDLL, להוסיף את ההגדרות של הפונקציות לפרויקט (בדרך כלל מסופק קובץ H יחד עם הDLL שמכיל את כל הפונקציות שהוא מייצא למתכנת), ואז פשוט לקרוא להן כמו פונקצייה רגילה לחלוטין.

העסק הזה יוצר קישור סטטי בין התוכנה שלך לבין הDLL. כלומר אם הDLL לא קיים, התוכנה שלך לא תעלה.

----- 2 אופצייה קצת יותר מורכבת, אבל עם שימושים מעניינים היא שימוש בLoadLibary() אשר מאפשרת לך לטעון באופן דינמי פונקצייה לפי שם (או אורדינל), ומאיזה DLL, ואתה מקבלת פוינטר למיקום שלה בזיכרון (למעשה,בקריאה הראשונה לLoadLibary שהDLL עדיין לא טעון תתבצע הטעינה למרחב הזיכרון של הEXE) ואז אתה יכול לקרוא לה כמו כל function pointer רגיל. (שים לב שזה מצריך cast ידני לחתימה המתאימה של הפונקצייה, תלמד על function pointers אם אתה לא מבין במה מדובר).

דרך זו מעניקה לך 3 יכולות מעניינות:

א)הטעינה של הDLL היא דינמית,כלומר הEXE שלך עדיין יעבוד אם הDLL לא קיים,ואפילו יוכל לטעון פונקציות בזמן ריצה לפי DLL שהמשתמש בוחר (יעיל מאוד בשביל פלאגינים וadd-ins למינהם - עושים את זה המון ככה)

ב)אתה לא צריך את הlib של הDLL בשביל זה - כלומר זה יעבוד על כל פונקצייה מיוצאת בDLL כל עוד אתה יודע את החתימה שלה (למען האמת, מספיק לדעת כמה בתים צריך לדחוף לה למסחנית, אבל ברגע שאתה מגיע למצב כזה סימן שאתה עושה דברים לא חוקיים במיוחד ::))

ג)אפשר לעשות עם זה דברים מטורפים כמו לטעון פונקציות לתהליך אחר,לגרום להתליך אחר להריץ פונקציות אצלך, להתחקות לDLLים של וינדוס, אבל אלו נושאים מתקדמים שדורשים ידע נרחב מאוד בתכנות .

*כל הנאמר לעיל תקף לגבי DLL native - כלומר שנכתבו ב C \ C++.

קישור לתוכן
שתף באתרים אחרים

האמ...

תודה רבה לכולכם על המידע.

בעיקרון מה שתיכננתי לבדוק הוא האפשרות להשתמש בשירות שליחת SMS של (לא דרך התוכנה הרגילה כמובן- אולי דרך commend line או דרך סקריפט PHP וכו').

השתמשתי בפרוסס מוניטור והגעתי למסקנה שהשליחה מתבצעת בעזרת (פונקציה כנראה) שנמצאת בקובץ DLL מסויים תחת ספריית הICQ.

בכל מקרה ממה שהבנתי פה זה לא ממש אפשרי / לא ממש חוקי...

ניסיתי גם להוריד את קוד המקור של Licq אבל טבעתי במרחבי הקוד.

תודה רבה בכל מקרה :)

קישור לתוכן
שתף באתרים אחרים

אין לי מושג אם זה לא חוקי, אני חושב ש-Moonblade דיבר בצחוק. האם שימוש ב-DLL שמותקן לך במחשב הוא לא חוקי? נראה לי מוזר.

אני מאמין שזה משהו תלוי רישיון תוכנה,אחרי הכל זה פעולה שהיא בגדר development ולא end-user operation.

בכל מקרה,לטעון פונקציות דינמית בלי לדעת את החתימה שלהם (בלי לקבל H מהיצרן) מעלה לי בראש קונטצייה של פריצה ושימוש לא חוקי ::).

ולגבי הקטע עם הICQ, זה אפשרי - אבל תצטרך או למצוא את החתימה של הפונקצייה באינטרנט (יכול להיות שזה מפורסם איפשהו,אפילו באופן רשמי) או לבצע לא מעט reverse engineering בשביל להבין איך הפונקצייה עובדת,איזה פרמטרים היא מצפה לקבל,מה היא מחזירה,וכו' (כל הקטע של הנדוס לאחור זה כמובן נושא מאוד גדול ומורכב בפני עצמו, אני לא הולך להכנס לזה כי זה סוטה מהדיון, רק אזכיר שהדבר אפשרי ונעשה כבר בעבר :P)

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...