打印
[实用程序源码及工具软件]

Rust语言调用动态链接库DLL例程源码(独家在21ic发表)

[复制链接]
347|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2023-9-19 14:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hotpower 于 2023-9-22 14:26 编辑

菜农电子淘宝:https://hotcomlock.taobao.com/ 准备出书:http://hotcomlock.com/hotcomlock.html
extern crate libc;
extern crate libloading;

use std::ptr::null;

use libc::*;
use libloading::{Library, Symbol};
//use std::env;

type PEA256Init = unsafe extern "C" fn() -> bool;
type PEA256Open = unsafe extern "C" fn() -> *const c_void;
type PEA256Close = unsafe extern "C" fn(handle: *const c_void);
type PEA256UserKey = unsafe extern "C" fn(handle: *const c_void, keystr: *const c_uchar, keybuff: *const c_uchar, keyfile: *const c_uchar) -> u32;
type PEA256UserKeyStr = unsafe extern "C" fn(handle: *const c_void, keystr: *const c_uchar) -> u32;
type PEA256UserKeyBuff = unsafe extern "C" fn(handle: *const c_void, keybuff: *const c_uchar) -> u32;
type PEA256UserKeyFile = unsafe extern "C" fn(handle: *const c_void, keyfile: *const c_uchar) -> u32;
type PEA256EncryptUserKey = unsafe extern "C" fn(handle: *const c_void, keystr: *const c_uchar, keybuff: *const c_uchar, keyfile: *const c_uchar) -> u32;
type PEA256DecryptUserKey = unsafe extern "C" fn(handle: *const c_void, keystr: *const c_uchar, keybuff: *const c_uchar, keyfile: *const c_uchar) -> u32;
type PEA256EncryptBytes = unsafe extern "C" fn(handle: *const c_void, bytes: *mut c_uchar, len: u32, subkey: u32) -> u32;
type PEA256DecryptBytes = unsafe extern "C" fn(handle: *const c_void, bytes: *mut c_uchar, len: u32, subkey: u32) -> u32;
type PEA256EncryptBytesEx = unsafe extern "C" fn(handle: *const c_void, inbytes: *const c_uchar, outbytes: *mut c_uchar, len: u32, subkey: u32) -> u32;
type PEA256DecryptBytesEx = unsafe extern "C" fn(handle: *const c_void, inbytes: *const c_uchar, outbytes: *mut c_uchar, len: u32, subkey: u32) -> u32;
type PEA256EncryptArrayEx = unsafe extern "C" fn(handle: *const c_void, inbytes: *const c_uchar, outbytes: *mut c_uchar, index: u32, len: u32, subkey: u32) -> u32;
type PEA256DecryptArrayEx = unsafe extern "C" fn(handle: *const c_void, inbytes: *const c_uchar, outbytes: *mut c_uchar, index: u32, len: u32, subkey: u32) -> u32;
type PEA256Test = unsafe fn() -> bool;
type PEA256Error = unsafe fn() -> i32;
type PEA256Version = unsafe fn() -> u32;

fn main() {
    //let lib = Library::new("D:\\libpea256x64\\libpea256x64.dll").expect("Library失败!!!");
    let lib = Library::new("D:\\PEA256COM\\x64\\Release\\libpea256x64.dll").unwrap();
    unsafe {
        let pea256Init: Symbol<PEA256Init> = lib.get(b"PEA256Init").unwrap();
        let pea256Open: Symbol<PEA256Open> = lib.get(b"PEA256Open").unwrap();
        let pea256Close: Symbol<PEA256Close> = lib.get(b"PEA256Close").unwrap();
        let pea256UserKey: Symbol<PEA256UserKey> = lib.get(b"PEA256UserKey").unwrap();
        let pea256UserKeyStr: Symbol<PEA256UserKeyStr> = lib.get(b"PEA256UserKeyStr").unwrap();
        let pea256UserKeyBuff: Symbol<PEA256UserKeyBuff> = lib.get(b"PEA256UserKeyBuff").unwrap();
        let pea256UserKeyFile: Symbol<PEA256UserKeyFile> = lib.get(b"PEA256UserKeyFile").unwrap();
        let pea256EncryptUserKey: Symbol<PEA256EncryptUserKey> = lib.get(b"PEA256EncryptUserKey").unwrap();
        let pea256DecryptUserKey: Symbol<PEA256DecryptUserKey> = lib.get(b"PEA256DecryptUserKey").unwrap();
        let fSP256EncryptBytes: Symbol<PEA256EncryptBytes> = lib.get(b"PEA256EncryptBytes").unwrap();
        let fSP256DecryptBytes: Symbol<PEA256DecryptBytes> = lib.get(b"PEA256DecryptBytes").unwrap();
        let fSP256EncryptBytesEx: Symbol<PEA256EncryptBytesEx> = lib.get(b"PEA256EncryptBytesEx").unwrap();
        let fSP256DecryptBytesEx: Symbol<PEA256DecryptBytesEx> = lib.get(b"PEA256DecryptBytesEx").unwrap();
        let fSP256EncryptArrayEx: Symbol<PEA256EncryptArrayEx> = lib.get(b"PEA256EncryptArrayEx").unwrap();
        let fSP256DecryptArrayEx: Symbol<PEA256DecryptArrayEx> = lib.get(b"PEA256DecryptArrayEx").unwrap();
        let pea256Test: Symbol<PEA256Test> = lib.get(b"PEA256Test").unwrap();
        let fSP256Error: Symbol<PEA256Error> = lib.get(b"PEA256Error").unwrap();
        let fSP256Version: Symbol<PEA256Version> = lib.get(b"PEA256Version").unwrap();
        if pea256Init() {
            pea256Test();
            let handle: *const c_void = pea256Open();
            if handle != null() {
                let mut Array: [u8; 4] = [0, 1, 2, 3];
                let mut ArrayEncrypt: [u8; 4] = [0, 1, 2, 3];
                let mut ArrayDecrypt: [u8; 4] = [0, 0, 0, 0];
                let subkey:u32 = pea256UserKey(handle, "123\0".as_ptr(), "\0".as_ptr(), "".as_ptr());
                println!("subkey1=0x{:08X}", subkey);
               
                fSP256EncryptBytes(handle, Array.as_mut_ptr(), 4, subkey);
                for data in &Array {
                                        print!(" {:02X}", data);
                                }
                println!("");

                fSP256DecryptBytes(handle, Array.as_mut_ptr(), 4, subkey);
                for data in &Array {
                                        print!(" {:02X}", data);
                                }
                println!("");
                                let mut sum = 0;
                                for i in 0..4 {
                                        sum ^= i ^ (Array[i] as usize);//简单的异或和校验
                                }
                                if sum != 0 {
                                        println!("加解密1错误!!!");
                                }
                                else {
                                        println!("加解密1正确!!!");
                                }

                let subkey:u32 = pea256UserKey(handle, "\0".as_ptr(), "0123456789ABCDEF0123456789ABCDEF\0".as_ptr(), "".as_ptr());
                println!("subkey2=0x{:08X}", subkey);

                fSP256EncryptBytesEx(handle, ArrayEncrypt.as_ptr(), ArrayDecrypt.as_mut_ptr(), 4, subkey);
                for data in &ArrayDecrypt {
                                        print!(" {:02X}", data);
                                }
                println!("");

                fSP256DecryptBytesEx(handle, ArrayDecrypt.as_ptr(), ArrayEncrypt.as_mut_ptr(), 4, subkey);
                for data in &ArrayEncrypt {
                                        print!(" {:02X}", data);
                                }
                println!("");
                                let mut sum = 0;
                                for i in 0..4 {
                                        sum ^= i ^ (ArrayEncrypt[i] as usize);//简单的异或和校验
                                }
                                if sum != 0 {
                                        println!("加解密2错误!!!");
                                }
                                else {
                                        println!("加解密2正确!!!");
                                }

                //let subkey:u32 = pea256UserKeyFile(handle, b"D:\\libpea256x64\\123.PEA.KEY\0".as_ptr());
                let subkey:u32 = pea256UserKeyFile(handle, b"D:\\libpea256x64\\libpea256x64.dll\0".as_ptr());
                //let subkey:u32 = pea256UserKey(handle, "\0".as_ptr(), "\0".as_ptr(), "D:\\libpea256x64\\libpea256x64.dll\0".as_ptr());
                //let subkey:u32 = pea256UserKey(handle, "123\0".as_ptr(), "\0".as_ptr(), "".as_ptr());
                println!("subkey3=0x{:08X}", subkey);

                fSP256EncryptArrayEx(handle, ArrayEncrypt.as_ptr(), ArrayDecrypt.as_mut_ptr(), 0, 4, subkey);
                for data in &ArrayDecrypt {
                                        print!(" {:02X}", data);
                                }
                println!("");

                fSP256DecryptArrayEx(handle, ArrayDecrypt.as_ptr(), ArrayEncrypt.as_mut_ptr(), 0, 4, subkey);
                for data in &ArrayEncrypt {
                                        print!(" {:02X}", data);
                                }
                println!("");
                                let mut sum = 0;
                                for i in 0..4 {
                                        sum ^= i ^ (ArrayEncrypt[i] as usize);//简单的异或和校验
                                }
                                if sum != 0 {
                                        println!("加解密3错误!!!");
                                }
                                else {
                                        println!("加解密3正确!!!");
                                }
            
                pea256Close(handle);
                fSP256Error();
                println!("PEA256COM!!!");
            } else {
                println!("调用PEA256Open()失败!");
            }
        } else {
            println!("调用PEA256Init()失败!");
        }
        println!("Hello, world!");
    }
}


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:[url=http://www.21ic.com/tools/HotWC3_V1.23.html]

1538

主题

21697

帖子

506

粉丝