如何处理:应用程序无法从我的dll中看到func

问题描述 投票:1回答:1

应用程序未从我的dll中看到func

创建了一个dll和一个应用程序来从dll测试proc。

程序计算一个字符的重复次数。

代码:

dll:

.586
.model flat, stdcall
option casemap: none 

include C:\masm32\include\windows.inc 
include C:\masm32\include\user32.inc 
include C:\masm32\include\msvcrt.inc

includelib C:\masm32\lib\msvcrt.lib
includelib C:\masm32\lib\user32.lib 

.data
msg_string db 'Enter string: ', 0
msg_symbol db 'Enter symbol: ', 0
result db 'Count = %d', 0
str_modifier db '%s', 0
sym_modifier db '%c', 0

.data
string db ?
symbol db ?

.code
DllEntry PROC hInstDLL:DWORD, reason:DWORD, reserved:DWORD  
    mov  eax, 1  
    ret 
DllEntry ENDP 

symbol_count PROC  

    invoke crt_printf, OFFSET msg_string
    invoke crt_scanf, OFFSET str_modifier, OFFSET string
    invoke crt_printf, OFFSET msg_symbol
    invoke crt_scanf, OFFSET sym_modifier, OFFSET symbol

    xor esi, esi
    xor ecx, ecx

    mov ebx, OFFSET string
    mov ecx, eax
    mov al, symbol
loop1:
    cmp byte ptr [ebx + ecx], 0
    je endloop
    cmp al, byte ptr [ebx + ecx]
    jne next
    inc esi
next:
    inc ecx
    jmp loop1 
endloop:

    invoke crt_printf, OFFSET result, esi

    ret 

symbol_count ENDP 

End DllEntry

如果我有更好的编码方法,也请告诉我。在互联网上很难找到所需的信息。谢谢。

测试应用程序:

.586
.model flat, stdcall
option casemap: none 

include C:\masm32\include\windows.inc 
include C:\masm32\include\user32.inc 
include C:\masm32\include\msvcrt.inc

includelib C:\masm32\lib\msvcrt.lib
includelib C:\masm32\lib\user32.lib 

LoadLibraryA proto LibName:DWORD
GetProcAddress proto hLib:DWORD, FunctionName:DWORD
FreeLibrary proto hLib:DWORD
ExitProcess proto uExitCode:DWORD

.data
LibName db 'Labor07.dll', 0
FunctionName db 'symbol_count', 0
DllNotFound db 'cannot find the dll', 0
AppName db 'Load explicit dll', 0
NotFound db 'Func is not found', 0
msg db 'Hello', 0
hLib dd ?
symbol_count_addr dd ?

.code
start:

    invoke LoadLibraryA, addr LibName
    .if eax == NULL
        invoke MessageBoxA, NULL, addr DllNotFound, addr AppName, MB_OK
    .else
        mov hLib, eax
        invoke GetProcAddress, hLib, addr FunctionName 
        .if eax == NULL
            invoke MessageBoxA, NULL, addr NotFound, addr AppName, MB_OK
        .else
            push offset msg 
            mov symbol_count_addr, eax 
            call [symbol_count_addr] 
        .endif
        invoke FreeLibrary, hLib 
    .endif 
    invoke ExitProcess, NULL 
end start

结果是消息框:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9lY1ZNOC5wbmcifQ==” alt =“在此处输入图像描述”>

visual-studio assembly dll masm dllimport
1个回答
0
投票

labor07.dll使用STDCALL(.model flat, stdcall)。因此,将对功能名称进行修饰:_symbol_count@0

更改

FunctionName db 'symbol_count', 0

to

FunctionName db '_symbol_count@0', 0

另外,必须导出功能symbol_count

更改

symbol_count PROC

to

symbol_count PROC EXPORT
© www.soinside.com 2019 - 2024. All rights reserved.