בדיקה האם עליתי על עצמי

עמוד
מוצגות 9 תגובות – 1 עד 9 (מתוך 9 סה״כ)
  • מאת
    תגובות
  • #83287
    awesomblly
    משתתף

    בניתי קוד פשוט, ורציתי לבצע בדיקה האם האוגר bx נמצא על ax אם כן ידלג עליו, אך זה לא עובד לי.
    הנה הקטע קוד שאמור לבדוק.
    bomb:
    add bx, 1
    cmp bx, ax
    je bomb
    mov [bx], ax

    jmp bomb

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

    • הדיון הזה עודכן לפני 8 שנים, 9 חודשים ע״יawesomblly.
    #83290
    cgx
    מנחה

    אתה יכול לדרוס את עצמך גם, למשל, בכתובת
    bx+1

    #83291
    adi
    משתתף

    כמו שנאמר, על מנת שלא תדרוס את עצמך באף כתובת ניתן לעשות משהו כמו זה:
    mov dx,0xcccc
    @bomb:
    inc bx
    cmp bx,ax
    jnz @skip
    add bx,@codeEnd
    @skip:
    mov [bx],dx
    jmp @bomb
    @codeEnd:
    ——————————————————————
    לגבי לא להרוג גם את השורד שאיתך, האופציות האפשריות הן לשמור את המיקום שלו ברגיסטר נוסף ולבדוק גם את הערך שלו. אופציה נוספת זה שתריץ את שניהם מאותו המיקום אך תקח בחשבון שזה לא בהכרח הדבר שאתה רוצה משיקולים אסטרטגיים..
    מקווה שעזרתי 🙂

    #83293
    awesomblly
    משתתף

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

    #83294
    Idan Dor
    משתתף

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

    אתה יכול להזיז את השחקן שלך לכל מקום שאתה רוצה (לדוגמא עם jmp bx) אבל אתה צריך לדאוג שיהיה שם קוד להריץ. המנוע (ומהמחשב) תמיד מריץ את הפקודה שרשומה במיקום IP בזיכרון (הכתובת המלאה היא CS:IP אבל זה לא משנה כרגע) אם דאגת לשים שם קוד שעושה משהו אז אין בעיה והוא ירוץ לאחר שתקפוץ לשם, אם לא כתבת שם קוד אז המנוע יגרום לך להריץ את מה שרשום שם וכנראה תמות בגלל פקודה לא חוקית.
    מרבית השורדים מזיזים את עצמם כל הזמן וכותבים את הקוד שלהם מחדש כל פעם.

    עידן.

    #83295
    awesomblly
    משתתף

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

    #83296
    Idan Dor
    משתתף

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

    base_jump_length = 0x0a00
    jump_length = -(base_jump_length)


    @Start
    :
    add ax, @ZombieCodeAndJump – @Start
    mov si, ax
    push ax
    mov ax, 0xa4a4
    mov dx, 0xa4a4
    int 0x86
    mov cx, @End – @ZombieCodeAndJump
    rep movsw

    pop ax
    push ds
    push es
    pop ds
    pop es
    mov di, ax
    xor si, si
    movsb

    @ZombieCodeAndJump:
    movsw
    movsw
    movsw
    movsw
    movsw
    movsw
    movsw
    add di,jump_length
    movsw
    db 0xE9
    dw jump_length
    movsw
    xor si,si
    movsb
    @End:

    הקוד עושה את הדברים הבאים:
    כותב בעזרת int86 את הפקודה movsb לזיכרון המשותף (סגמנט ES) הרבה פעמים (256).
    לאחר ההפצצה הזאתי הוא מעתיק קוד קפיצה (בעזרת rep movsw) לאחר מה שהוא כתב קודם.
    מחליף את הסגמנטים ES ו DS כך שעכשיו movsw ו movsb מעתיקים מהסגמנט המשותף אל הזירה ולא להפך.
    מתחיל להעתיק את הקוד בעזרת movsb.

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

    עידן.

    #83297
    awesomblly
    משתתף

    ואו זה ממש מסובך אנחנו בקבוצה לא יודעים אפילו movsw :/
    כרגע מה שהבנו הכי טוב זה איך הcannon עובד ועשינו משהו דומה לא הצלחנו להתקדם משמה

    #83298
    Idan Dor
    משתתף

    מניסיוני אין דרך טובה יותר ללמוד מאשר לנסות להבין קוד כזה.
    כמה הסברים לעזרה:
    Movsw- אחת הפקודות הכי שימושיות בתחרות הזאתי בגלל כמות הדברים שהיא עושה. באופן כללי היא מעתיקה שתי בתים בזיכרון ממקום מסוים למקום אחר ואז מקדמת את האינדקסים בשתיים, דבר זה נותן שאם מכוונים אותה כמו שצריך ניתן להעתיק הרבה מידע וקוד פשוט בעזרת הפעלת הפקודה הזאת שוב ושוב. באופן ספציפי היא מעתיקה שתי בתים (גודל שנקרא גם מילה) מ DS:SI ל ES:DI ואז מוסיפה ל SI ול DI את המספר 2. בתחילת המשחק DS מצביע לזירה ו ES אל האזור המשותף אז הפקודה מעתיקה מהזירה אל האזור המשותף.
    Rep- הפקודה מריצה את הפקודה שאחריה CX פעמים, חשוב לציין שכל הרצה עולה סיבוב אחד במנוע. כלומר rep movsw עם cx=3 זה אותו דבר כמו הפקודה movsw שלוש פעמים ברצף חוץ מזה שזה תופס פחות מקום בזיכרון. דבר זה שימושי להעתקות ארוכות שבהם צריך להריץ את movsw עשרות פעמים. (חשוב לציין ש rep עובד רק עם פקודות מסוימות ולא עם כולם).
    Movsb- אותו דבר כמו movsw רק עם בית אחד כל פעם במקום מילה כל פעם.

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

    עידן.

מוצגות 9 תגובות – 1 עד 9 (מתוך 9 סה״כ)
  • יש להתחבר למערכת על מנת להגיב.