Reversing - הבסיס

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



ציטוט:






פקודות קפיצה בסיסיות:
Jmp - פשוט קופץ למקום הניתן.
Jump if Equal - Je - קופץ אם הערכים שווים אחד לשני.
Jump if Not Equal - Jne - קופץ אם הערכים אינם שווים אחד לשני.
Jmp if Greater than... - Jg - קופץ אם גדול מ...
Jump if Not Greater - Jng - קופץ אם לא גדול מ...
Jump if Greater or Equal to... - Jge - קופץ אם גדול או שווה ל...
Jump if Not Greater or Equal to... - Jnge - קופץ אם לא גדול או שווה ל...
Jump if Less than... - Jl - קופץ אם קטן מ...
Jump if Not Less - Jnl - קופץ אם לא קטן מ...
Jump if Less or Equal to... - Jle - קופץ אם קטן או שווה ל...
Jump if Not Less or Equal to... - Jnle - קופץ אם לא קטן או שווה ל...
Jump if After - Ja - קופץ אם אדרס מסוים נמצא בזכרון אחרי או ערך מסוים "אחרי"...
(אם הערך גדול מ...)
Jump if Not After - Jna - קופץ אם לא אחרי...
Jump if After or Equal to... - Jae - קופץ אם אחרי או שווה ל...
Jump if Before - Jb - קופץ אם אדרס מסוים נמצא בזכרון לפני או ערך מסוים "לפני"...
(אם הערך קטן מ...)
Jump if Not Before - Jnb - קופץ אם לא לפני...
Jump if Not Before or Equal - Jbe - קופץ אם לפני או שווה ל...

פקודות נוספות:
Mov - מזיז ערך או רג`יסטר אל תוך ערך או רג`יסטר אחר.
Inc - מוסיף 1.
Dec - מחסיר 1.
Add - מוסיף את הערך הנקבע.
Sub - מחסיר את הערך הנקבע.
Allocate - Alloc - מוסיף זכרון לסקריפט. (תראו דוגמאות בהמשך)
Deallocate - Dealloc - לא מוחק זכרון, אבל חובה לשים כשמשתמשים ב-Alloc. (תבינו
בהמשך)
Label - מחליף אדרס כדי שנוכל לקפוץ אליו בסקריפט.
Registersymbol - מוסיף שם מסוים כדי שנוכל להוסיף אותו ידנית בשם המצוין. (תבינו

Push - דוחף רג`יסטר אל הערמה.
Pop - מחזיר מן הערמה.
Pushad - דוחף את כל הרג`יסטרים אל הערמה.
Popad - מחזיר את כל הרג`יסטרים מן הערמה.
רג`יסטרים:
EAX - רג`יסטר Eax הוא רג`יסטר Accumulator. (צובר) אוגר המידע. (אוגר = רג`יסטר
בעברית)
EBX - רג`יסטר Ebx הוא רג`יסטר Base (בסיס) אוגר הבסיס.
ECX - רג`יסטר המונה, Count Register. אוגר נתונים.
EDX - רג`יסטר Edx הוא Data Register, גם כן אוגר נתונים אבל פחות שימושי.
ESI - רג`יסטר הכתובת. (אינדקס המקור - SI = Source Index) מצביע המקור.
EDI - גם כן רג`יסטר הכתובת. (אינדקס יעד - DI = Destination Index) מצביע על היעד.
EBP - מצביע בסיס המחסנית. (Stack Frame Base Pointer) רג`יסטר זה משמש גישה
מהירה למידע הנמצא בערמה. (הערמה - אחרי פעולה Push הרג`יסטר וכל המידע שלו
מגיע לערמה)
ESP - מצביע המחסנית. (Stack Pointer) עוקב אוטומטית אחר המיקום האחרון במחסנית.
EIP - המצביע לפקודה. (Instruction Pointer) מצביע לאזור בזיכרון בו נמצאת הפקודה
הבאה לביצוע. לא ניתן לשנות אלא באמצעות Code Cave וניתן לשינוי רק לערך הנקבע
אוטומטית על ידי ה-Cheat Engine.
מתחילים להכין סקריפטים:

קוד:

mov a,b



זה יזיז את "b" אל "a".

קוד:

mov a,[b]



זה יזיז את ערך "b" אל "a". כשמשתמשים [בסוגרים מרובעים] זה אומר להעביר את הערך.

קוד:

mov [a],b



זה יזיז את "b" אל ערך "a". לדוגמה, אם b = 1 אז עכשיו ערכו של a יהיה שווה 1.

קוד:

mov [a],[b]



זה בלתי אפשרי! אי אפשר להזיז ערך אחד לערך השני.
בשביל להזיז את ערך b אל ערך a נשתמש ברג`יסטרים.

קוד:

mov eax,[b]
mov [a],eax



עכשיו eax שווה לערכו של b. אם ערכו היה 2 אז עכשיו eax הוא 2 ואז הזזנו את eax אל
תוך ערך a אז במקרה הזה a = 2.

שימוש ב-Alloc:

קוד:

Alloc(Cat,4)
Alloc(Dog,4)



עכשיו הוספנו 4 בייטים לזכרון Cat ו-4 לזכרון ב-Dog.
נמשיך את הקוד.

קוד:

Alloc(Cat,4)
Alloc(Dog,4)
Cat:
mov a,b
Dog:
mov c,d



השתמשנו במילה Cat כדי להשתמש ב-4 ביטים בשביל להזיז את b אל a ועוד 4 בשביל
להזיז את d אל c ב-Dog.

סקריפטים שלמים והכנסתם ל-Cheat Table:
דבר ראשון, את הסקריפטים כותבים בחלון ה-Auto Assembler. אפשר לפתוח אותו על ידי
כניסה ל-Memory View ואז לחיצה על Ctrl+A.
בשביל להכניס קוד ל-CT צריך להשתמש בתגים [Enable] ו-[Disable].
אחרי שתכתבו [Enable] יבוא הסקריפט של מה שיקרא כשתסמנו את ההאק, ומה שתכתבו
אחרי ה-[Disable] זה מה שיקרה שנבטל את ההאק. (נכניס את הנתונים המקוריים)
דוגמה:

קוד:

[Enable]
Alloc(Dog,128)
Alloc(Cat,128)
Dog:
mov eax,[ebx]
Cat:
mov edx,[ecx]
[Disable]
Dealloc(Dog)
Dealloc(Cat)



אני יסביר מה הסקריפט עושה.
השתמשנו ב-128 ביטים בשביל Dog ועוד 128 בשביל Cat (שזה הרבה רק בשביל פקודת
mov) ואז הזזנו את ערך ebx אל eax כלומר אם ebx שווה 1337 בערכו אז eax עכשיו
הוא 1337.
ואז הזזנו את ערכו של ecx אל edx. נגיד ש-ecx שווה ל-255 אז edx שווה ל-255 עכשיו.
עכשיו אחרי ה-Disable הוספנו Deallocate אבל לא כתבנו Dealloc(Dog,128) מכיוון
שלא צריך למחוק זכרון, רק צריך את השורה הזאת כדי שנוכל להוסיף ל-CT.
למה לא כתבתי את הנתונים המקרויים של Dog ו-Cat ב-Disable?
בגלל שלא היה Dog ו-Cat עד שהוספנו את זה בעזרת Alloc ולכן אין שום נתונים מקוריים.
כשעשינו Dealloc בעצם מחקנו את Dog ו-Cat אז כאילו לא עשינו שום פעולה.
הסקריפט הזה לא יעשה כלום בגלל שלא קבענו את ערכם של האוגרים, (הרג`יסטרים) אם
היינו משתמשים באדרסים אמיתיים היינו בעצם מזיזים את ערכם של הרג`יסטרים באותו
אדרס. (אפשר לראות את ערכם של כל הרג`יסטרים)
נשתמש באדרס.
נגיד יש לנו אדרס, 00666888.
נגיד ש-eax זה 00404040 ו-ebx שווה ל-00007fff.
עכשיו נכתוב את הסקריפט:

קוד:

[Enable]
00666888:
mov eax,ebx
[Disable]
00666888:
mov eax,00404040

למה לא הוספנו גם:

קוד:

mov ebx, 00007fff


בגלל שלא שינינו את ebx בכלל אז הוא עדיין שווה ל-7fff אז לא צריך לכתוב את זה בכלל.


עכשיו, מורידים איזה דיבאגר (אני אוהב את OllyDBG 1.10) ואיזה CrackMe קל. (אני יעלה CrackMe`s קלים אחר כך, לבינתיים: http://www.sendspace.com/file/5o34t2)

עכשיו, לחצו F3 ופתחו את הקובץ שתרצו לעשות reverse.
בהתחלה, נריץ את התוכנה (F9) כרגיל כדי לחקור אותה.

עכשיו נשתמש באחת השיטות הכי קלות שאפשר לעשות Reverse או לגלות את הסיסמה. (Reverse זה בכלל לא בעיה, לגלות מה הסיסמה, זאת כל החוכמה)
עכשיו נלחץ בחלון CPU לחיצה ימנית -> Search ואז Search for all text strings. עכשיו בעצם חיפשנו עבור כל המחרוזות בתקווה שנמצא שם משהו מעניין.

ב-CrackMe שלי אין בכלל הצפנות, הגנות, CrackMe הכי פשוט שיש!
נחפש שם את הטקסט של ה-Good boy (ההודעה של "הצלחת") או את ה-Badboy. (ההודעה של "טעות, נסה שנית")

אני מצאתי כאן את הקטע של ה-Correct Password (ה-Good boy!) ולפי מה שזה נראה, זה משווה את הסיסמה שלי אל הטקסט בתיבת טקסט, אם זה לא זה זה יקפוץ אל ה-Badboy, אנחנו לא רוצים את זה!
עכשיו נעשה Reverse. הקפיצה jnz היא בעצם כמו jne. (תקראו באתר שלי על הקפיצות) עכשיו נשנה אותה אל nop (סמנו את "Fill with nop`s") שזה בעצם פקודה שלא עושה כלום, ככה שלא נקפוץ אל ה-Badboy!
אם נשנה את זה ל-jz/je זה יקפוץ רק כאשר הסיסמה נכונה, וזה לא טוב! אנחנו רוצים שגם אם הסיסמה נכונה לא נקפוץ אל ה-Badboy, תמיד Good boy!
וזהו, סיימנו לעשות Reverse הכי פשוט בפעם הראשונה שלנו.

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