⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 encodetodb.asm

📁 很著名的MicroJoinerv1.6捆绑工具源代码,很不错
💻 ASM
字号:
; ----------------------------------------
;
;  (C) Alex Demchenko (coban2k@mail.ru)
;          http://www.cobans.net
;
; ----------------------------------------




; #########################################################################

        .386
        .model flat, stdcall
        option casemap :none   ; case sensitive

; #########################################################################

        include kernel32.inc
        include windows.inc
        include shlwapi.inc

        includelib kernel32.lib
        includelib user32.lib
        includelib shlwapi.lib

; #########################################################################

.data
        szOpenError     db  "Could not open file for reading: %s",0
        szWriteError    db  "Could not open file for writing: %s",0
        szTrimC         db  '" ', 0
        szExt           db  ".inc",0    
        szFmt           db  "db %03Xh",13,10,0
        szHeader        db  ".data",13,10,13,10,"%sLen equ %lu",13,10,"%s ",0
        szOutFmt        db  "Encoding %lu bytes...",0

.data?
        lpArgs  dd      ?
        lpStr   db      1024 dup(?)
        lpBuf   db      1024 dup(?)
        lpFun   db      1024 dup(?)

.code

Write proc uses ebx lpszText: DWORD
        LOCAL   dwWritten: DWORD
        invoke  GetStdHandle, STD_OUTPUT_HANDLE
        mov     ebx, eax
        invoke  lstrlen, lpszText
        mov     edx, eax
        invoke  WriteFile, ebx, lpszText, edx, addr dwWritten, NULL
        ret
Write endp

WriteLn proc lpszText: DWORD
        LOCAL   ln: DWORD
        invoke  Write, lpszText
        mov     ln, 0D0Ah
        invoke  Write, addr ln
        ret
WriteLn endp

; Returns ptr to the argument str, else returns NULL
GetArgStr proc uses esi edi ebx
        LOCAL   IsQuoted: DWORD
        mov     IsQuoted, FALSE

        mov     esi, lpArgs
        xor     ebx, ebx
        mov     edi, offset lpStr

@ltrim:
        cmp     byte ptr[esi], 0
        jz      @quit
        .IF     byte ptr[esi] == ' '
                inc     esi
                jmp     @ltrim
        .ELSEIF byte ptr[esi] == '"'
                mov     IsQuoted, TRUE
                inc     esi
        .ENDIF

@lcpy:
        lodsb
        stosb
        test    al, al
        jz      @ok

        .IF     IsQuoted
                cmp     al, '"'
        .ELSE
                cmp     al, ' '
        .ENDIF
        jz      @ok
        jmp     @lcpy

@ok:
        xor     eax, eax
        stosb
        mov     ebx, offset lpStr

@quit:
        .IF     ebx != 0
                mov     eax, offset szTrimC
                .IF     !IsQuoted
                        inc     eax
                .ENDIF
                invoke  StrTrim, ebx, eax
                
        .ENDIF
        mov     lpArgs, esi
        mov     eax, ebx
        ret
GetArgStr endp

FunStuff proc lpFile, dwSize: DWORD
        invoke  StrRChr, lpFile, NULL, '\'
        .IF     eax
                mov     edx, eax
                inc     edx
        .ELSE
                mov     edx, lpFile
        .ENDIF
        push    edx
        invoke  wsprintf, offset lpBuf, offset szOutFmt, dwSize
        invoke  WriteLn, offset lpBuf
        pop     edx
        invoke  wsprintf, offset lpBuf, offset szHeader, edx, dwSize, edx
        ret
FunStuff endp

ProcessFile proc uses esi ebx lpFile: DWORD
        LOCAL   hFile, hFile2, bRead, bWritten: DWORD

        invoke  CreateFile, lpFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0
        mov     hFile, eax
        inc     eax
        .IF     ZERO?
                invoke  wsprintf, offset lpBuf, offset szOpenError, lpFile
                invoke  WriteLn, offset lpBuf
                ret
        .ENDIF
        
        invoke  StrRChr, lpFile, NULL, '.'
        .IF     eax
                mov     byte ptr[eax], 0
                push    eax
                invoke  lstrcpy, offset lpFun, lpFile
                pop     eax
                push    dword ptr[szExt]
                pop     [eax]
                mov     byte ptr[eax+4], 0
        .ELSE
                invoke  lstrcpy, offset lpFun, lpFile
                invoke  lstrcat, lpFile, offset szExt
        .ENDIF
        invoke  CreateFile, lpFile, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, 0, 0
        mov     hFile2, eax
        inc     eax
        .IF     ZERO?
                invoke  wsprintf, offset lpBuf, offset szWriteError, lpFile
                invoke  WriteLn, offset lpBuf
                jmp     @close_r
        .ENDIF

        ; Write header
        invoke  GetFileSize, hFile, NULL
        test    eax, eax
        jle     @close_w
        invoke  FunStuff, offset lpFun, eax
        invoke  lstrlen, offset lpBuf
        mov     edx, eax
        invoke  WriteFile, hFile2, offset lpBuf, edx, addr bWritten, NULL

        ; Write db bytes
@work:
        invoke  ReadFile, hFile, lpFile, 1024, addr bRead, NULL
        cmp     bRead, 0
        jz      @close_w

        mov     ebx, bRead
        mov     esi, lpFile

@wloop:
        invoke  wsprintf, offset lpBuf, offset szFmt, byte ptr[esi]
        invoke  lstrlen, offset lpBuf
        mov     edx, eax
        invoke  WriteFile, hFile2, offset lpBuf, edx, addr bWritten, NULL
        inc     esi
        dec     ebx
        jnz     @wloop
                
        jmp     @work

@close_w:
        invoke  CloseHandle, hFile2
@close_r:
        invoke  CloseHandle, hFile
        ret
ProcessFile endp

start:
        mov     byte ptr[lpStr], 0
        invoke  GetCommandLine
        mov     lpArgs, eax

        call    GetArgStr
        call    GetArgStr
        .IF     eax
                invoke  ProcessFile, eax
        .ENDIF

        invoke  ExitProcess, 0
end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -