C++開發NSIS插件,實現NSIS腳本的加解密功能

以前要作一個Windows平臺上的一個安裝包,要求能接受自定義參數,而參數可能會通過編碼加密,因此要求安裝包可以對參數進行decode。可是NSIS腳本並無這方面線程的庫,而NSIS腳本進行大量的字符操做太繁瑣且難以調試,因而決定用c++寫一個NSIS的插件,來擴展NSIS的編解碼加解密的功能。(本文首發與微信公衆號「將來CTO」,歡迎你們關注)c++

 

 

 

 

 

 

 

 

 

 

 

 

NSIS Plugin說到底其實就是一個遵循特定規則進行函數導出的dll文件。在NSIS的Examples\Plugin目錄下,官方已經給出了一個插件開發的demo,能夠看到插件開發的標準樣式。api

 

 

 

 

 

 

 

 

 

 

 

 

這其中nsis目錄下的三個文件,就是NSIS插件開發的所有奧祕所在bash

 

 

 

頭文件源碼很少,並且淺顯易懂。就是定義了一些宏和數據結構,給出了一些c++代碼與NSIS腳本交互的函數聲明,而pluginapi.lib則是這些函數的實現。微信

 

好了,如今是動手的時候了!開發環境:數據結構

系統: win10函數

IDE:  VS2010測試

NSIS:V2.46編碼

新建一個win32 dll工程,將上面看到的nsis目錄拷貝到工程下幷包含到工程中。UrlEnDeCode的頭文件和源文件定義了一個UrlEnDeCode類,能夠進行UrlEncode/UrlDecode。加密

 

 

 

 

 

 

 

 

 

 

而後從dllmain中,用extern "C"的方式,NSIS Plugin規定的函數形式,導出本身的擴展函數,導出函數的必須符合以下原型:插件

void __declspec(dllexport) UrlEncode(
    HWND hwndParent, 
    int string_size, 
    char *variables, 
    stack_t **stacktop,
    extra_parameters *extra
)
#include "stdafx.h"
#include "./../nsis/pluginapi.h"
#include "UrlEnDeCode.h"
#pragma comment(lib,"./../nsis/pluginapi.lib")

extern "C" {
void __declspec(dllexport) UrlEncode(
    HWND hwndParent, 
    int string_size, 
    char *variables, 
    stack_t **stacktop,
    extra_parameters *extra
)
{
    EXDLL_INIT();
    char szUrl[4096];
    popstring(szUrl);

    std::string re = UrlEnDeCode::UrlEncode(szUrl);

    pushstring(re.c_str());
}

void __declspec(dllexport) UrlDecode(
    HWND hwndParent, 
    int string_size, 
    char *variables, 
    stack_t **stacktop,
    extra_parameters *extra
)
{
    EXDLL_INIT();
    char szUrl[4096];
    popstring(szUrl);

    std::string re = UrlEnDeCode::UrlDecode(szUrl);

    pushstring(re.c_str());
}
};

BOOL APIENTRY DllMain( 
    HMODULE hModule, 
    DWORD  ul_reason_for_call, 
    LPVOID lpReserved
)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

 

將編譯以後的dll,拷貝到NSIS的plugins目錄下,就能夠在NSIS腳本中調用了。

 

 

 

 

 

 

在NSIS的腳本中作個測試,安裝包從啓動參數中,獲取通過UrlEncode過的參數,腳本通過decode,而後彈窗顯示。插件裏面函數的調用方法爲:

模塊名:函數名 參數

!include "FileFunc.nsh"
!insertmacro GetParameters
!insertmacro GetOptions

OutFile "NSISEnDeCodeLibTest.exe"

# default section
Section

    ; NSISEnDeCodeLib::UrlEncode "測試"
    ; Pop $0
    ; MessageBox MB_OK "ret = $0"
    ${GetParameters} $R0
    ClearErrors
    ${GetOptions} $R0 "/Test" $0
    MessageBox MB_OK "Test = $0 "
    NSISEnDeCodeLib::UrlDecode $0
    Pop $0
    MessageBox MB_OK "$0"

SectionEnd

 

編譯生成安裝包,並傳遞測試參數進行啓動:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本例只是簡單的說明了一下,NSIS插件開發的基本流程和方法,並且只簡單給出了UrlEncode/UrlDecode的方法。可是按照這條路走下去,Base64,MD5,3DES都是很是簡單容易實現的。而這些功能,對於軟件公司的推廣和數據統計分析,都是具備很大的使用價值的。

相關文章
相關標籤/搜索