שאלה | (תכנותית/רברסינג) ghidra

שלום,

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

שאלה טובה תניב תשובה טובה, אבל יכול להיות שגם בגלל שאני לא מבין ב-reveresing אני פספס משהו. ממליץ לך לקרוא, איך לשאול שאלות (אנגלית).

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

האם אתה מחפש לעשות diffing על האסמבלי, המידע הבינארי או הpseudo code?
האם אתה מחפש לממש את כל זה מאפס?
אם אתה מחפש על האסמבלי אתה כנראה תצטרך לכתוב/להשתמש בdisassembler ולהתחיל משם.
בכל אופן כדאי שתפרט כמה שיותר על מה אתה מעוניין לעשות, מה רמת הידע שיש לך כרגע ומה ניסית לעשות עד עכשיו לבד (אם בכלל).

מה שאני מנסה לעשות זה לדעת אם עברו שינויים בתוכנה, למשל באיזה פונקציות.

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

מה שניסיתי זה לחפש אם קיים דבר כזה וכן:

  • r2diff - לא עובד ולא מראה לי את השוני בפונקציות
  • ghidra עובד כמו שצריך אבל איך אני כותב אחד כזה ללא ממשק גרפי?

אני נמצא על סף ייאוש. הקושי הוא לא בשפה, אלא איך להתחיל.
אם יש תותחים בתחום אשמח שתתרמו לנושא.

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

אם אתה מרגיש בנוח בפייתון ויש לך גישה ל idapython אתה לחלוטין יכול לנסות להשתמש בזה במקום למצוא פרויקטים שממשים disassemblers ו parserים, idapython מאפשר לך להשתמש במידע שida הוציאה כבר על הבינארי (פונקציות/קוד אסמבלי/משתנים ועוד) ולעשות איתו פעולות כאלה או אחרות, מניח שGhidra מציע ממשק דומה באמצעות jython/java אז אתה יכול גם לבדוק אותם.

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

idapython tutorials
ghidra scripting

לייק 1

עוד אפשרות (פשוטה ככל שתהיה) היא פשוט לעשות diff על objdump
כמובן, מושלם זה לא יצא אבל לדעתי זה בהחלט cost-effective

3 לייקים

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

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

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

עכשיו לתאכלס, פרוייקטים שמאפשרים לך לעשות disassembly יש הרבה, לא חסר כאלה (תבחר אחד שמתממשק עם שפה שאתה מרגיש איתה בנוח).
בשביל להבין מה זה פונקציה ב assembly קצת יותר טוב הייתי ממליץ לקרוא על call instruction ועל stack frames וכמובן בכללי לדעת assembly :slight_smile:

הסבר מאוד מופשט למה זה פונקציה.

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

במידה ויש שאלות קצת יותר טכניות ופחות כלליות אשמח לעזור!

דוגמא לdisassembler שאתה יכול להשתמש בו (כנראה יש modules לפייתון שנותנים לעשות את זה גם אם אתה מעדיף):
zydis

פרויקטים opensource שמתמקדים בעולמות הreversing שכנראה כוללים disassembler משלהם (לא בדקתי):
radare2
ghidra

פלאגין לida שמאפשר לעשות diff בין פונקציות:
diaphora

לייק 1