ברוכים הבאים לאתר תחרויות קודגורו! › פורומים › אקסטרים › SmartRun source code
- This topic has 0 תגובות, משתתף 1, and was last updated לפני 12 שנים, 11 חודשים by kirill578.
-
מאתתגובות
-
30 בדצמבר 2011 בשעה 14:09 #76801kirill578משתתף
טוב, למי שלא הצליח להבין איך השורד שלנו עובד זה זה פשוט. השורד הראשון מגן על כצמו ועל השורד השני, בכל פעם שהוא מזהה שעומדים לדרוס אותו הוא מעתיק את עצמו למקום אחר בזיכרון ומודיע לשורד השני שהוא צריך לקפוץ שלקוד החדש.
השורד השני בסך הכל מתקיף ובודק כל כמה זמן אם יש צורך לקפוץ וקוד החדש, את התקשורת הורדים עושים ביינהם בסיגמנט הנוסף.
הוספתי פה את קוד המקור של שני השורדים כולל הסברים מפורטיםאם למישהו יש שאלות הוא מוזמן לשאול
למי שזוכר, הזכרי שהשורד ששלחנו הוא לא היה המעודכן ביותר. ההבדל העיקרי בינהם הוא השורד החדש (הוא השתתף רק במהלך הסיבוב השני שהיה ביום ד) שהוא מסוגל לתפוס שורדים אחרים ולהשתמש בזמן ריצה שלהם לטובתו
גם את קוד המקור שלו הוספי (בסוף) אני אשמח אם מישהו יצליח לגלות למה הוא פחות מהשורד הקודם.Here is the source of "Smartrun1":
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Listeners_distance = 0x450
Jump_distance = 0x0960
Number_of_listeners = 0x10
Distance_betwen_listener = 0x10@initialization:
;dx holds the value that we use as listener,which is random
mov dx,ax;bp points to the effective address of @start
mov bp,ax
add bp,@start-@initialization;ES backed up in the stuck, ES < AREAN
push es
push cs
pop es@start:
;Write to ES:[0], the effective address of @end
;@end <-> @end2 is the loop where Smartrun2 is runing
pop ds
lea bx,[bp+@end-@start]
mov [0h],bx
push ds ;backup again es addresspush cs
pop ds ;restore DS to arena;The following part writes the random value (Smartrun1's initialization address)
;to listeners location;previously we backed up our AX in to DX, STOSW works AX
mov ax,dxlea di,[bp-Listeners_distance]
mov cx,Number_of_listeners@write_top_lis:
stosw
add di,Distance_betwen_listener
loop @write_top_lislea di,[bp+Listeners_distance]
mov cx,Number_of_listeners@write_bottom_lis:
stosw
add di,Distance_betwen_listener
loop @write_bottom_lis;Here is the part which cheack for changes
@Check_again:
lea si,[bp-Listeners_distance]
mov cx,Number_of_listeners@check_top:
lodsw
cmp ax,dx ;Dx contains the original value
jne @goback
add si,Distance_betwen_listener
loop @check_toplea si,[bp+Listeners_distance]
mov cx,Number_of_listeners@check_bottom:
lodsw
cmp ax,dx ;Dx contains the original value
jne @goforward
add si,Distance_betwen_listener
loop @check_bottomjmp @Check_again
;here we copy the code to a new location.
@goback:
mov si,bp ; BP = effective address of @start
lea di,[bp-Jump_distance] ;where we jump to
mov cx,(@end2-@start)/2 ;array size
rep
movsw ;copy array;update new efffective address of @start porinter location
lea bp,[bp-Jump_distance]
jmp bp ;nothing to do here any more@goforward:
mov si,bp ; BP = effective address of @start
lea di,[bp+Jump_distance] ;where we jump to
mov cx,(@end2-@start)/2 ;array size
rep
movsw ;copy array;update new efffective address of @start porinter location
lea bp,[bp+Jump_distance]
jmp bp ;nothing to do here any more;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@end: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Here is the main loop which Smartrun2 is shotly jump
;to after its initialization.;write 50h time ax to ARENA
;which we set in smartrun2.asm to 0xCCCC
mov cx,50h
rep
stosw;get the updated location of the effective address of the main loop
;of Smartrun2
pop ds
mov bx,[0h]
push ds
push cs
pop ds;check for changes
cmp bx,bp
je @skip_xchg
xchg bx,bp ;if there was an update go over there@skip_xchg:
jmp bp
@end2:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
here is the source of smartrun2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wait until smartrun1 finished updating its location
mov bx,bx
mov bx,bx
mov bx,bx
mov bx,bx
mov bx,bx
mov bx,bx
mov bx,bx
mov bx,bx
mov bx,bx
mov bx,bx
mov bx,bx
mov bx,bx
mov bx,bx
mov bx,bx
mov bx,bx
mov bx,bx;What we write to Arena
mov ax,0cccch;Get main loop address
push es
push es
pop ds
mov bp,[0h]add di,bp
add di,1000hpush cs
pop dspush cs
pop esjmp bp ;Nothing to do here anymore
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Here is the source of Smartrun1 version 2Listeners_distance = 0x350
Jump_distance = 0x0C60
Number_of_listeners = 0x10
Distance_betwen_listener = 0x10@initialization:
;wait until Smartrun2 almost copy all the slave
;code to the ES
xor bx,bx
xor bx,bx
xor bx,bx
xor bx,bx
xor bx,bx
xor bx,bx
xor bx,bx
xor bx,bx
xor bx,bx
xor bx,bx
xor bx,bx
xor bx,bx;dx holds the value that we use as listener,which is random
mov dx,ax;bp points to the effective address of @start
mov bp,ax
add bp,@start-@initialization;ES backed up in the stuck, ES < AREAN
push es
push cs
pop es;Write to ES:[0], the effective address of @end
;@end <-> @end2 is the loop where Smartrun2 is runing
;Write to ES:[11h] The effective address of @end2
;@end2 <-> @end3 is the main loop where any slave
;will be broght to
pop ds ;set ds to eslea bx,[bp+@end-@start]
mov [0h],bxmov bx,bp
add bx,(@end2-@start)
mov [11h],bx ;See smartrun2.asmpush ds ;backup es address
push cs
pop ds ;set ds to arena;here we update (after we relocated our code)
;First slave op code (mov bp,1234h) to its location-1mov cx,bp
add cx,(@end2-@start)
mov bx,cx
inc bx
mov [bx],cx;The following part writes the random value (Smartrun1's initialization address)
;to listeners location;previously we backed up our AX in to DX, STOSW works AX
mov ax,dxlea di,[bp-Listeners_distance]
mov cx,Number_of_listeners@write_top_lis:
stosw
add di,Distance_betwen_listener
loop @write_top_lislea di,[bp+Listeners_distance]
mov cx,Number_of_listeners@write_bottom_lis:
stosw
add di,Distance_betwen_listener
loop @write_bottom_lis;Here is the part which cheack for changes
@Check_again:
lea si,[bp-Listeners_distance]
mov cx,Number_of_listeners@check_top:
lodsw
cmp ax,dx ;Dx contains the original value
jne @goback
add si,Distance_betwen_listener
loop @check_toplea si,[bp+Listeners_distance]
mov cx,Number_of_listeners@check_bottom:
lodsw
cmp ax,dx ;Dx contains the original value
jne @goforward
add si,Distance_betwen_listener
loop @check_bottomjmp @Check_again
;here we copy the code to a new location.
@goback:
mov si,bp ; BP = effective address of @start
lea di,[bp-Jump_distance] ;where we jump to
mov cx,((@end2-@start)/2+10) ;array size
rep
movsw ;copy array;update new efffective address of @start porinter location
lea bp,[bp-Jump_distance]
jmp bp ;nothing to do here any more@goforward:
mov si,bp ; BP = effective address of @start
lea di,[bp+Jump_distance] ;where we jump to
mov cx,((@end2-@start)/2+10) ;array size
rep
movsw ;copy array;update new efffective address of @start porinter location
lea bp,[bp+Jump_distance]
jmp bp ;nothing to do here any more;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@end: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cld ;write forward
;copy Slave catcher code to Arena
mov si,2
mov cx,0ah
rep
movsw;after we copied the catcher we substract Di to its previous value
;Di < Di – 0xA * 2 = 0x14 (we use MOVSW)
;Bacuse we are going to write backwoards we need to sub a single word size
;which is 2. Thus we can sub 0x16.
sub di, 16hstd ;write backwords
mov cx,50h ;0x50 times
rep
stosw
cld ;write forward;Dx count down, in the 167K round it reaches 0
;and we kill the slaves
dec dx
jnz @skipapush ds
push cs
pop dsmov bx, bp
add bx,(@end2-@end)
mov [bx],0cch ;Replace mov bp,1234h with 0xCCpop ds
@skipa:
;check if there was relocation of the code
mov bx,[0h]cmp bx,bp
jne @noequal ;The code was relocated
jmp bp@noequal:
;copy new slave address
push di ;No register left,So I backed up Di in Stuck
mov di,bp
add di,(@end2-@end+1)
;Before we jump we need to update the slave that he need jump as well
;we are doing it by changing the "1234h" to @end2's new location
mov ax,[11h]stosw ;mov ds:[bp+@end2-@end+1],[11h]
pop di ;restore Di
xchg bx,bp
jmp bp ;nothing to do here
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@end2: ;;;;;;;;;;;;;;;;;;; slave;the code it too simple to explain it
mov bp,1234h
mov cx,40h
rep
stosw
jmp bp@end3:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Here is the source of Smartrun2 version 2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;The following part copies @slave <-> @end
;which is the catcher code to the ESmov si,ax
add si,@slave
mov di, 2h ; first to bytes contains SmartRun2 pointer so we start from 2h
mov cx,(@end-@slave)/2 + 1 ) ;size of the code
rep
movswmov dx,500h ; The counter to slaves death
xor di,di
; 0xAA is the OP code of MOVSB
; thus its probobilty to catch slave is 100%
; HOWEVER!! it might reach the @slave by the wrong bit
; so it's realy it just 50%
mov ax,0aaaahpush es
push es
pop ds
mov bp,[0h] ;get the address of smartrun2's main loopadd di,bp
sub di,1000h
push cs
pop dspop ds ; ds = extra sygment
push cs
pop es ; es = arenajmp bp
@slave:
xor di,di
mov ax,0cccch
mov bx,1000h
push bx
pop es ;set ES to arena = 1000h;There is no: mov di,ip so….
call @abc
@abc: pop di;es[11h] points to "1234h" so we can change the address it jumps to
;according to ower currunt location
mov bp,1234h
jmp bp
@end: -
מאתתגובות
- יש להתחבר למערכת על מנת להגיב.