FIX Tool -> Find and Replace New

include \masm32\include\masm32rt.inc
comment * -----------------------------------------------------
          FIX Tool -> Find and Replace New
          ^   ^       ^        ^       ^
          Name : FTFRN
          Data : 2013-04-20
           Ver : 2.0
            By : Dragon
           Mem : Advantage of fast Find
                 Does not support batch modify
                 build environment requirements masm32v11
                 makeit.bat   compile
                 run_this.bat execute the tool
        ----------------------------------------------------- *
    .data
        fname    db "infile",0          ;<-- Input the file name
        fbakname db "infile.bak",0      ;<-- Input the backup file name
        
        findData db "findData",0        ;<-- Input Find bytes content
        findLen  dd 8                   ;<-- Input length
        
        fixData  db 90H,90H,90H         ;<-- Input replacement bytes content
        fixLen   dd 3                   ;<-- Input length
        
        findPOS  dd 0
    .code

start:
        call main
        exit

main proc
        call openGPCore
        ret
main endp

openGPCore proc
        LOCAL hFile     :DWORD
        LOCAL hBakFile  :DWORD
        LOCAL dSize     :DWORD
        LOCAL hMem      :DWORD
        .if rv(exist,offset fname) != 0
                mov hFile, fopen(offset fname)
        .else
                print "not find "
                print offset fname
                ret
        .endif
        mov dSize, fseek(hFile,0,FILE_END)
        mov hMem, alloc(dSize)

        mov eax , fseek(hFile,0,FILE_BEGIN)
        mov eax , fread(hFile,hMem,dSize)
        mov     dword ptr [findPOS] , 0
        
        ;----find----
        mov     ecx, dSize
        push    ecx
        mov     edx, hMem
        push    edx 
        mov     eax, dword ptr [findLen] 
        push    eax
        mov     ecx, offset findData
        push    ecx
        ;pat patlen textt texttlen
        call qs
        ;printf  ("%d",dword ptr [findPOS])
        
        .if dword ptr [findPOS] == 0
                print "Not find "
                print offset findData,13,10
        .else
                ;----backup file----
                mov hBakFile, fcreate( offset fbakname )
                mov eax , fwrite( hBakFile, hMem, dSize)
                fclose hBakFile

                ;----fix----
                mov eax , fseek(hFile,dword ptr [findPOS],FILE_BEGIN)
                mov eax , fwrite( hFile, offset fixData, dword ptr [fixLen])
                print "Fix "
                print offset fname
                print " success.",13,10
        .endif

        fclose hFile
        free hMem
        ret
openGPCore endp

OUTPUT proc
        mov     eax,dword ptr [esp+4]
        mov     dword ptr [findPOS] , eax
        ret
OUTPUT endp

preQsBc proc
        push    ebp
        mov     ebp,dword ptr [esp+10h]
        push    esi
        mov     esi,dword ptr [esp+10h]
        push    edi
        mov     ecx,100h
        lea     eax,[esi+1]
        mov     edi,ebp
        rep stos dword ptr es:[edi]
        xor     eax,eax
        test    esi,esi
        jle     preQsBc1

        mov     edi,dword ptr [esp+10h]
        mov     ecx,esi
preQsBc2:
        xor     edx,edx
        mov     dl,byte ptr [eax+edi]
        inc     eax
        mov     dword ptr [ebp+edx*4],ecx
        dec     ecx
        cmp     eax,esi
        jl      preQsBc2
preQsBc1:
        pop     edi
        pop     esi
        pop     ebp
        ret

preQsBc endp

qs proc
        sub     esp,404h
        mov     ecx,dword ptr [esp+408h]
        push    ebx
        push    ebp
        mov     ebp,dword ptr [esp+414h]
        lea     eax,[esp+0Ch]
        push    eax
        push    ebp
        push    ecx
        call    preQsBc
        mov     eax,dword ptr [esp+428h]
        add     esp,0Ch
        xor     ebx,ebx
        sub     eax,ebp
        mov     dword ptr [esp+8],eax
        js      qs1

        mov     edx,dword ptr [esp+418h]
        push    esi
        push    edi
qs3:
        mov     esi,dword ptr [esp+418h]
        mov     ecx,ebp
        lea     edi,[ebx+edx]
        xor     eax,eax
        repe cmps byte ptr [esi],byte ptr es:[edi]
        jne     qs2

        push    ebx
        call    OUTPUT
        mov     edx,dword ptr [esp+424h]
        add     esp,4
qs2:
        lea     eax,[edx+ebp]
        xor     ecx,ecx
        mov     cl,byte ptr [eax+ebx]
        mov     eax,dword ptr [esp+10h]
        add     ebx,dword ptr [esp+ecx*4+14h]
        cmp     ebx,eax
        jle     qs3

        pop     edi
        pop     esi
qs1:
        pop     ebp
        pop     ebx
        add     esp,404h
        ret
qs endp
end start
download src
posted @ 2013-04-22 15:05  1CM  阅读(233)  评论(0编辑  收藏  举报