当前位置: 首页 > 知识库问答 >
问题:

golang 调用第三方dll(逆向)?

辛锦
2024-07-01

dll来源: https://www.irfanview.com/plugins.htm#UpdatedPlugins
我想调用WebP.dll来解析webp的图片提供给web页面展示,webp只是测试,目标格式为psd、jxl等浏览器不支持的格式

IDA:

Name    Address    Ordinal
GetPlugInInfo    00000001800012E0    1
ReadAnimatedWebP_W    0000000180001380    2
ReadWebP_W    0000000180001840    3
SaveWebP_W    0000000180002000    4
ScanWEBP_W    00000001800023E0    5
ShowPlugInSaveOptions_W    0000000180002580    6
DllEntryPoint    0000000180066DFC    [main entry]

比如这个

ScanWEBP_W

; Exported entry   5. ScanWEBP_W



; __int64 __fastcall ScanWEBP_W(wchar_t *FileName)
public ScanWEBP_W
ScanWEBP_W proc near

var_128= qword ptr -128h
var_120= qword ptr -120h
var_118= byte ptr -118h
var_10C= dword ptr -10Ch
var_50= dword ptr -50h
var_28= qword ptr -28h
var_18= qword ptr -18h
arg_8= qword ptr  10h
arg_10= qword ptr  18h

; __unwind { // __GSHandlerCheck
push    rbx
push    rbp
sub     rsp, 138h
mov     rax, cs:__security_cookie
xor     rax, rsp
mov     [rsp+148h+var_28], rax
mov     rbx, rcx
lea     rcx, [rsp+148h+var_118]
mov     edx, 209h
xor     ebp, ebp
call    sub_180003AD0
test    eax, eax
jz      loc_180002562

ReadWebP_W

; Exported entry   3. ReadWebP_W


; Attributes: bp-based frame fpd=0F0h

; __int64 __usercall ReadWebP_W@<rax>(wchar_t *FileName@<rcx>, __int64)
public ReadWebP_W
ReadWebP_W proc near

var_1D0= dword ptr -1D0h
var_1C0= byte ptr -1C0h
var_1BF= byte ptr -1BFh
var_1BE= byte ptr -1BEh
Block= qword ptr -1B8h
var_1B0= qword ptr -1B0h
var_1A8= qword ptr -1A8h
hMem= qword ptr -1A0h
var_198= qword ptr -198h
var_190= qword ptr -190h
var_180= byte ptr -180h
var_170= dword ptr -170h
var_16C= dword ptr -16Ch
var_158= qword ptr -158h
var_150= qword ptr -150h
var_148= dword ptr -148h
var_130= dword ptr -130h
var_12C= dword ptr -12Ch
var_128= dword ptr -128h
var_124= dword ptr -124h
var_120= dword ptr -120h
var_108= dword ptr -108h
var_104= dword ptr -104h
var_100= dword ptr -100h
Src= qword ptr -0F8h
var_F0= dword ptr -0F0h
var_74= dword ptr -74h
var_70= dword ptr -70h
var_6C= dword ptr -6Ch
var_68= dword ptr -68h
var_40= qword ptr -40h
var_30= qword ptr -30h
arg_8= qword ptr  18h
arg_20= qword ptr  30h

; __unwind { // __GSHandlerCheck
push    rbp
push    rbx
push    rsi
push    rdi
push    r13
push    r15
lea     rbp, [rsp-0C8h]
sub     rsp, 1C8h
mov     rax, cs:__security_cookie
xor     rax, rsp
mov     [rbp+0F0h+var_40], rax
mov     rsi, [rbp+0F0h+arg_20]
mov     rdi, r8
xor     r8d, r8d
mov     r15, rcx
lea     rcx, aUnknownWebpFil ; "Unknown WebP file"
mov     rdx, rdi
mov     r13, r9
mov     [rsp+1F0h+var_1A8], r8
sub     rdx, rcx
xchg    ax, ax

但我尝试调用程序就崩溃了(我没有相关知识,代码来源网络)

handle, _ := syscall.LoadLibrary("d:/WebP.dll")
defer syscall.FreeLibrary(handle)

p, _ := syscall.GetProcAddress(handle, "ScanWEBP_W")

wcFileName, _ := syscall.UTF16PtrFromString("d:/0.webp")

ret, _, err := syscall.SyscallN(p, uintptr(unsafe.Pointer(wcFileName)))

// // 检查错误
// if err != nil {
//     panic(err)
// }
// r1, r2, errorNo := syscall.SyscallN(p)
fmt.Println(int64(ret), err)

请问我该怎么调用呢?
谢谢

共有1个答案

公羊嘉
2024-07-01

WebP.dll不确定这个dll是否正确。

如果你要用go解析webp或者psd等格式的图片转为png,可以使用go的库完成。

webp转为png

package main

import (
    "fmt"
    "github.com/chai2010/webp"
    "image"
    "image/png"
    "os"
)

func webpToPng(webpPath string, pngPath string) {
    // 打开 webp 文件
    file, err := os.Open(webpPath)
    if err!= nil {
        fmt.Println("Error opening webp file:", err)
        return
    }
    defer file.Close()

    // 解码 webp 图像
    img, err := webp.Decode(file)
    if err!= nil {
        fmt.Println("Error decoding webp image:", err)
        return
    }

    // 创建 png 文件
    outFile, err := os.Create(pngPath)
    if err!= nil {
        fmt.Println("Error creating png file:", err)
        return
    }
    defer outFile.Close()

    // 编码为 png 格式
    err = png.Encode(outFile, img)
    if err!= nil {
        fmt.Println("Error encoding to png:", err)
        return
    }
}

func main() {
    webpFile := "your_webp_file.webp"
    pngFile := "converted.png"
    webpToPng(webpFile, pngFile)
}

psd转为png

package main

import (
    "fmt"
    "github.com/akavel/rsrc"
    "image"
    "image/png"
    "os"
)

func parsePSDToPNG(psdPath string, pngPath string) {
    // 打开 PSD 文件
    file, err := os.Open(psdPath)
    if err!= nil {
        fmt.Println("Error opening PSD file:", err)
        return
    }
    defer file.Close()

    img, _, err := image.Decode(file)
    if err!= nil {
        fmt.Println("Error decoding PSD image:", err)
        return
    }

    // 创建 PNG 文件
    outFile, err := os.Create(pngPath)
    if err!= nil {
        fmt.Println("Error creating PNG file:", err)
        return
    }
    defer outFile.Close()

    // 编码为 PNG 格式
    err = png.Encode(outFile, img)
    if err!= nil {
        fmt.Println("Error encoding to PNG:", err)
        return
    }
}

func main() {
    psdFile := "your_psd_file.psd"
    pngFile := "converted.png"
    parsePSDToPNG(psdFile, pngFile)
}
 类似资料:
  • 问题内容: 我正在编写一个调用Windows DLL的Go应用程序。该DLL是用MSVC编写的,并且使用__declspec(dllexport)具有外部“ C”导出。 我的Go应用程序的顶部如下: 我从这样的模块中调用函数: 问题是,当我尝试运行此应用程序时,出现以下错误: 我用DUMPBIN查看了DLL导出的符号,它确切显示了“moduleImpl_len”作为导出的符号。这也是MyModul

  • 我提供了一个第三方sdk。dll和tlb。它可以与WPF一起工作,但当我将其添加到UWP项目时,一旦我到达使用它抛出的sdk的屏幕 使用CoCreateInstanceFromApp的具有CLSID{DBA84AA0-3342-4AF0-96ED-3D8D08D544F3}的COM组件实例由于以下错误而失败:80040154类未注册(HRESULT的例外:0x80040154(REGDB_E_CL

  • 在本章中,我们将查看 Android 应用程序或.apk文件,并了解其不同的组件。 我们还将使用工具(如 Apktool,dex2jar 和 jd-gui)来逆向应用程序。 我们将进一步学习如何通过逆向和分析源代码来寻找 Android 应用程序中的各种漏洞。 我们还将使用一些静态分析工具和脚本来查找漏洞并利用它们。 3.1 Android 应用程序拆解 Android 应用程序是在开发应用程序时

  • 我是保险丝骆驼的新手,cxf。 我想调用第三方web服务。我不想使用wsld2java或serviceclass。我有一个wsdl。 下面是进行通用 Web 服务调用的要求 json请求数据- 1.如何将json转换为soaprequest(xml),反之亦然(Marshall格式soapjxab需要jaxb注释类)2.如何在有效负载模式下调用soap。。 任何帮助(链接/示例)将不胜感激。 谢谢

  • 参数是前台传过来的,路径自带引号,考虑到空格问题,不能去 我知道可以不经过cmd调用,但出于个人理由此处不使用 输出结果为: 2024/03/19 17:38:41 exit status 1: �ļ�����Ŀ¼���������﷨����ȷ�� 乱码我已经放弃了,谷歌了很久没有能解决的,大家有好办法欢迎回答。 改为 很神奇,不报错了,但乱码还是不变的——虽然不知道什么内容 还有一个尝试: 修改

  • 在Xamarin中以发布模式运行我的应用程序时,我在仅链接SDK程序集上遇到以下错误: /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets:错误:执行任务时出错:错误XA2006:引用元数据项'System.IO.端口。SerialPort(在EftPay

  • 本文向大家介绍Angular5中调用第三方js插件的方法,包括了Angular5中调用第三方js插件的方法的使用技巧和注意事项,需要的朋友参考一下 话不多说直入主题,最常见的有三种方式来引用第三方插件,下面以jquery插件及基于JQuery的两款插件:nicescroll和rangeSlider为例。 一、第一种方式:在.angular-cli.json文件中配置 步骤: 1.在项目根目录.an

  • 云联壹云平台支持对接第三方工单系统。 目前仅支持对接JIRA工单系统,且只有技术支持工单支持对接第三方工单系统。 第三方工单使用流程如下: 在系统配置-工单-第三方工单中对接第三方工单系统。 在工单配置中-配置技术支持工单,支持对接第三方工单系统。 用户提交的技术支持工单都需要第三方工单系统进行审批处理等。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “系统配置/工单/第三方”