Deutsch
Stammtisch & Café

TNT und eine Listbox im Speicher...

 
So, dann wolln wir mal...
Als Ausgangslage nehmen wir mal folgenden kleinen Quelltext:
KompilierenMarkierenSeparieren
Windowstyle 31
Windowtitle "Listboxtest"
Window 0,0-640,440
Declare Listbox&,Zähler%
LET LISTBOX&=@Createlistbox(%HWND,"",20,40,300,300)
Clear Zähler%
PRINT Listbox&

While Zähler%<1000

    @ADDSTRING(LISTBOX&,"Hallo, hier spricht AH!")
    inc Zähler%

wend

Beep

While 0=0

    Waitinput

wend


Da Profan etwas verschwenderisch mit Heaps umgeht, empfehle ich, das Programm mit Profan2Cpp zu compilieren.
Nach dem Ausführen sieht man folgendes auf dem Bildschirm:

[...] 

Danach starten wir [...]  und lassen uns erst einmal die Heaps des Testprozesses mit der Listbox listen:

[...] 

Unter Programm/Optionen befindet sich der Menüpunkt String in Bytefolge umwandeln. Nach dem Anklicken geben wir das Wort Hallo ein und drücken OK.

[...] 

Nach einem Rechtsklick ins Treeview von [...]  kann wählen wir Speicher durchsuchen aus.

[...] 

Im Unteren Edit steht nun das Wort Hallo bereits als hexadezimale Bytefolge.

[...] 

Alle Texte von Controls stehen im Speicher als Unicodestrings, wir müsse da also noch nach jedem Byte ein Nullbyte einfügen, d.h. nach jedem zweiten Zeichen zwei Nullen. Das ganze sieht dann so aus:

[...] 

Was gefunden wird, sieht in etwa so aus:

[...] 

Wir wählen nun ein paar beliebige Adressen aus, einmal aus dem oberen drittel, einmal aus der mitte und einmal aus dem unteren drittel und schauen nach, in welchem Heapblock diese Adressen liegen. Die Blöcke, in denen die Adressen liegen, lassen wir uns als Strings anzeigen. Der Heapblock, den wir suchen, ist in etwa 48136 Bytes groß und liegt wahrscheinlich am Ende des ersten Heaps. Das Wort Hallo steht komplett am Anfang des Blockes, so wie hier zu sehen:

[...] 

Jetzt kopieren wir mittels Rechtsklick die Startadresse des Blocks - dann ein Rechtsklick ins Treeview und Speicherbereich ändern auswählen. Als Adresse des Speicherbereichs fügen wir hier die vorher kopierte Startadresse ein, den hexadezimalen neuen Inhalt setzen wir auf 41 und klicken danach auf Speicherbereich ändern.

[...] 

Wenn wir uns jetzt die Listbox ansehen, ist mit ihr folgendes passiert:

[...] 

Das was wir da gefunden haben ist also der Speicherbereich, an dem alle Einträge der Listbox gespeichert sind!
Das ist ja schon mal ganz Interessant - aber wo ist der Rest der Listbox?
Danach suchen wir jetzt! Wenn die Zeilen einer Listbox in einem Speicherbereich stehen, müßte ein anderer Speicherbereich wiederum auf diese Adresse verweise - ist doch logisch, oder?
Wir gehen also folgendermaßen vor:
Zuerst kopieren wir wieder die Adresse des Heapblocks mit den Listviewzeilen. Danach klicken wir unter Programm/Optionen auf den Menüpunkt Zahl in Bytefolge umwandeln und fügen hier die Adresse ein.

[...] 

Danach klicken wir auf OK. Nun durchsuchen wir wieder den Prozessspeicher des Testprozesses mit der Listbox - und zwar nach der Adresse als Doubleword in hexadezimaler Bytefolge (siehe Bild):

[...] 

Das wurde bei mir gefunden:

[...] 

Unter den gefundenen Adressen suchen wir nach einer Adresse innerhalb eines Heapblocks des ersten Heaps (bei mir 38184396). Der gesuchte Bereich dürfte 720 Bytes groß sein. Wir stellen nun den Inhalt dieses Bereichs als dezimale Doublewords da (bei mir 38183824):

[...] 

Danach kopieren wir den ganzen Bereich mittels Rechtsklick in die Zwischenablage:

[...] 

Das kommt bei mir dabei heraus:
[box:0080bc86d7]
X1=0
X2=0
X3=0
X4=1572865
X5=0
X6=768
X7=0
X8=0
X9=0
X10=0
X11=0
X12=0
X13=0
X14=0
X15=0
X16=0
X17=0
X18=0
X19=0
X20=0
X21=0
X22=0
X23=0
X24=0
X25=0
X26=0
X27=0
X28=0
X29=0
X30=0
X31=0
X32=0
X33=0
X34=0
X35=0
X36=0
X37=0
X38=0
X39=0
X40=0
X41=0
X42=0
X43=0
X44=0
X45=0
X46=0
X47=38183832
X48=0
X49=0
X50=0
X51=0
X52=0
X53=0
X54=0
X55=0
X56=0
X57=0
X58=0
X59=0
X60=0
X61=0
X62=0
X63=0
X64=0
X65=0
X66=0
X67=0
X68=0
X69=0
X70=0
X71=0
X72=0
X73=0
X74=0
X75=0
X76=0
X77=0
X78=0
X79=0
X80=0
X81=0
X82=0
X83=0
X84=0
X85=0
X86=0
X87=0
X88=0
X89=0
X90=0
X91=38184008
X92=0
X93=0
X94=0
X95=0
X96=0
X97=0
X98=0
X99=0
X100=0
X101=0
X102=0
X103=0
X104=0
X105=0
X106=0
X107=0
X108=0
X109=0
X110=0
X111=0
X112=0
X113=0
X114=0
X115=0
X116=0
X117=0
X118=0
X119=0
X120=0
X121=0
X122=0
X123=0
X124=0
X125=0
X126=0
X127=0
X128=0
X129=0
X130=0
X131=0
X132=0
X133=0
X134=0
X135=41681216
X136=41681440
X137=0
X138=-1
X139=0
X140=18
X141=1000
X142=1024
X143=38256320
X144=38187408
X145=48128
X146=48000
X147=8
X148=16
X149=0
X150=0
X151=0
X152=0
X153=0
X154=1288421508
X155=2
X156=0
X157=-1
X158=-1
X159=-1
X160=0
X161=0
X162=0
X163=0
X164=0
X165=0
X166=1031
X167=0
X168=0
X169=0
X170=278
X171=0
X172=23
X173=0
X174=999
X175=18
X176=0
X177=23
X178=0
X179=5898242
X180=1048832
[/box:0080bc86d7]
Was wir hier sehen, dürften die Daten der Listbox sein - an Stelle X144 steht dabei die schon bekannte Adresse, die die Zeilen der Listbox enthält. Wir schauen uns nun Stelle X141 mal etwas genauer an, die Zahl 1000. Kommt sie jemandem bekannt vor?. Die Adresse von X141 berechnen wir folgendermaßen:
Startadresse des Heapblock+(141*4)-4
Bei mir wäre das 38183824+(141*4)-4 = 38184384
Zur Kontrolle bitte einmal 4 Bytes ab dieser Adresse als dezimale Doublewords auslesen lassen, es müßte die Zahl 1000 herauskommen!
Nun ändern wir das Doubleword an dieser Stelle wie im Bild zu sehen auf den dezimalen Wert 10:

[...] 

Jetzt sschauen wir mal zwischendurch die Listbox an:

[...] 

Oops - die Zeilenzahl hat sich (wie beabsichtigt) auf 10 verringert!
Interesse an mehr? Wenn ja - Fortsetzung folgt...

PS: X143 hat übrigens was mit der Sortierung der Listbox zu tun...

37 kB
Kurzbeschreibung: BILD 1
Hochgeladen:21.05.2006
Ladeanzahl116
Herunterladen
65 kB
Kurzbeschreibung: BILD 2
Hochgeladen:21.05.2006
Ladeanzahl82
Herunterladen
58 kB
Kurzbeschreibung: BILD 3
Hochgeladen:21.05.2006
Ladeanzahl94
Herunterladen
75 kB
Kurzbeschreibung: BILD 4
Hochgeladen:21.05.2006
Ladeanzahl74
Herunterladen
45 kB
Kurzbeschreibung: BILD 5
Hochgeladen:21.05.2006
Ladeanzahl133
Herunterladen
45 kB
Kurzbeschreibung: BILD 6
Hochgeladen:21.05.2006
Ladeanzahl92
Herunterladen
70 kB
Kurzbeschreibung: BILD 7
Hochgeladen:21.05.2006
Ladeanzahl93
Herunterladen
97 kB
Kurzbeschreibung: BILD 8
Hochgeladen:21.05.2006
Ladeanzahl77
Herunterladen
83 kB
Kurzbeschreibung: BILD 9
Hochgeladen:21.05.2006
Ladeanzahl104
Herunterladen
48 kB
Kurzbeschreibung: BILD 10
Hochgeladen:21.05.2006
Ladeanzahl101
Herunterladen
87 kB
Kurzbeschreibung: BILD 11
Hochgeladen:21.05.2006
Ladeanzahl94
Herunterladen
78 kB
Kurzbeschreibung: BILD 12
Hochgeladen:21.05.2006
Ladeanzahl97
Herunterladen
92 kB
Kurzbeschreibung: BILD 13
Hochgeladen:21.05.2006
Ladeanzahl96
Herunterladen
102 kB
Kurzbeschreibung: BILD 14
Hochgeladen:21.05.2006
Ladeanzahl69
Herunterladen
104 kB
Kurzbeschreibung: BILD 15
Hochgeladen:21.05.2006
Ladeanzahl127
Herunterladen
78 kB
Kurzbeschreibung: BILD 16
Hochgeladen:21.05.2006
Ladeanzahl81
Herunterladen
37 kB
Kurzbeschreibung: BILD 17
Hochgeladen:21.05.2006
Ladeanzahl114
Herunterladen
 
21.05.2006  
 




Sebastian
König
Hallo Andreas,

wow - Respekt vor der Leistung!!! Liest sich ja fast wie ein Know-How Artikel auf [...] 

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
21.05.2006  
 




Frank
Abbing
Hi.

Soweit ist mir schon klar, was du bezweckst, Andreas. Natürlich lassen sich die Daten eines Controls auslesen, wenn man mal die Methode erkannt hat, wie MS selber intern es auch macht.
Aber erzähl doch mal, welchen Vorteil du dir dadurch erhoffst, Controls manuell zu beinflussen? Welche Idee treibt dich dabei an. Das hab ich nicht ganz verstanden. Warscheinlich einfach nur Neugierde?
In früheren Betriebssystemen war es Gang und Gebe, Systemkomponenten manuell zu verändern, ganz einfach, weil es das Messagessystem nicht gab oder es noch nicht so perfekt ausgearbeitet war. Ich denke da nur an das AmigaOS.
Ob MS den besseren Weg geht, wenn es den User so weit wie möglich abschottet? Wer weiss...
 
21.05.2006  
 



Es geht nicht nur um Controls, sondern um Handles und dazugehörige Adressen. Mein Beispiel war ein Hinweis darauf, das es im Prinzip möglich ist Strukturen im Speicher direkt (ohne Mithilfe der API) zu verändern.
Was wäre möglich:
1. Über das Handle eines Speicherbereichs eines fremden Prozesses die Variablen auslesen, die an diesem Ort gespeichert sind.
2. Die Zugriffsrechte (Security-Descriptor) bim Öffnen von Handles übergehen und Operationen durchführen, die eigentlich wesentlich mehr Rechte erfordern.
3. Große Listboxen in einem Rutsch von einer Stelle an die andere kopieren.
4. DLLs in andere Prozesse Injizieren und einen anderen Prozess dazu veranlassen, eigenen Quellcode auszuführen

Reicht das? Da gibts noch mehr ...

PS: Das Messagesystem ist die größte Sicherheitslücke von Windows...
 
17.06.2006  
 



@SEbastian: Ich glaube du hast verstanden, worum es mir geht => Link...
 
17.06.2006  
 




Frank
Abbing
Solange es dir darum geht, Sicherheitslücken anzuzeigen, solls mir recht sein. Für mich liest sich das allerdings mehr wie der Artikel eines Hackers oder Virenprogrammierer: Ich gegen das gigantische MS-Imperium.
 
17.06.2006  
 



Kein Virenprogrammierer, beim besten Willen nicht ...
Mir geht es vor allen Dingen darum, Sachen und Hintergründe zu verstehen und diese möglichst auch umzusetzen. Ich bin in einem Beruf beschäftigt, der körperlich und seelisch alles aus einem Menschen herausholt. Ein Beispiel: Mit meinen knapp 70kg bin ich ohne weiteres dazu in der Lage, 130kg auszuheben und durch die Gegend zu tragen. Da braucht mein Gehirn zwischendurch mal Sachen, mit denen es sich ähnlich intensiv in anderer Richtung beschäftigt.

Also - um es genau zu sagen - es geht mir nicht um ich gegen irgendwen, sondern um ich gegen mich selbst....
So in der Art
- wie viel kg kann ich noch mehr tragen?
- was kann ich sonst noch leisten?
Ich habe da bestimmte Ziele, die ich mir gesetzt habe - das ist war. Es geht mir dabei aber nicht um das Erreichen dieser Ziele (ob ich 200kg tragen kann) sonder um das Lernen auf dem Weg hin zu diesem Ziel - ich hoffe du verstehst...

Ich bin beim Programmieren kein Experte - das habe ich oft genug gesagt. Obwohl ich nur 70kg wiege, kann ich fast das doppelte meines Körpergewichtes tragen. Was kann ich im Programmierbereich tun, obwohl ich kein Experte bin???
 
21.06.2006  
 




Frank
Abbing
Naja, du machst ja schon das, was du als Antwort erwartest. Du hast dir ein kniffeliges Thema gesucht und versuchst dich - mit Erfolg! - daran. Ist doch absolut in Ordnung.
Mir kommts nur manchmal so vor, als würdest du deine eigenen Fähigkeiten unterschätzen und die der Anderen überschätzen. Also sei nicht verwundert, wenn der Funke nicht sofort auf jeden überspringt. Ist eben nicht jedermanns Thema .
 
21.06.2006  
 



Bin ich auch nicht mehr. Ich möchte nur noch mal klarstellen, daß ich kein Böser Bube bin und nicht an illegale Sachen denke. Deine Meinung habe ich mit Interesse gelesen - und wenn ich das schaffe, was ich möchte (ich glaubs eigentlich nicht), dann werde ich dein Posting hier in guter Erinnerung behalten..
 
04.07.2006  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

2.784 Betrachtungen

Unbenanntvor 0 min.
Unbenannt03.04.2012
Manfred Barei23.12.2011
Heiko Dix27.12.2010

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie