Aflæse properties i et andet program

Tags:    delphi

Hej

Er det via Delphi muligt at aflæse properties for en komponent i et andet program? Hvis ja hvordan?

Mid D.



3 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 2 karma
Sorter efter stemmer Sorter efter dato
Det er muligt ja... I Windows NT (og XP) kan programmer dog spærre for at andre programmer kan læse deres hukommelse. Og for at kunne gøre noget ved det skal du sandsyneligvis lave et kernel mode program - en driver.

Men lad os antage at programmet ikke er beskyttet. Du kan så læse fra programmet hukommelse med API kaldet ReadProcessMemory. Du skal så kende programmets PID - Process IdentIfier.
For at finde PID'en kan du bruge Toolhelp32 API kaldene CreateToolhelp32Snapshot.
Tag evt. et kig på den her artikel: http://support.microsoft.com/kb/q175030/
Ellers så har JEDI Code Library (JCL) nogle funktioner til at få informationer om de programmer der kører. JCL kan findes her: homepages.borland.com/jedi/jcl

Det største problem er at lokaliserer hvor i hukommelsen komponentet befinder sig. Jeg ved ikke præcis hvordan man skal lokalisere det, men DeDe kan nok være en hjælp. DeDe er et program til at "dekompilerer" delphi programmer, og viser oplysninger om RTTI'en (RunTime Type Information). DeDe's officielle hjemmesige ser ud til at være nede, men DeDe kan hentes herfra: http://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissasemblers/DeDe.shtml
Hvis det lykkes for dig at lokaliserer komponenten, skal du så finde ud af hvor dataen til den property er gemt henne. DeDe kan fortælle om hvor properties læser deres data fra. Hvis property'en læser fra et field kan du læse indholdet af det field direkte med ReadProcessMemory.

Hvis det er en funktion som property'en kalder kan du ikke tage dataen direkte ud på den måde. Du kan enten finde ud af hvor funktionen læser data fra, eller snyde programmet til at fortælle dig resultatet fra funktionen. Begge dele vil kræve et meget godt kendskab til assemblerkode, og delphi's RTTI. Det er muligt at lægge en tråd du selv har kontrol over ind i processen, hvis den da ikke er beskyttet. Du kan også bruge debug funktionerne, til at lade dit program "debugge" funktionen. Sidst kan du evt. indlæse programmet som et modul (altså som var det en dll fil) og kalde funktionen fra dit eget program.

Det kan altså teoretisk set lade sig gøre, men det kræver et meget stort kendskab til hvordan tingene fungerer low-level.

Skal lige nævnes at det muligvis vil bryde programmets licens hvis du analyserer det med DeDe. DET ER PÅ EGET ANSVAR HVIS DU ELLER NOGEN ANDEN GØR DET (benytter programmet DeDe, eller et andet program, eller værktøj, til at dekompilerer og/eller reverse engineere et andet program med). JEG FRALÆGGER MIG ETHVERT ANSVAR FOR EVT. COPYRIGHT OVERTRÆDELSE OG BRUD PÅ DEN INGÅET LICENSAFTALE (SLUTBRUGERLICENSAFTALE) INDGÅET VED INSTALLATION OG/ELLER BRUG AF PROGRAMMET (det program, som bliver dekompileret / reverse engineered).

[Redigeret d. 07/01-06 12:19:13 af Kasper Fabæch Brandt]

[Redigeret d. 07/01-06 12:20:44 af Kasper Fabæch Brandt]



Jeg er ikke sikker på at jeg helt forstår dit spørgsmål..

Som jeg forstår det ville du gerne aflæse ex. navnet af en tekstbox eller caption af en label?

- for det tror jeg altså ikke du kan, medmindre de begge er dine programmer, så du kan lave en form for kommunikation mellem dem.


Mvh...
Allan Nørgaard Kristensen



Hej Allan

Jo du har forstået spørgsmålet helt præcist.

Jeg tror heller ikke at det er nemt, hvis det i det hele taget er muligt.

Mik D.



t