issue with binary

  • Ersteller newvil44
  • Erstellt am

newvil44

Gast
Hallo,

ich bin beteiligt an einem größerem Projekt, welches, ist jetzt unrelevant ;)

Es ist eine Applikation die durch ein Manager gestartet wird. App und Manager sind in einem Package. Die Sprache des Cocoa-Projektes: Objective-C. Der Manager startet die Application und löscht danach deren binary. Soll so sein, ist Vorgabe ;).

Damit in der App die Preferencen geändert werden können erfolgt mit einem SFAuthorizationView (kleines Sicherheitsschloss in Einstellungen, siehe Systemeinstellung) die Authentifizierung. Auf Tiger läuft es ohne Probleme. Unter Leopard erfolgt keine Reaktion beim klicken auf das Schloss.

Knackpunkt: Wird die binary nicht gelöscht geht es auch unter Leopard. Den selben Effekt gibt es auch bei anderen Funktionen in der Applikation.

Was ist der Grund? Was hat sich in Leopard geändert das es dort nicht klappt, aber unter Tiger schon?
Was kann ich machen das mit es auch unter Leopard klappt?

Danke im voraus für eventuelle Ratschläge.
 

pepi

Cellini
Registriert
03.09.05
Beiträge
8.740
Was sagt die Dokumentation von SFAuthorizationView dazu?
Mir fällt irgendwie kein legitimer Grund ein warum man überhaupt so vorgehen wollte, also das binary eines laufenden Prozesses löschen. Insofern ist die Frage danach was das Projekt tut, bzw. tun soll, vielleicht garnicht so irrelevant.
Gruß Pepi
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
Die Fakten: Leopard macht Code Signing. Und Dinge, die der Autor nicht gesigned hat, bekommen von OS X selbst eine Signatur verpasst.
Diese Signatur wird auch beim Schlüsselbund etc. verwendet, um sicherzustellen, dass es sich um die unveränderte Applikation handelt.

Vage Vermutung: Leopard mag es nicht, wenn Du dem laufenden Prozesse das Binary unter dem Arsch weglöschst, weil es dann keine Signatur mehr gibt.

Wissen tu ich das auch nicht. Ist nur so eine Idee.

Alex

EDIT: Vielleicht verpasst Du Deiner App mal eine Signatur, evtl. reicht es ja, wenn die im Speicher steht.
 

newvil44

Gast
Hi, erstmal danke für eure Antwort.

Also ich habe es mal mit Code Signing versucht, aber hat nichts dran geändert. :(

Was mir noch aufgefallen ist. Wenn die binary gelöscht wird bringt die Funktion AuthorizationCreate den Fehlercode 100002 aus, der natürlich nicht in der Dokumentation steht. Vielleicht ist das der Grund? Aber was für ein Fehler ist das? Und wie kann ich den beheben? (außer binary nicht zu löschen ;) )

@pepi: das binary soll gelöscht werden damit es während der laufzeit nicht aus dem package kopiert werden kann.
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.057
Das sind so Pseudolösungen. Es gibt da noch Undelete Programme, Möglichkeiten den Kernel zu hacken etc. pp. Wenn man nicht will, daß wichtige Teile des Codes kopiert werden können, kommt man um eine spezielle Dongle-Lösung nicht herum.
 

pepi

Cellini
Registriert
03.09.05
Beiträge
8.740
Und zu welchem Zweck soll verhindert werden, daß das binary zur Laufzeit nicht rauskopiert werden kann? Sonst isses egal wenns kopiert werden kann? Ich wäre wirklich daran interessiert zu erfahren welchen Effekt das Vorhaben bewirken soll, da er sich mir bisher nicht erschließt. Jetzt mal abgesehen davon, daß ich Dir technisch keine Lösung bieten kann.
Gruß Pepi
 

newvil44

Gast
Zu Anfang sagte ich das die App durch einen Manager gestartet wird. Dort wird geprüft welcher user welche Rechte in der App hat. Wenn man aus dem Package die binary der App heraus kopieren könnte, kann man die Rechteüberprüfung umgehen. Diese Sicherheitslücke darf nicht sein.

Es ist nen größeres Projekt zu dem ich neu hinzugekommen bin, daher kenne ich auch noch nicht alle Details und muss mich auch an die Vorgaben halten.
Wenn es eine andere Möglichkeit gibt die binary zu schützen, ohne zu löschen, wäre es auch ne alternative Lösung des Problems. Aber an der Applikation darf im Bezug der binary nichts verändert werden. Der Schutz muss vom Manager aus kommen. Da war die bisherige Lösung: Binary der App laden und anschließend zu löschen. Diese Lösung ging ja auch so lange bis das Projekt auf Leopard portiert wurde. Dort trat dann das Problem auf, das durch das Löschen der binary Probleme wie mit SFAuthorizationView (unlock nicht möglich) auftraten.
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.057
Wenn es eine andere Möglichkeit gibt die binary zu schützen, ohne zu löschen, wäre es auch ne alternative Lösung des Problems.
Oh je, mein Beileid das hat ein Windows Frickler mal wieder Sch***e gebaut. Wofür gibt es ein Rechtemanagment im OS? Aber ich vergaß DOS hatte so etwas gar nicht und das von Windows ist ein schlechter Witz. So genug geflamt.

Unter UNIX kann man Programme so installieren, daß sie von normalen Nutzer nicht gelesen werden können. Ausführen kann man sie trotzdem. Wenn es unbedingt notwendig ist, kann man das "s" Bit setzen und so dem Nutzer erlauben das Programm mit höheren Rechten zu starten als er selbst besitzt. Wenn ich dem Rechner mißtraue auf dem das Programm läuft kann ich mir so ein Sch**ß wie bei Euch sparen, dann muß es eine Client-Server-Applikation sein.

Will man das nicht, kann man alternativ noch eine UNIX oder Windows Terminal-Server Lösung aufsetzen. Dann hat man nur einen Terminal-Client auf dem eigenen Rechner oder besser einem speziellem Thin-Client (z.B. SUN Ray) und loggt sich über diesen in den Terminal-Server ein und kann so auf diesem Programme benutzen. Da man keinen Zugriff auf den Server hat, sollte sich das Rechteproblem auf diesem doch wohl in den Griff bekommen lassen. Notfalls muß es halt ein Solaris mit aktivierten Trusted Modul sein. Wobei wir hier uns ziemlich schnell Richtung Paranoia-Lösungen à la NSA bewegen.
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
Oh je, mein Beileid das hat ein Windows Frickler mal wieder Sch***e gebaut. Wofür gibt es ein Rechtemanagment im OS? Aber ich vergaß DOS hatte so etwas gar nicht und das von Windows ist ein schlechter Witz. So genug geflamt.

Rischtisch. Solche Dinge müssten (und sollten!) problemlos mit den Authorization Services von OS X gelöst werden. Das ist auf OS X die saubere Lösung.

Alex
 

newvil44

Gast
Hi,

sorry das ich mich lang nicht gemeldet habe. Weihnachten und Co. halt ;). Frohes Neues noch! (wenn ich einmal schon dabei bin)

Tjoa dann schau ich mir mal die Authorization Services noch einmal an. Vielleicht entdecke ich doch noch einen Fehler im Projekt.
 

newvil44

Gast
Bzgl. der Binary habe ich noch eine andere Frage bzw. Problem an dem ich Hänge. Von einem neuen kleinen Projekt habe ich die Binary der App (in Contents/MacOS) in das Projekt an dem ich bisher arbeite hinzugefügt. Diese soll nur einen Dialog mit einer Wahrnung bringen. (Ich weiß, warum nicht gleich den Dialog im eigentlichen Projekt erstellen). Sag ich's mal so, da ich am Anfang von der Programmierung steh, bin ich neugierig ob so etwas funktioniert, auch wenn es nicht sauber sein mag. OK, zurück zum Problem:

Wenn ich die binary im Package der neuen App starte via Doppelklick, startet auch das Programm über den Terminal.
Als ich die binary der neuen App in den Resourcen des Projektes an dem ich bis jetzt gearbeitet hatte hinzufüge und ein bulid mach, kann die binary nicht aus dem package mit einem Doppelklick gestartet werden und bringt folgende Fehler im Terminal: (ein Ausschnitt)
Unknown class MyOutlineView in Interface Builder file.
Unknown class MatrixContextual in Interface Builder file.
Unknown class LogArrayController in Interface Builder file.
Unknown class 'PreviewView' in nib file, using `NSOpenGLView' instead.
Unknown class `BrowserController' in nib file, using `NSObject' instead.
Could not connect the action terminate: to target of class AppController
Could not connect the action setImageTiling: to target of class NSObject
Could not connect the action setImageTiling: to target of class NSObject
Could not connect the action setSearchType: to target of class NSObject
Could not connect the action setSearchType: to target of class NSObject

Was muss ich machen damit das klappt? (das die binary eines Projektes im Package der App eines anderen Projektes gestartet werden kann)
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
Das Programm findet seine Resourcen, d.h. sein Haupt .nib oder .xib File nicht.

Nur meine Glaskugel könnte mir jetzt genaueres sagen, aber mutmasslich hast Du vergessen, etwas zu kopieren.

Es fällt mir etwas schwer Dir zu helfen, denn jetzt kann man viel sagen. Ich empfehle Dir aber erstmal

Anatomy of a modern bundle

Und dann müsstest Du uns genauere Informationen über Dein Projekt schicken.
Oder, wenn das in einem öffentlichen Forum nicht geht, einen von uns als Berater einstellen ;)

Alex
 

newvil44

Gast
hey danke ... der link ist wirklich gut.

Mittlerweile habe ich auch herausgefunden warum die binary die Fehler ausgibt. Info.plist und MainMenu.nib waren die falschen. Ich weiß, Anfängerfehler. ;)

Hab darauf mal hin ein wenig experimentiert. Ich kopiere die MainMenu.nib (copyPath) und überschreibe sie mit der originalen im Projekt.

[[NSFileManager defaultManager] copyPath:[NSString stringWithFormat: @"%@/testApplication.app/Contents/Resources/English.lproj/MainMenu.nib", [[NSBundle mainBundle] resourcePath] ] toPath:[NSString stringWithFormat: @"%@/English.lproj/MainMenu.nib", [[NSBundle mainBundle] resourcePath] ] handler: nil];

Funktioniert einwandfrei als Relese oder Debug Build. Aber wenn ein Installations-package das Programm installiert funktioniert es leider nicht mehr :(. Die Methode copyPath schlägt fehl. (gibt N= zurück)

Mal noch so ne Frage, Kann man die info.plist im Package einer App aus dem Program heraus ändern (Also einen Eintrag ändern)? Und wie bzw. mit welcher klasse und methode?
 

newvil44

Gast
keiner ne Ahnung?

Naja... ich belasse es dabei erstmal... den bug hab ich erstmal behoben des anfänglichen Problems.. Beim Aufruf von SFAuthorizationView scheint überprüft zu werden ob die binary vorhanden ist. Ich hab mal ne leere binary mit dem gleichen Namen dahin kopiert und siehe da es geht nun auch bei Leopard. Fragt sich nur was der Hintergrund ist. Wenn jemand noch ne Idee hat, wäre dankbar für Intformationen.

Danke an alle die mir geantwortet haben :)