SmartRun source code

עמוד
מוצגות 1 תגובות (מתוך 1 סה״כ)
  • מאת
    תגובות
  • #76801
    kirill578
    משתתף

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

    אם למישהו יש שאלות הוא מוזמן לשאול

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

    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 address

    push 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,dx

    lea di,[bp-Listeners_distance]
    mov cx,Number_of_listeners

    @write_top_lis:
    stosw
    add di,Distance_betwen_listener
    loop @write_top_lis

    lea 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_top

    lea 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_bottom

    jmp @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,1000h

    push cs
    pop ds

    push cs
    pop es

    jmp bp ;Nothing to do here anymore

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    Here is the source of Smartrun1 version 2

    Listeners_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

    @start:

    ;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 es

    lea bx,[bp+@end-@start]
    mov [0h],bx

    mov bx,bp
    add bx,(@end2-@start)
    mov [11h],bx  ;See smartrun2.asm

    push 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-1

    mov 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,dx

    lea di,[bp-Listeners_distance]
    mov cx,Number_of_listeners

    @write_top_lis:
    stosw
    add di,Distance_betwen_listener
    loop @write_top_lis

    lea 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_top

    lea 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_bottom

    jmp @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, 16h

    std ;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 @skipa

    push ds
    push cs
    pop ds

    mov bx, bp
    add bx,(@end2-@end)
    mov [bx],0cch ;Replace mov bp,1234h with 0xCC

    pop 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 ES

    mov 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
    movsw

    mov 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,0aaaah

    push es
    push es
    pop ds
    mov bp,[0h]  ;get the address of smartrun2's main loop

    add di,bp
    sub di,1000h 
    push cs
    pop ds

    pop ds ; ds = extra sygment
    push cs
    pop es  ; es = arena

    jmp 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:

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