הטיפ היומי 3 – מבחר שורדים לשימוש חופשי

עמוד

ברוכים הבאים לאתר תחרויות קודגורו! פורומים אקסטרים הטיפ היומי 3 – מבחר שורדים לשימוש חופשי

מוצגות 8 תגובות – 1 עד 8 (מתוך 8 סה״כ)
  • מאת
    תגובות
  • #80045
    Eat Bit not Meat
    משתתף

    כותרת: הטיפ היומי 5 – עוד כמה רעיונות
    לסיום, הנה עוד כמה רעיונות:

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

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

    3. רק בשביל הכיף – נסו לכתוב שורד שמצייר או כותב הודעות על פני המסך.

    4. לא רק בשביל הכיף – ניתן להשתמש בשורד המצייר או כותב על המסך לצורך Debugging, כך שיכתוב נתונים שונים למעקב.

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

    6. שורד כמו השוטר ניתן לחסל בקלות תוך זמן קצר יחסית, מתוך ידיעת דרך פעולתו. השיטה היא זו:
    שלב א: כל 256 בתים כותבים לזכרון ערך ידוע, שונה מ CC. חוזרים על כך 256 פעמים ובכך מכסים את כל הזכרון (להזהר מדריסה עצמית).
    שלב ב´: קוראים באותו סדר את הבתים שנכתבו, עד שמזהים בית ששונה ל CC. יתכן שיהיה צורך במעט יותר מלולאה אחת, אבל לא הרבה יותר. ניתן לראות כי בדרך זו מובטח לעלות על כתיבה אחת לפחות של השוטר.
    שלב ג´: כעת חוזרים אחורה ומבצעים כתיבות במרווחים של 11 בתים, כמו השוטר. את הכתיבות עושים בOFFSET, כמה בתים מהבית שמצאנו, כך שהכתיבות ידרסו את הקוד של השוטר כשנגיע אליו.
    בהתאם לזמן שבו מצאנו את הבית,ניתן לחשב בקיוב את הזמן שבו השוטר ביקר במקום ולהגבילו בהתאם לזמן שחלף בין הכתיבה שלנו לקריאת הבית שהשתנה. לכן ניתן לדלג ישר על קטע גדול ולהתחיל לכתוב באותו קטע חשוד.

    אלגוריתם זה מחסל בוודאות את השוטר תוך בערך 3000 מחזורים שבהם השוטר מבצע 1000 כתיבות בדילוגים של 11 בתים, כלומר מכסה 11000 בתים מתוך 64K, בערך 1/6. זה נותן לשוטר סיכוי של בערך 1/6 לנצח וסיכוי של 5/6 להפסיד (בקרב 1 על 1).

    החסרון הוא שמדובר בשורד ייעודי שדורש הכרה מדוייקת של היריב ואינו תוקף ביעילות כמה יריבים בו זמנית.
    ================================
    Eat Bit not Meat
    מוגש בחסות "אכלו ביטים ולא חיות"
    אתר מומלץ יומי: http://www.isav.org.il

    #77684
    Eat Bit not Meat
    משתתף

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

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

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

    RANDOM
    שורד זה יורה לכתובות פסאודו אקראיות. המספרים האקראיים מחושבים על ידי Linear feedback shift register (מונה הזזה עם משוב לינארי). מי שלא מכיר יכול למצוא על כך מידע רב בגוגל. השורד הזה לא מאד מוצלח, עקב אורכו שגורם לקצב התקפה נמוך ופרופיל פגיעות גבוה (ראו הסבר בטיפ היומי 2).


    @start
    :
    mov bx, ax
    add bx, (@end – @start)
    mov al, 0CCh
    mov cx,8054h
    @loop:
    mov [bx], al
    mov dx,bx
    add bx,dx
    and dx,cx
    xor dl,dh
    jpe @loop
    add bx,4
    jmp @loop
    @end:

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


    @start
    :
    mov si, ax
    mov bx, 0aaaah
    mov ax, 0cccch
    mov dx,8016h
    @loop1:
    cmp [bx+si], ax
    jne @follow
    @cont:
    add bx,bx
    push bx
    and bx,dx
    xor bl,bh
    pop bx
    jpe @loop1
    inc bx
    jmp @loop1

    @follow:
    cmp bh,0
    Je @cont
    mov di,bx
    add di,si
    sub di,40h
    mov cx,40h
    @loop2:
    stosw
    loop @loop2
    jmp @cont
    @end:

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


    @start
    :
    mov di, ax
    add di, (@end – @start)
    mov ax, 0CCCCh
    mov bx, 9276h
    @loop:
    STOSW
    add di, bx
    jmp @loop
    @end:
    ================================
    Eat Bit not Meat
    מוגש בחסות "אכלו ביטים ולא חיות"
    אתר מומלץ יומי: http://www.veg.co.il

    #80049
    Eat Bit not Meat
    משתתף

    כותרת: הטיפ היומי 4 – שורדים ניידים ולוכדים
    טיפ נוסף ברצף והפעם קודים לשורדים בעלי יכולות ניידות, שיכפול ולכידה או שיעבוד של שורדים אחרים.

    TIER
    שורד זה הוא שורד פשוט ביותר – 4 פקודות בלבד, אשר יש לו יכולות ניידות ולכידה. השורד נייד, כלומר מעתיק עצמו שוב ושוב לקטעים חדשים בזכרון וממשיך לרוץ מהקטע החדש. במקרה זה הקטע שחוזר על עצמו הוא פקודה אחת בלבד שכותבת בכל פעם את הפקודה הבאה. לכן גם הקוד הוא בעל פרופיל פגיעות מינימלי של פקודה אחת בלבד, רק כתיבה לכתובת הבאה יכולה לפגוע בו. יש לו גם יכולת לכידה, או שיעבוד, של שורדים אחרים. שורד אחר שמותקף לא יפסל אלא ימשיך לרוץ על הקוד שיצר ה TIER. מכיוון ששניהם רצים באותו קצב, הם לא יפילו זה את זה. לכן שורד זה בדרך כלל לא ינצח, אלא נוטה ליצור תוצאת תיקו. אם השורדים שמולו הם בעלי כוחות שווים בקירוב, הוא ייצור בכל פעם תוצאת תיקו עם מישהו אחר (מכאן שמו), מה שיכול לתת לו את הנצחון בדירוג הסופי.
    קצב ההתקפה הישיר שלו הוא בית 1 למחזור, אבל לאחר לכידה של שורדים נוספים, הם מסייעים לו לתקוף את האחרים וקצב ההתקפה גדל עם כל שורד שנלכד ברשת. התקיפה של השורדים הלכודים תהיה לרוב קטלנית (תלוי בתוכן של AX) בניגוד לתקיפה הלוכדת של השורד עצמו. כך ניתן להגיע לקצב התקפה מעשי הגדול מהגבול התיאורטי של 2, הנובע ממגבלת השימוש בפקודות 16 ביט בלבד.

    XCHG DI,AX
    mov AL,0aah
    ADD DI,7
    stosb

    JAWS
    שורד קטלני במיוחד. גם שורד זה הוא נייד ולוכד בדומה לקודם, אבל הוא תוקף בו זמנית לשני כיוונים. את כל זה הוא מצליח לעשות בעזרת קוד פשוט אך מתוחכם, בן 6 שורות בלבד, הנותן קצב התקפה של 2 בתים למחזור + לכודים ופרופיל פגיעות ממוצע של 1.5 בתים בלבד. נראה אם תצליחו להבין כיצד הואעושה זאת (מי שמצליח מוזמן לכתוב כאן את התשובה).

    MOV DI,AX
    mov SS,DS
    xchg SP,AX
    mov Ax,0ab50h
    ADD DI,12
    stosw

    המעוניינים בכך יכולים לנסות לעשות שיפורים מסויימים לשורד זה, למשל על ידי לכידה שתגרום ללכודים לבצע משימה יעילה יותר, חלוקת משימות מסודרת בין השורד ללכודים ועל ידי דילוג על הקטעים הבטוחים שמסביב לקוד המקורי (1024 בתים מכל כיוון).
    ================================
    Eat Bit not Meat
    מוגש בחסות "אכלו ביטים ולא חיות"
    אתר מומלץ יומי: http://forums.nana.co.il/Forum/?ForumID=2162

    #80050
    later
    משתתף

    כותרת: הסבר לJaws

    MOV DI,AX מכוון את פוינטר הכתיבה לכתובת השורד
    mov SS,DS מכוון את מקטע המחסנית למקטע הקוד
    xchg SP,AX מכוון את היסט המחסנית להיסט הקוד
    mov Ax,0ab50h מעביר לAX את הפקודות Push AX; stosw
    ADD DI,12 מקפיץ את פויינטר הכתיבה לסוף הקוד.
    stosw

    מה שהשורד הבא עושה… זה תוקף בעזרת שתי פקודות:
    1)
    Push למחסנית, שמכוונת על מקטע הזיכרון. המחסנית מתקדמת אחורה.
    מי שיחטוף מההתקפה של השורד, יהפוך לIMP. (יבורווז)

    2)
    Stosw כדי לכתוב לעצמו את שתי הפקודות הבאות, ולתקוף גם בכיוון השני.

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

    #80051
    LATER
    משתתף

    כותרת: שעון לא מכוון…
    אני מצטער…
    עכשיו ראיתי שהשעון בפורום לא מכוון…
    מצטער על ההערה בסוף…

    רעיונות יפים בכל מקרה.

    #80052
    old_בן
    משתתף

    כותרת: אם רק הייתי יודע שאפשר לשנות את SS….

    #80053
    אחרי12
    משתתף

    כותרת: זה היה אחרי 12 בכל מקרה :(

    #80054
    אור
    משתתף

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

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