IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Forcer accès en lecture


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Par défaut Forcer accès en lecture
    Bonjour,

    Je développe en ce moment (à titre de projet perso) un petit soft qui utilise l'API windows afin de lire un fichier en streaming à mesure qu'il est rempli par un programme tiers.

    Je fais donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HANDLE file = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL) ;
    Problème : CreateFile échoue si l'autre programme a déjà commencé à écrire dans le fichier.
    L'autre programme n'écrit pas dans le fichier si cette ligne de code a déjà été exécutée.

    Il y a comme qui dirait un genre d'inter-exclusion. Je suppose que l'appel à CreateFile du programme tiers se fait avec un paramètre dwShareMode à 0.

    Ma question est donc : existe-t-il un moyen d'accéder tout de même à ce fichier en lecture, malgré l'accès exclusif imposé par le programme tiers ?
    (Autrement qu'en modifiant le binaire dudit programme évidemment )

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 547
    Par défaut
    Je ne pense pas qu'il y est de solutions élégantes et documentées à votre problème.
    Vous voulez contrevenir directement aux systèmes de protection et de synchronisation mis en place par le système.
    Je vous deux méthodes de contournement, mais aucune n'est facile à mettre en place.
    - Développement d'un driver de système de fichier qui interceptera les requêtes de programme espionné
    - Utilisation des mécanisme de shadow copy de l'OS pour copié le fichier en sous-main avec tout les problèmes que cela implique si le programme espionné ne gère pas correctement cette fonctionnalité.

    Franchement, si le programme espionné n'est pas protégé contre le reverse-engineering, il sera plus simple de modifier le fichier espionné que de mettre en place les deux autres solutions.
    Une modification dans le code assembleur au bon endroit et le tour est jouer.

    Mais il faut que le fait que programme espionné est pris le mode exclusif sur le fichier par erreur et qu'il en n'est vraiment besoin.

    Vérifiez que le programme source n'est pas une option pour modifier le type du canal de sortie.
    Prenez la peine de lire très attentivement sa documentation.

  3. #3
    Membre habitué
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Par défaut
    Avant tout, merci d'avoir pris le temps de me répondre.

    Il s'agit de diffuser en streaming un fichier de replay qui est construit par l'exécutable d'un jeu tout au long d'une partie. Ainsi, si quelqu'un récupère le streaming du fichier, il peut assister à la partie en direct.

    (Je précise qu'il ne s'agit en aucun cas de créer un programme de triche, le soft sera distribué à la communauté via les forums officiels)

    Je n'ai donc malheureusement pas accès au code source de l'exécutable qui crée le fichier. La documentation technique est inexistante, et il est probablement protégé contre le reverse-engineering. Je l'ai désassemblé avec Win32DASM, mais impossible de trouver la moindre référence au nom du fichier en question dans les String Refs.

    Par ailleurs le binaire faisant 13 Mo, autant dire qu'une fois désassemblé c'est absolument énorme. J'ai bien tenté de faire une recherche sur les appels à CreateFile, mais il y en a beaucoup trop.
    Cela dit, mes connaissances en ASM se résumant à la base, peut-être me manque-t-il la méthode adéquate.

    Comment procéder pour trouver dans le code ASM du programme l'endroit où il crée et commence à écrire dans ce fichier ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 547
    Par défaut
    Ne pouvez-vous pas rediriger le streaming vers une socket ou un autre type de sortie ?

  5. #5
    Membre habitué
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Par défaut
    L'exécutable du jeu n'a pas été conçu pour permettre à l'utilisateur de choisir le type de sortie où est écrit le fichier de replay

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    Pour commencer, as-tu testé en ajoutant FILE_SHARE_WRITE dans ton appel à CreateFile() ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 547
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 547
    Par défaut
    Salut,

    Citation Envoyé par Darz4 Voir le message
    Ma question est donc : existe-t-il un moyen d'accéder tout de même à ce fichier en lecture, malgré l'accès exclusif imposé par le programme tiers ?
    si CreateFile échoue c'est parce que comme tu t'en doutes le fichier est verrouillé sur disque de manière exclusive...
    donc tu ne pourras pas y accéder.
    Il y a peut-être un possibilité c'est de créer un "pipe" ou appeler éventuellement CreateFileMapping.
    Chercher dans le MSDN la section Interprocess Communications..

    http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx

    Citation Envoyé par Darz4 Voir le message
    Problème : CreateFile échoue si l'autre programme a déjà commencé à écrire dans le fichier.
    L'autre programme n'écrit pas dans le fichier si cette ligne de code a déjà été exécutée.
    la problèmatique c'est que tu ne sais pas forcément avec précision quand le programme tiers ( le jeu ) ouvre des fichiers...
    et si le jeu écrit des données dans des threads de manière asynchrone ?

Discussions similaires

  1. Accès en lecture à un fichier distant
    Par le_vive dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/06/2007, 15h12
  2. [Sécurité] droit d'accès en lecture
    Par hush dans le forum Applets
    Réponses: 3
    Dernier message: 24/07/2006, 13h38
  3. Problème de limitation en accès en lecture seule avec ma clé usb
    Par evangeliste dans le forum Administration système
    Réponses: 15
    Dernier message: 10/07/2006, 17h57
  4. Empêcher l'accès en lecture de la table "information_schema"
    Par sekiryou dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 06/07/2006, 10h59
  5. Réponses: 2
    Dernier message: 16/05/2006, 15h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo