reflection

שיווקי

New member
reflection

אני רוצה להשתמש בreflection כדי להפעיל מתודות של אובייקטים בתוכנה חיצונית אחרת. בc#.
האם כל אובייקט חושף את המתודות ו/או properties כך שאני יכול להשתמש בהם בreflection.
כן אני צריך לדעת את שם הassembly הקשור לאובייקט. אני מכיר את הdependency walker אך כזכור לי זה היה חלק מהvisual studio ומה שמצאתישעולה בגוגל ראשון זה קוד נאוד ישן ואני לא בטוח שתומך ב64 ביט. גם לא חושף אובייקטים ולא ברור איך אני מחפש מתודה או property ספציפי.
אשמח לקצת אוריינטציה בנושא.
קוד בc# שמשתמש בreflection אני מכיר.

תודה.
 

nocgod

New member
נשבע לך שניסיתי...לא הבנתי מה שאלת

הבנתי שאתה רוצה לעשות reflection לאיזה משהו שלא נמצא בתוכנית שלך.
לפי הבנתי (ככה זה לפחות בג'אווה) באמצעות reflection אפשר לעשות hack ולקרוא למתודות פרטיות אפילו (אני קראתי לבנאי פרטי...)

לא הבנתי את השאלה שלך לגמרי...
 

שיווקי

New member
הסבר

הנושא לא כל כך מוכר ושכיח, כך שאני מעריך הרמת גבה זו או אחרת ...

בC# כדי לזהות מתודות אני צריך את הassem bly. כוונתי שצריך את שם הd ll הקשור.
לא כל האובייקטים נמצאים בsy stem3 2 של win dows. אלו שכן בדרך כלל לא צריך לספק את שם הdl l הקשור, אך באובייקטים שפותחו מחוץ למערכת הפעלה והם לא בקוד שלך - צריך מושג קלוש שהוא מראה לך איזה dll קשור לאובייקט.
ואיך אפשר לחפש את הd ll - על ידי תוכניות כמו dependency walker.
Dependenc ywalker זוהי תוכנית שנכתבה לפני שנים. אני לא ממש מצליח להבין אותה ואם יש משהו מובנה בvis ual stu dio זה עדיף.
אם יש הגבלה בdepenencywa lker לקוד 64b it גם חלופות זה בסדר.
למשל - דבר בסיסי, זה לחפש מתודה מאוד מסויימת (או אובייקט, שלא ראיתי רשימה של אובייקטים) ברשימה של איזה 20 dl ls עם לא מעט מתודות.
זה לא צריך להיות משהו סיזיפי. הכלי של dependen cyWalker (או חלופות דומות) אמור לעשות כן.
הורדתי dependen cyWalker מהאפשרות הראשונה שראיתי בחיפוש בגוגל.

אשמח לקצת אוריינטציה בנושא. קוד בc# אך זה אני מכיר. יותר רלוונטי לגבי זה ההתייחסות לdepenencyw alker
(אגב, בכוונה שמתי רווחים בחלק מהמילים, בשל באג בתפוז. לא להתייחס לרווחים).

תודה.
 

BravoMan

Active member
dependecy walker לא בנוי לזה.

ניתן להשיג אותו ללא VS, כי הוא לא פותח ע"י MS, רק שולב על ידה בחבילה:
http://www.dependencywalker.com

אבל הוא רק יודע להציג קבצי DLL שמקושרים לקובץ EXE (או DLL) מסוים, ואת הפונקציות שאותו קובץ מייבא או מייצא.
זה מידע שמתייחס לקוד native לא ל-bytecode של NET.

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

אני לא מכיר כלים לזה עבור #C, אבל אם הצורה המקומפלת שלה דומה ל-bytecode של Java זה צריך להיות עניין די פשוט.
גגל C# Dissassembler ובטח תמצא את מה שאתה צריך.
 

שיווקי

New member
הבנת נכון.

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

כיום נהוג לחשוף את כל ה-method-ות, וכך מייקרוסופט מעודדת (נראה לי שזה נעשה אוטומטית בעת שמגדירים property בקוד. לגבי מתודות - לא ברור לי, אך כנראה זה משהו שנעשה אוטומטית בעת שמגדירים מתודות ב-oop, כך שזה דיי שכיח שכן אמצא פתרונות).

הייתי בטוח ש-dependency walker בתוך ה-vs, רק לא יודע איפה.
בכל מקרה, זה אכן, לא נראה מתאים - בהסתכלות ראשונית הבחנתי שאין בכלל משמעות לשמות class-ים, ואוששת את הנחתי בנושא.
אני צריך משהו שגם חושף את האובייקטים.
אני אבדוק את ההמלצה שלך לגבי C# disassembler ואנסה למצוא כלים נוספים (אך זה המון ניסוי וטעייה, ואם יש למישהו ניסיון בנושא - אשמח ללמוד).

תודה.
 

BravoMan

Active member
מיקום הקוד לא משנה:

כשמקמפלים Java, ולא משנה אם זה בחבילה של Oracle או ביישום Hello World של קורס שנה א', שמות המחלקות, המתודות והאיברים נשמרים, יחד עם הפרמטרים שלהם וכו'.

בסופו של יום, bytecode של Java, במידה ולא עבר אובפוסקציה מיוחדת, די קל לפענוח (בהשוואה ל-assembly שנוצר משפות כמו C ו++C)

אני לא בטוח, אבל אני חושב שזה תקף גם לשפות NET.
כמובן, שאם מדובר במוצר של MS, ייתכן שהוא עבר אובפוסקציה כדי למנוע בדיוק את מה שאתה רוצה לעשות.

השאלה האמתית היא - למה אין לדבר הזה תיעוד?
אולי יש סיבות טובות למה אתה לא אמור להשתמש בזה?
 

nocgod

New member
לא בטוח עד כמה הדבר שאתה עושה חוקי

או מורשה על ידי מיקרוסופט
אבל
כל שפות דוטנט למיניהן בדיוק כמו ג'אווה מתקפלות לשפת ביניים (MSIL או CIL) ומקומפלות בזמן ריצה בשיטת JIT בדיוק כמו ג'אווה
לא נהוג לחשוף את כל המתודות, בחיים לא יהיה נהוג לחשוף את כל המתודות כי זה נוגד את עקרונות ה OOP
לא נהוג לחשוף את כל הproperties או לא נהוג לחשוף את כל חלקי הפרופרטי (נניח נוח מאוד ש set יהיה פרטי עבור פרופרטי שהוא לצורך העניין מציין אורך)
אתה יכול למצוא דרך לנסות לעשות disassemble לקוד של הDLL אם הוא כתוב בדוטנט, קח בחשבון שמקומות שאין לחטט בהם כנראה עברו שלב של obfuscation כדי שלא יחטטו בהם
 

שיווקי

New member
אפשר לרדת לרמות פשוטות יותר.

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

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

בכל מקרה, אפילו קצה של חוט, לבדוק אם בכלל זה אפשרי עבור חלק מהאובייקטים - משהו בהחלט יכול לעזור.

דוגמה ספציפית, ואשמח לדעת אם יש דוגמה מעשית, איך לממש זאת (זה נראה כמו לכתוב וירוס, אך זה בהחלט לא משהו זדוני):
אני רוצה "להתלבש" על חלון של הדפסה של windows, ולשכתב את ה-oninit שלו, שבמקרים מאוד מסויימים, יסגור את החלון שקרא לו (ה-parent) כשהחלון של ההדפסה נסגר - אם יש דוגמה איך לעשות זאת, אשמח.
(יש חלופות אחרות. במידה והתבצע obfuscaction ...)
 

BravoMan

Active member
אתה עושה כאן סלט לא קטן!

אין שום קשר בין משחק עם חלונות של יישומים אחרים, לבין גישה עם reflection לקוד כלשהו.

Windows לא כתובה ב-#C מתחת למכסה המנועה.

את מה שאתה מתאר אפשר (או לפחות היה אפשר, אני לא בטוח אלו שינויי ארכיטקטורה יש ב-Windows 8) לעשות עם Win32 API בהנחה שליישום שלך יש הרשאות מתאימות (ב-XP זה היה הכי פשוט, מאז Vista קצת יותר מסובך).

אין לי מושג אם אפשר לעשות את זה מ-#C, אולי דרך קריאה לפונקציות Native (שכחתי איך קוראים לזה, אבל יש איזו דרך לקרוא מ-#C ל-Win32 API).

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

אתה באמת מנסה להשתרבב לתוך מערך ההדפסה של Windows?
על איזה יישום אתה מנסה להשפיע?
מה היא באמת המטרה?

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

ואז אולי אפשר יהיה לכוון אותך לאן שאתה באמת צריך להגיע.
 

שיווקי

New member
בפתרון לבעיה מסויימת צריך מספר דברים

אסביר את הבעיה.
אני צריך להדפעס פעם אחת ויחידה מסמך.

המסמך נמצא במסך viewer שאפשר ממנו להדפיס מספר פעמים.
פתרון פשוט הוא לנעול את השדה של כמויות עותקים וכן בסיום הדפסה לסגור את המסך המקדים.
הבעיה העיקרית שאין לי את הsource של חלון ההדפסה כי הוא של windows וגם אין לי את חלק הקוד שבאמצעותו אני מדפיס.
רק את הhandle של החלון המוקדם.
אין הרבה פתרונות אם אין קוד
זוהי הסיבה שפתחתי את השרשור.

הרבה דברים לא ידעתי עד היום כך שהיה לי קשה למקד את שאלתי.

פיתרון אפשרי הוא וכיוון שחלון הדפסה הוא חלון פנימי ולא נראה בtaskbar
1. לבצע hook על המסך המקדים ובו בעת לסרוק את כל האלמנטים של המסך.
2. מציאת החלון של ההדפסה. במידה ונמצא לשכתב את האלמנטים הרצויים כפי שנדרשתי. זאת בreflection
3. לסגור את המסך המקדים
 

שיווקי

New member
לסיכום

אסביר את הבעיה.
אני צריך להדפעס פעם אחת ויחידה מסמך.

המסמך נמצא במסך viewer שאפשר ממנו להדפיס מספר פעמים.
פתרון פשוט הוא לנעול את השדה של כמויות עותקים וכן בסיום הדפסה לסגור את המסך המקדים.
הבעיה העיקרית שאין לי את הsource של חלון ההדפסה כי הוא של windows וגם אין לי את חלק הקוד שבאמצעותו אני מדפיס.
רק את הhandle של החלון המוקדם.
אין הרבה פתרונות אם אין קוד
זוהי הסיבה שפתחתי את השרשור.

הרבה דברים לא ידעתי עד היום כך שהיה לי קשה למקד את שאלתי.

פיתרון אפשרי הוא וכיוון שחלון הדפסה הוא חלון פנימי ולא נראה בtaskbar
1. לבצע hook על המסך המקדים ובו בעת לסרוק את כל האלמנטים של המסך.
2. מציאת החלון של ההדפסה. במידה ונמצא לשכתב את האלמנטים הרצויים כפי שנדרשתי. זאת בreflection
3. לסגור את המסך המקדים. זאת באמצעות hook על חלון ההדפסה.
 

BravoMan

Active member
אתה מנסה לממש סוג של DRM?

הגנה על מסמך מפני יצירת עותקים?

אם כן, לא הייתי בוחר בדרך הזו. אני צופה יותר מידי בעיות איתה.

כעיקרון, כדי לכפות סגירת חלון לא צריך hook, מספיק לשלוח WM_CLOSE לחלון, זאת בהנחה כמובן שהקוד שמטפל ב-messages שלו לא מציג למשתמש איזה דיאלוג אישור לפני סגירה.

"חלון ההדפסה", יכול להיות גם דיאלוג סטנדרטי של המערכת.
זה אחד השירותים שהיא מספקת לכותבי יישומים.
קרא עליו כאן:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646954(v=vs.85).aspx

אם זה אכן מה שה-Viewer משתמש בו, יהיה לך קשה לדעת לפי המזהים הרגילים (Window name + Class name, לא להתבלבל בין Class של חלון למחלקה ב-#C, אין קשר בניהם), שמדובר בחלון הדפסה של ה-Viewer שלך, ולא של תוכנה אחרת, ואני מניח שאתה לא מעוניין לדפוק למשתמש הדפסה במקומות אחרים.

הופעה של חלון ב-Taskbar אינה קשורה ליכולות של SendMessage או HookWindowProc לטפל בו.

כלי אחד שיעזור לך לאבחן חלונות הוא ++Spy.
הוא מגיע עם VS ונועד לאפשר בחינה של היררכיית החלונות במערכת.

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

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

שיווקי

New member
Wm_close זה לא מילת הקסם

זה לא שלא חשבתי על כך.
הפעלה של חלון א שאין לי את הקוד שלו מלבד handle וזוהי עובדה שאני לא יכול לשנות וזאת מחלון אחר ב שאין לי את הקוד שלו וגם הוא לא מופיע כחלון בtask manager (לא task bar. פשוט סיוט לשלוח הודעות בipad דרך תפוז. אני לא עושה הגהה. בסך הכל חלון א הוא אב של ב). זה גם מקרה קלאסי לפיתרון.
בכל מקרה ראיתי את התשובות בפורום גם אם הבעיה והפיתרון נראים הזויים.
נראה שאסתדר מכאן....

תודה, בכל אופן.
 

BravoMan

Active member
handle של חלון זה כל מה שצריך כדי לשלוח לו

הודעות.
אתה לא צריך את "הקוד שלו", מה גם שלחלון אין "קוד" אלא פרוצדורת callback שיכולה לקרואה לכל עולם ואחותו על הדרך, מה שאומר ש-"קוד של חלון" משמעותו יכולה להיות גם כל התוכנה.

אבל אם הסתדרת, אז הכל טוב!
 
ומה ימנע מהמשתמש שלך לקחת את המסמך למחשב אחר ולהדפיס אותו שם? לשלוח אותו במייל? להעלות אותו ל dropbox?

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

והן SendMessage, SetWindowHookEx.
מה שאתה רוצה לעשות לא יעבוד, אז חסוך לך זמן ועבור לשחק עם משהו אחר.
 

שיווקי

New member
תודה, אני אבחן זאת.

אגב, האובייקט הוא נמצא ב-exe שמפעיל את ה-dll.
וזה לא היה בעיה למצוא את ה-type הקשור.
השתמשתי ב:

Assembly asm = Assembly.GetEntryAssembly(); // Name of the exe file.
Type t = asm.GetType("MyNameSpace.MyClass");

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

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

תודה.
 

שיווקי

New member
או קיי
תודה.

יש לי Visual Studio מותקן.

הבנתי לבסוף שהכלי המסופק עם Visual Studio נקרא IL Disassembler.
טרם בחנתי את easyHook לעומת IL Disassembler.
במה easyhook יעיל יותר?

תודה.
 
למעלה