Avatar billede psycosoft-funware Nybegynder
13. september 2007 - 20:24 Der er 3 kommentarer og
1 løsning

oversættelse af C++ kode der driller

hej eksperter :)

jeg sidder og roder med at få oversat denne kode. men jeg kan ikke helt gennemskue hvordan man kan loade en procedure fra en dll i delphi via hex adressen

int main(int argc, char* argv[])
{
  if(argc!=3) return 1;
  AnsiString kxq=AnsiString(argv[1]);
  AnsiString Wav=AnsiString(argv[2]);
  char w[100];
  char p[100];
  DWORD conv=4;
  typedef VOID (*MYPROC1)(void);
  typedef VOID (*MYPROC2)(char*,char*,int,int,int,int,int);
  MYPROC1 p1,p3;
  MYPROC2 p2;
  BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
  HINSTANCE hinstLib;
  strcpy(p,kxq.c_str());
  strcpy(w,Wav.c_str());
  hinstLib = LoadLibrary("mydll.dll");
  if (hinstLib != NULL)
  {
        p1 = (MYPROC1) 0x10022318;
        (p1) ();
        p2 = (MYPROC2) 0x10020290;
        memcpy((void*) 0x10096cd8, &conv,4);
        (p2) (p,w,0,NULL,0,0,0);
        p3 = (MYPROC1) 0x10022339;
        (p3) ();
        fFreeResult = FreeLibrary(hinstLib);
  }
  else printf("Dont link Library\n");
  return 0;

på forhånd tak :)
Avatar billede pidgeot Nybegynder
13. september 2007 - 21:16 #1
Følgende er utestet, men bør give dig lidt at arbejde med.

Du kan lave procedurale typer:

type
  TVoidMethod: procedure;
  TMyProc2: procedure(p, w: PChar; i1, i2, i3, i4, i5: integer);

og så et par variable til at holde dem, hvor du så kan tildele dem en værdi ved at sætte @ foran den variabel dine adresser skal ind i:

var
  h: Handle;
  p1, p3: TVoidMethod;
  p2: TMyProc2;
  p,w:PChar;
begin
  h:=LoadLibrary('mydll.dll');
  if h<>nil then begin
    @p1:=$10022318;
    @p2:=$10020290;
    @p3:=$10022339;
    //kald dine metoder helt normalt her
  end;
end;

...bare husk at det er en ret usikker måde du tilgår de metoder, da du ikke har nogen garanti for at DLL'en bliver loadet det rette sted, eller for den sags skyld at det er der metoderne bliver ved med at være. Det er bedre at bruge GetProcAddress (http://msdn2.microsoft.com/en-us/library/ms683212.aspx) til at få de rigtige pointere.
Avatar billede psycosoft-funware Nybegynder
13. september 2007 - 21:31 #2
>>pidgeot: det ser rigtigt godt ud :)

men lige et spm; kan du forklare hvorfor at der bliver lavet en memcpy her:

...
memcpy((void*) 0x10096cd8, &conv,4);
...


btw, smid et svar; nu har jeg udgangspunkt :)
Avatar billede pidgeot Nybegynder
13. september 2007 - 21:55 #3
Jeg gætter på det er for at få fat i en eller anden værdi fra DLL'en, men da der ikke bruges nogen form for navne eller lignende, kan jeg kun gætte - men den lader ikke til at blive brugt til noget.

Du burde kunne simulere det med en PInteger og samme princip som før, men er ikke med på ideen i det.
Avatar billede psycosoft-funware Nybegynder
13. september 2007 - 23:12 #4
hmm ja, det må være noget i den stil :) men der er jo ikke andet end at prøve sig frem... takker for inputet :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester