2012-08-29 57 views
3

是否可以模仿loadlibrary函數?我想從BLOB字段中加載一個庫,而不先寫入臨時文件,而且我需要一個不依賴於特定版本的delphi編譯器或Windows的解決方案,並且不會觸發防病毒軟件。如何在delphi中直接從內存中執行代碼?

+2

「並且不觸發反病毒軟件」 - 可悲的是,一些反病毒軟件實際上已經對使用Delphi編寫的程序發出了警告,只有「Delphi編寫的」是可疑的部分。 – hvd

+0

這是官方不受支持的。有黑客可用,但他們真的是黑客。 –

+0

接受的加密方式是將算法代碼放入您的應用程序中,但要保護密鑰。看起來你也試圖保護算法。我不認爲這比保護關鍵更強。無論如何,一旦你將它加載到內存中,你就沒有保護。黑客可以閱讀你的記憶。您需要密鑰才能保留在安全設備上。 –

回答

5

dzlib包含一個現成的對象從資源到內存中讀取一個DLL,並使用它,沒有它永遠保存到光盤:

這是主要的文件...

http://sourceforge.net/p/dzlib/code/147/tree/dzlib/trunk/src/u_dzResourceDllLoader.pas

..但它從同一個倉庫需要其他文件。

+0

我用它編寫了一個快速模擬應用程序,它工作...本週末我將嘗試使用初始化/終止代碼加載一些複雜的DLL,並在我知道我的客戶正在使用的幾個Windows版本上檢查它們。但看起來這個圖書館的確有竅門。 Vielen Dank :-) –

+3

但是請務必注意這是MS官方不支持的。這是一個黑客,並期望它在未來回來並咬你。 –

6

是的,你可以,你不需要loadlibrary從內存中執行代碼 - 你需要使用VirtualAlloc功能與PAGE_EXECUTE標誌設置


更新來分配內存:這裏是一個快速和骯髒演示從內存的32位德爾福執行的代碼 - 我只測試了它的工作原理:

type 
    TIncMe = procedure(var I: Integer); 

var 
    IncMeProc: TIncMe; 

procedure IncMe(var I: Integer); 
begin 
    Inc(I); 
end; 

procedure CopyIncMe; 
var 
    Size: LongWord; 
    Tmp: Pointer; 

begin 
    Size:= LongWord(@CopyIncMe) - LongWord(@IncMe); 
    Tmp:= VirtualAlloc(nil, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE); 
    Move(Pointer(@IncMe)^, Tmp^, Size); 
    IncMeProc:= Tmp; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    J: Integer; 

begin 
    J:= 0; 
    CopyIncMe; 
    while J < 10 do begin 
    IncMeProc(J); 
    ShowMessage(IntToStr(J)); 
    end; 
    VirtualFree(@IncMeProc, 0, MEM_RELEASE); 
end; 
+0

您能否提供一個工作代碼,請使用C++或Delphi? –

+1

如果這是一個DLL你需要做更多 –

+0

我想我可以使用它。我有一個解密函數,它從DB中讀取BLOB字段,將它寫入臨時文件,然後用'loadlibrary'加載它。使用上面的代碼,我可以將我的加密功能存儲在智能卡中,並將其直接加載到內存中。 –

4

有上delphi.about.com的文章,顯示瞭如何從資源加載DLL。

它首先加載資源到內存中,然後加載使用Memory Module

取而代之的是資源,你可以使用一個數據庫或任何源要加載從DLL資源DLL。一旦它在內存流,你可以使用下面的代碼加載和執行的DLL函數,它看起來非常像「正​​常」的代碼來調用一個dll:

var 
    btMM: PBTMemoryModule; 
begin 
    btMM := BTMemoryLoadLibary(mp_DllData, m_DllDataSize); 
    try 
    if btMM = nil then Abort; 
    @m_TestCallstd := BTMemoryGetProcAddress(btMM, 'TestCallstd'); 
    if @m_TestCallstd = nil then Abort; 
    m_TestCallstd('This is a Dll Memory call!'); 
    except 
    Showmessage('An error occoured while loading the dll: ' + BTMemoryGetLastError); 
    end; 
    if Assigned(btMM) then BTMemoryFreeLibrary(btMM); 
end; 
+0

我在[link] https://nodeload.github.com/jasonpenny/democode/zipball/master [/ link]上下載了演示,但它在BTMemoryModule.pas的第461行失敗:'l_successfull:= l_DllEntry(Cardinal l_code),DLL_PROCESS_ATTACH,零);'與訪問衝突。我相信代碼是特定於編譯器版本和/或Windows版本的。 –

相關問題