PE64中的FASM DLL问题

时间:2016-04-11 13:44:08

标签: assembly dll import proc fasm

我有这两个程序,最初这两个程序独立运行,但我想在第一个程序中包含第二个代码。

我尝试导出标签,使标签成为proc,将格式指定为DLL,但似乎没有任何对我有用。

我已经挖掘了很多信息,以及很多其他人的fasm规范本身,但并不是所有的东西都告诉我做同样的事情,我尝试过各种各样的组合但是没有#39; t help。

有人可以指出以下代码有什么问题吗? 它组装好,当我不使用从第二个源导入的任何东西时,它也运行正常。当我这样做时,程序返回错误0xc000007b,甚至在执行之前!

这是第一个文件

format PE64

include 'win64a.inc'
;include 'printInt.asm'

entry start

section '.code' code readable executable
start:
    ;call [newline] ;errors

    mov rcx, 317
    mov rdx, 16
    call fromBase10
    mov rcx, rax
    mov r12, rax
    call printArray

    invoke ExitProcess, 0

fromBase10:
    ;rcx -> number
    ;rdx -> base
    mov rax, rcx
    mov r8, rdx
    xor rcx, rcx
    xor rdx, rdx
    .l1:
        inc rcx
        div r8
        push rdx
        xor rdx, rdx
        cmp rax, 0
        jne .l1
    shl rcx, 3
    mov rax, rcx
    add rsp, rcx
    ;stack <- number
    ;rax (, rcx) <- length (bytes)
    ret

toBase10:
    ;rcx -> length (bytes)
    ;rdx -> base
    ;stack -> number
    sub rsp, 8
    mov r8, 1
    xor r9, r9
    mov r10, rdx
    mov r11, rcx
    shr rcx, 3
    .l1:
        mov rax, [rsp]
        sub rsp, 8
        mul r8
        add r9, rax
        mov rax, r8
        mul r10
        mov r8, rax
        dec rcx
        jnz .l1
    add rsp, r11
    add rsp, 8
    mov rax, r9
    ;rax <- number
    ret

printArray:
    ;rcx -> length (bytes)
    ;stack -> array
    sub rsp, rcx
    push r12
    push r13
    add rsp, 16
    mov r13, rcx
    mov r13, rcx
    shr rcx, 3
    mov r12, rcx
    .l1:
        pop rcx
        add rcx, 0x30
        sub rsp, r13    ;ugly, UGLY!!!! :(
        sub rsp, 8
        sub rsp, 32
        call [putchar]
        mov rcx, 0x20
        call [putchar]
        add rsp, 32
        add rsp, 8
        add rsp, r13
        dec r12
        jnz .l1
    sub rsp, r13
    sub rsp, 16
    mov rax, r13
    pop r13
    pop r12
    add rsp, rax
    ;stack <- array
    ret

section '.idata' import data readable writeable
library kernel, 'kernel32.dll',\
    msvcrt, 'msvcrt.dll',\
    printLib, 'printLib.dll'

import kernel, ExitProcess, 'ExitProcess'
import msvcrt, printf, 'printf',\
    putchar, 'putchar'
import printLib, printInt, 'printInt',\
    newline, 'newline'

这是第二个:

format PE64 DLL

entry DllMain

include 'win64a.inc'

section '.text' code readable executable

proc DllMain hinstDLL, fdwReason, lpvReserved
    mov rax, TRUE
    ret
endp

proc printInt integer
    push r10
    push r11
    push r12
    push r13
    push r14
    mov rcx, [integer]
    sub rsp, 32

    mov r12, rcx
    mov r13, 10
    xor r14, r14

    test r12, r12
    jns .e1
        neg r12
        mov rcx, 45
        call [putchar]    
    .e1:

    .l1:
        mov rax, r12
        mov rdx, 0
        div r13

        mov rcx, rdx
        add rcx, 0x30
        mov r12, rax
        push rcx
        inc r14
        test r12, r12
        jnz .l1

    mov r12, r14    
    .l2:
        pop rcx
        sub rsp, 32
        call [putchar]
        add rsp, 32
        dec r14
        jnz .l2

    add rsp, 32
    pop r14
    pop r13
    pop r12
    pop r11
    pop r10
    ret
endp

proc newline
   sub rsp, 32
   mov rcx, 0xa
   call [putchar]
   mov rcx, 0xd
   call [putchar]
   add rsp, 32
   ret
endp

;rdtsc64x:
;   rdtsc
;   shl rdx, 32
;   add rax, rdx
;   mov rdx, 0
;ret

section '.idata' import data readable writeable

library msvcrt, 'msvcrt.dll'

import msvcrt, printf, 'printf',\
    putchar, 'putchar'

section '.edata' data readable
export 'printInt.dll',\
    printInt, 'printInt',\
    newline, 'newline'

data fixups
end data

我完全不知道为什么这不起作用,所有的帮助都会非常感激。 令我困惑的另一件事是,如果我在第一个文件中定义一个程序,它不想组装,有人可以指出为什么会这样吗?

我还想听到的一件事是,如果我返回一个数组的方式绝对是错误的返回类似数组的方式以及应该如何完成。

0 个答案:

没有答案