ברוכים הבאים לאתר תחרויות קודגורו! › פורומים › אקסטרים › הטיפ היומי 3 – מבחר שורדים לשימוש חופשי
- This topic has 7 תגובות, 6 משתתפים, and was last updated לפני 19 שנים, 9 חודשים by אור.
-
מאתתגובות
-
13 בפברואר 2005 בשעה 16:52 #80045Eat 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.il13 בפברואר 2005 בשעה 19:13 #77684Eat 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.il13 בפברואר 2005 בשעה 20:09 #80049Eat Bit not Meatמשתתףכותרת: הטיפ היומי 4 – שורדים ניידים ולוכדים
טיפ נוסף ברצף והפעם קודים לשורדים בעלי יכולות ניידות, שיכפול ולכידה או שיעבוד של שורדים אחרים.TIER
שורד זה הוא שורד פשוט ביותר – 4 פקודות בלבד, אשר יש לו יכולות ניידות ולכידה. השורד נייד, כלומר מעתיק עצמו שוב ושוב לקטעים חדשים בזכרון וממשיך לרוץ מהקטע החדש. במקרה זה הקטע שחוזר על עצמו הוא פקודה אחת בלבד שכותבת בכל פעם את הפקודה הבאה. לכן גם הקוד הוא בעל פרופיל פגיעות מינימלי של פקודה אחת בלבד, רק כתיבה לכתובת הבאה יכולה לפגוע בו. יש לו גם יכולת לכידה, או שיעבוד, של שורדים אחרים. שורד אחר שמותקף לא יפסל אלא ימשיך לרוץ על הקוד שיצר ה TIER. מכיוון ששניהם רצים באותו קצב, הם לא יפילו זה את זה. לכן שורד זה בדרך כלל לא ינצח, אלא נוטה ליצור תוצאת תיקו. אם השורדים שמולו הם בעלי כוחות שווים בקירוב, הוא ייצור בכל פעם תוצאת תיקו עם מישהו אחר (מכאן שמו), מה שיכול לתת לו את הנצחון בדירוג הסופי.
קצב ההתקפה הישיר שלו הוא בית 1 למחזור, אבל לאחר לכידה של שורדים נוספים, הם מסייעים לו לתקוף את האחרים וקצב ההתקפה גדל עם כל שורד שנלכד ברשת. התקיפה של השורדים הלכודים תהיה לרוב קטלנית (תלוי בתוכן של AX) בניגוד לתקיפה הלוכדת של השורד עצמו. כך ניתן להגיע לקצב התקפה מעשי הגדול מהגבול התיאורטי של 2, הנובע ממגבלת השימוש בפקודות 16 ביט בלבד.XCHG DI,AX
mov AL,0aah
ADD DI,7
stosbJAWS
שורד קטלני במיוחד. גם שורד זה הוא נייד ולוכד בדומה לקודם, אבל הוא תוקף בו זמנית לשני כיוונים. את כל זה הוא מצליח לעשות בעזרת קוד פשוט אך מתוחכם, בן 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=216213 בפברואר 2005 בשעה 22:06 #80050laterמשתתףכותרת: הסבר ל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 כדי לכתוב לעצמו את שתי הפקודות הבאות, ולתקוף גם בכיוון השני.דרך אגב: נחמד להתעורר בבוקר ולראות ששחררו בפורום רעיונות יפים, שלא יכולת להציץ בהם לפני שליחת השורד…
אבל זה בטח רק אני, אז… בהצלחה לכולם… נתראה מחר.14 בפברואר 2005 בשעה 00:08 #80051LATERמשתתףכותרת: שעון לא מכוון…
אני מצטער…
עכשיו ראיתי שהשעון בפורום לא מכוון…
מצטער על ההערה בסוף…רעיונות יפים בכל מקרה.
14 בפברואר 2005 בשעה 02:02 #80052old_בןמשתתףכותרת: אם רק הייתי יודע שאפשר לשנות את SS….
14 בפברואר 2005 בשעה 04:38 #80053אחרי12משתתףכותרת: זה היה אחרי 12 בכל מקרה
14 בפברואר 2005 בשעה 08:31 #80054אורמשתתףכותרת: אם כבר מזכירים בעיות בפורום…
אכפת לכם בבקשה לתקן את הבאג המעצבן שאוטומאטית ממלא תו רווח אחד בשדה האי מייל?
לא תמיד יש לי כח להכניס את האי מייל שלי ואני לא תמיד רוצה…
למה שאני אצטרך כל פעם למחוק את התו הזה כדי שהוא לא יתן לי את הודעת השגיעה? -
מאתתגובות
- יש להתחבר למערכת על מנת להגיב.