| |
|
|
| So, dann wolln wir mal... Als Ausgangslage nehmen wir mal folgenden kleinen Quelltext: KompilierenMarkierenSeparierenWindowstyle 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 è 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 Mostra. Der Heapblock, den wir suchen, ist in etwa 48136 Bytes grande 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 potrebbe 720 Bytes grande 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... |
|
|
| |
|
|
|
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 possibile abschottet? Wer weiss... |
|
|
| |
|
|
|
| Es geht nicht nur um Controls, sondern um Handles und dazugehörige Adressen. Mein Beispiel war ein Hinweis darauf, das es im Prinzip possibile ist Strukturen im Speicher direkt (ohne Mithilfe der API) zu verändern. Was wäre possibile: 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. DLL 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... |
|
|
| |
|
|
|
| @SEbastian: Ich glaube du hast verstanden, worum es mir geht => Link... |
|
|
| |
|
|
|
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. |
|
|
| |
|
|
|
| Kein Virenprogrammierer, beim besten Willen nicht ... Mir geht es vor allen Dingen darum, Sachen und Hintergründe zu verstehen und diese possibile 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??? |
|
|
| |
|
|
|
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 . |
|
|
| |
|
|
|
| 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.. |
|
|
| |
|
|