是否可以模仿loadlibrary
函數?我想從BLOB字段中加載一個庫,而不先寫入臨時文件,而且我需要一個不依賴於特定版本的delphi編譯器或Windows的解決方案,並且不會觸發防病毒軟件。如何在delphi中直接從內存中執行代碼?
回答
dzlib包含一個現成的對象從資源到內存中讀取一個DLL,並使用它,沒有它永遠保存到光盤:
這是主要的文件...
http://sourceforge.net/p/dzlib/code/147/tree/dzlib/trunk/src/u_dzResourceDllLoader.pas
..但它從同一個倉庫需要其他文件。
我用它編寫了一個快速模擬應用程序,它工作...本週末我將嘗試使用初始化/終止代碼加載一些複雜的DLL,並在我知道我的客戶正在使用的幾個Windows版本上檢查它們。但看起來這個圖書館的確有竅門。 Vielen Dank :-) –
但是請務必注意這是MS官方不支持的。這是一個黑客,並期望它在未來回來並咬你。 –
是的,你可以,你不需要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;
您能否提供一個工作代碼,請使用C++或Delphi? –
如果這是一個DLL你需要做更多 –
我想我可以使用它。我有一個解密函數,它從DB中讀取BLOB字段,將它寫入臨時文件,然後用'loadlibrary'加載它。使用上面的代碼,我可以將我的加密功能存儲在智能卡中,並將其直接加載到內存中。 –
有上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;
我在[link] https://nodeload.github.com/jasonpenny/democode/zipball/master [/ link]上下載了演示,但它在BTMemoryModule.pas的第461行失敗:'l_successfull:= l_DllEntry(Cardinal l_code),DLL_PROCESS_ATTACH,零);'與訪問衝突。我相信代碼是特定於編譯器版本和/或Windows版本的。 –
- 1. 如何使用mybatis直接從java代碼執行查詢?
- 2. 如何在更少的內存中執行大代碼?
- 3. 如何在linux中直接執行jar?
- 4. 在react-router中,如何直接從代碼API調用鏈接?
- 5. 直接在Vim中運行python代碼
- 6. 如何從Delphi執行MSBuild?
- 7. XCode:如何用代碼直接在內容中填充UIPickerView?
- 8. 直接從代碼
- 9. 如何讓gcc只生成可以直接加載到內存中並執行的機器代碼?
- 10. 如何在C#中執行Javascript代碼
- 11. 如何在django代碼中執行logging.DEBUG?
- 12. 如何在Silverlight中執行此代碼?
- 13. 如何在delphi中執行javascript?
- 14. 如何在Delphi中執行ConnectionPoint?
- 15. Delphi Web腳本:如何在執行上下文中從Delphi代碼調用腳本函數?
- 16. 從代碼到直接查詢的命令執行時間
- 17. 直接從Otter腳本執行C#代碼
- 18. 如何直接從終端/命令行運行Go(lang)代碼?
- 19. 如何直接從命令行執行maven插件執行?
- 20. 如何在html內容中執行Ruby代碼
- 21. 如何在Apache HttpRequestHandler中完成連接時執行代碼
- 22. 如何在C++代碼執行過程中連接dll文件?
- 23. 代碼如何存儲在可執行文件中?
- 24. 如何在可執行文件中存儲C++源代碼?
- 25. 如何在Sublime Text 2中直接從python解釋器運行代碼?
- 26. javascript - 在代碼中執行代碼?
- 27. 如何在Delphi代碼中獲取存儲過程的SQL內容?
- 28. 直接從(共享)內存中執行二進制/ elf文件C
- 29. 如何在執行中獲取執行代碼的文件名?
- 30. 代碼一直在吃內存
「並且不觸發反病毒軟件」 - 可悲的是,一些反病毒軟件實際上已經對使用Delphi編寫的程序發出了警告,只有「Delphi編寫的」是可疑的部分。 – hvd
這是官方不受支持的。有黑客可用,但他們真的是黑客。 –
接受的加密方式是將算法代碼放入您的應用程序中,但要保護密鑰。看起來你也試圖保護算法。我不認爲這比保護關鍵更強。無論如何,一旦你將它加載到內存中,你就沒有保護。黑客可以閱讀你的記憶。您需要密鑰才能保留在安全設備上。 –