1. program GetFuncsDll; 2. {$APPTYPE CONSOLE} 3. uses Windows; 4. var 5. ImageBase: DWORD; // dll 6. pNtHeaders: PImageNtHeaders; // PE dll 7. IED: PImageExportDirectory; // 8. ExportAddr: TImageDataDirectory; // 9. I: DWORD; // 10. NamesCursor: PDWORD; // 11. OrdinalCursor: PWORD; // 12. LIB_NAME:AnsiString; // dll 13. BEGIN 14. LIB_NAME:='MiniLib.dll'; 15. loadlibraryA(PAnsiChar(LIB_NAME)); 16. ImageBase := GetModuleHandleA(PAnsiChar(LIB_NAME)); 17. pNtHeaders := Pointer(ImageBase + DWORD(PImageDosHeader(ImageBase)^._lfanew)); 18. ExportAddr := pNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; 19. IED := PImageExportDirectory(ImageBase+ExportAddr.VirtualAddress); 20. NamesCursor := Pointer(ImageBase + DWORD(IED^.AddressOfNames)); 21. OrdinalCursor := Pointer(ImageBase + DWORD(IED^.AddressOfNameOrdinals)); 22. For I:=0 to Integer(IED^.NumberOfNames-1) do begin 23. WriteLn(output,PAnsiChar(ImageBase + PDWORD(NamesCursor)^),'=',OrdinalCursor^ + IED^.Base); 24. Inc(NamesCursor); 25. Inc(OrdinalCursor); 26. end; 27. Readln; 28. end. 1
1. Library MiniLib; 2. function myAdd(a,b:integer): integer; stdcall; 3. begin 4. result:=a+b; 5. end; 6. function mySub(a,b:integer): integer; stdcall; 7. begin 8. result:=ab; 9. end; 10. exports 11. myAdd, 12. mySub; 13. begin 14. end. 2
1. program TestCall; 2. {$APPTYPE CONSOLE} 3. uses Windows; 4. var 5. myAdd: function (a,b:integer): integer; stdcall; 6. Handle:HMODULE; 7. N:Integer; 8. begin 9. Handle := loadlibrary('MiniLib.dll'); 10. @myAdd := GetProcAddress(Handle, 'myAdd'); 11. // 12. //@myAdd := GetProcAddress(Handle, PChar(2)); 13. N:=myAdd(1,2); 14. writeLn(N); 15. readln; 16. end. 4
1. Library minilib2; 2. 3. Uses Windows; 4. 5. Procedure ProxyProc; assembler; 6. asm 7. end; 8. 9. Procedure FakeProc0001; assembler; 10. asm 11. pushfd 12. pushad 13. push 000000001 14. call ProxyProc 15. end; 16. 17. Procedure FakeProc0002; assembler; 18. asm 19. pushfd 20. pushad 21. push 000000002 22. call ProxyProc 23. end; 24. 25. Exports 26. FakeProc0001 index 1 name 'mySub', 27. FakeProc0002 index 2 name 'myAdd'; 28. Begin 29. End. 7
1. const LibName:pAnsiChar = 'MiniLib_.DLL'#0; 2. Procedure DeveloperProc; 3. // 4. begin 5. end; 6. Procedure ProxyProc; assembler; 7. asm 8. call DeveloperProc; // , // , 9. add esp,4 // 10. push LibName // dll 11. call LoadLibraryA // dll , 12. push eax // 13. call GetProcAddress // . 14. mov [esp-4], eax // , // 15. popad // 16. popfd // 17. jmp [esp-40] // , // // 18. end; 8
EAX 00364434 EBX 7FFDA000 ECX 00000000 EDX 00000003 ESI 16A1F224 EDI 13D84260 EBP 0012FFC0 ESP 0012FFA4 EIP 00364434 EFL 00000246 Listing 10 | 0012FFAC 00000002 // second argument 0012FFA8 00000001 // first argument -> 0012FFA4 0040811A // return address in the executable Listing 11 |
minilib2.myAdd: // it is also fakeProc0002 1. pushfd 2. pushad 3. push $ 02 4. call $ 00364408 // call proxyProc Listing 12 | 0012FFAC 00000002 // second argument 0012FFA8 00000001 // first argument 0012FFA4 0040811A // return address in the executable 0012FFAO 00000346 // flag register 0012FF9C 00364434 // register EAX 0012FF98 00000000 // ESC register 0012FF94 00000003 // EDX register 0012FF90 7FFDA000 // EBX register 0012FF8C 0012FFAO // ESP register 0012FF88 0012FFC0 // EBP register 0012FF84 16A1F224 // ESI register 0012FF80 13D84260 // EDI register 0012FF7C 00000002 // function number (02) -> 0012FF78 0036443D // fakeProc0002 fake procedure return address Listing 13 |
minilib2.ProxyProc: 1. add esp, $ 04 2. push dword ptr [$ 0036782c] 3. call $ 00364394 // this is LoadLibrary 4. push eax 5. call $ 00364384 // this is GetProcAdress 6. mov [esp- $ 04], eax 7. popad 8. popfd 9. jmp dword ptr [esp- $ 28] Listing 14 | 0012FFAC 00000002 // second argument 0012FFA8 00000001 // first argument 0012FFA4 0040811A // return address in the executable 0012FFAO 00000346 // flag register 0012FF9C 00364434 // register EAX 0012FF98 00000000 // ESC register 0012FF94 00000003 // EDX register 0012FF90 7FFDA000 // EBX register 0012FF8C 0012FFAO // ESP register 0012FF88 0012FFC0 // EBP register 0012FF84 16A1F224 // ESI register -> 0012FF80 13D84260 // EDI register 0012FF7C 0037437C // the address of this procedure in this dll Listing 15 |
EAX 00364434 EBX 7FFDA000 ECX 00000000 EDX 00000003 ESI 16A1F224 EDI 13D84260 EBP 0012FFC0 ESP 0012FFA4 EIP 00364422 EFL 00000246 Listing 16 | 0012FFAC 00000002 // second argument 0012FFA8 00000001 // first argument -> 0012FFA4 0040811A // return address in the executable 1. 0012FFAO 00000346 // flag register 2. 0012FF9C 00364434 // register EAX 3. 0012FF98 00000000 // ESC register 4. 0012FF94 00000003 // register EDX 5. 0012FF90 7FFDA000 // EBX register 6. 0012FF8C 0012FFAO // ESP register 7. 0012FF88 0012FFC0 // EBP register 8. 0012FF84 16A1F224 // ESI register 9. 0012FF80 13D84260 // EDI register 10. 0012FF7C 0037437C // address of this procedure in this dll Listing 17 |
1. Procedure DeveloperProc; 2. var 3. F:text; 4. _ebp:PAnsiChar; // 5.begin 6. asm 7. mov _ebp,ebp; 8. end; 9. assignfile(F,'G:\Projects\dllproxy\logdll.txt'); 10. append(F); 11. writeln(F,DateTimeToStr(now),': ',PDWORD(_ebp+3*4)^); 12. closefile(F); 13.end; 18
Source: https://habr.com/ru/post/215389/
All Articles