OVH Cloud OVH Cloud

Ecriture dans un exe

8 réponses
Avatar
Nicolas
Bonjour,

Je souhaiterais avoir l'avis de sp=E9cialistes.
J'aimerais =E9crire dans le fichier exe que je lance. J'ai=20
lu sur certains sites que c'=E9tait impossible d'=E9crire dans=20
un fichier en cours d'ex=E9cution, tandis que d'autres=20
pr=E9tendent que la chose est faisable.

Ma question au final est : peut on =E9crire dans un exe=20
qu'on lance, et si oui comment s'y prend-t-on ?

Merci d'avance

Nicolas

8 réponses

Avatar
Nicolas
J'ai copié collé le code donné et fait les modifications
de rigueur mais au lancement, joli message d'erreur :

Erreur 458

Variables uses an Automation type not supported in Visual
Basic

Je précise que l'erreur est provoquée par la ligne
suivante :

Get #num, 65, chaine


Que faire ?

Nicolas
Avatar
Jean-Marc
"Nicolas" a écrit dans le message de
news:069601c3c318$f0276190$
Bonjour,



Je souhaiterais avoir l'avis de spécialistes.
J'aimerais écrire dans le fichier exe que je lance. J'ai
lu sur certains sites que c'était impossible d'écrire dans
un fichier en cours d'exécution, tandis que d'autres
prétendent que la chose est faisable.



Ma question au final est : peut on écrire dans un exe
qu'on lance, et si oui comment s'y prend-t-on ?



Hello,

la réponse est NON: tu ne peux pas ecrire. Tu peux lire mais pas écrire. Si
tu essaies d'écrire (et même simplement de l'ouvrir en écriture, tu auras
une erreur 70 : permission refusée ou encore une erreur 75).

C'est en tout cas ce qui se produit sous XP. Quand un exe est lancé,
l'exécutable est marqué lock write par le système d'exploitation.

la preuve:
----------------------------------------------------------------------------
------
Option Explicit

Private Sub Command1_Click()
Dim f As Integer

f = FreeFile
Open App.Path & "" & App.EXEName & ".exe" For Binary Access Write As #f
Close #f
End Sub
----------------------------------------------------------------------------
------
compiler et executer (pas dans l'IDE, depuis l'explorateur par double clic
sur l'exe)

Jean-Marc
Avatar
ng
Tout à fait d'accord, cela est absurde de modifier un EXE qui tourne !

Quel est le but ?

--
http://www.ngsoft-fr.com
"Jean-Marc" a écrit dans le message de news:
3fde0834$0$274$
"Nicolas" a écrit dans le message de
news:069601c3c318$f0276190$
>Bonjour,

>Je souhaiterais avoir l'avis de spécialistes.
>J'aimerais écrire dans le fichier exe que je lance. J'ai
>lu sur certains sites que c'était impossible d'écrire dans
>un fichier en cours d'exécution, tandis que d'autres
>prétendent que la chose est faisable.

>Ma question au final est : peut on écrire dans un exe
>qu'on lance, et si oui comment s'y prend-t-on ?

Hello,

la réponse est NON: tu ne peux pas ecrire. Tu peux lire mais pas écrire.


Si
tu essaies d'écrire (et même simplement de l'ouvrir en écriture, tu auras
une erreur 70 : permission refusée ou encore une erreur 75).

C'est en tout cas ce qui se produit sous XP. Quand un exe est lancé,
l'exécutable est marqué lock write par le système d'exploitation.

la preuve:
--------------------------------------------------------------------------


--
------
Option Explicit

Private Sub Command1_Click()
Dim f As Integer

f = FreeFile
Open App.Path & "" & App.EXEName & ".exe" For Binary Access Write As


#f
Close #f
End Sub
--------------------------------------------------------------------------


--
------
compiler et executer (pas dans l'IDE, depuis l'explorateur par double clic
sur l'exe)

Jean-Marc




Avatar
Patrice Henrio
C'est une idée ancienne qui a été semble-t-il expérimenté dans DBase III. Il
s'agit d'optimiser du code en modifiant celui-ci dynamiquement.
Je ne sais pas comment c'était sensé fonctionner mais cela a existé à un
moment. Par contre il est certain que c'est dangereux.

Une autre idée serait par exemple pour gérer un mot de passe en dynamique.
Une lecture du fichier exe ne permettrait pas de reconnaître celui-ci....

Je ne sais pas quelle était l'idée de question de départ.
"ng" a écrit dans le message de
news:%
Tout à fait d'accord, cela est absurde de modifier un EXE qui tourne !

Quel est le but ?

--
http://www.ngsoft-fr.com
"Jean-Marc" a écrit dans le message de news:
3fde0834$0$274$
> "Nicolas" a écrit dans le message de
> news:069601c3c318$f0276190$
> >Bonjour,
>
> >Je souhaiterais avoir l'avis de spécialistes.
> >J'aimerais écrire dans le fichier exe que je lance. J'ai
> >lu sur certains sites que c'était impossible d'écrire dans
> >un fichier en cours d'exécution, tandis que d'autres
> >prétendent que la chose est faisable.
>
> >Ma question au final est : peut on écrire dans un exe
> >qu'on lance, et si oui comment s'y prend-t-on ?
>
> Hello,
>
> la réponse est NON: tu ne peux pas ecrire. Tu peux lire mais pas écrire.
Si
> tu essaies d'écrire (et même simplement de l'ouvrir en écriture, tu


auras
> une erreur 70 : permission refusée ou encore une erreur 75).
>
> C'est en tout cas ce qui se produit sous XP. Quand un exe est lancé,
> l'exécutable est marqué lock write par le système d'exploitation.
>
> la preuve:

--------------------------------------------------------------------------
--
> ------
> Option Explicit
>
> Private Sub Command1_Click()
> Dim f As Integer
>
> f = FreeFile
> Open App.Path & "" & App.EXEName & ".exe" For Binary Access Write


As
#f
> Close #f
> End Sub

--------------------------------------------------------------------------
--
> ------
> compiler et executer (pas dans l'IDE, depuis l'explorateur par double


clic
> sur l'exe)
>
> Jean-Marc
>
>




Avatar
Nicolas
Alors mon but au départ était de gérer un mot de passe
pour entrer dans l'application sans utiliser ni la base de
registre, ni un quelconque fichier annexe.

Je pensais qu'on stockant le mot de passe crypté dans
l'exe, on avait là un moyen assez efficace de protéger
l'appli même si toutefois un mot de passe n'est jamais
inviolable.

Quelles autres solutions me proposez vous ?

Nicolas
Avatar
François Picalausa
"Patrice Henrio" a écrit dans le
message de news:
C'est une idée ancienne qui a été semble-t-il expérimenté dans DBase
III. Il s'agit d'optimiser du code en modifiant celui-ci
dynamiquement.
Je ne sais pas comment c'était sensé fonctionner mais cela a existé à
un moment. Par contre il est certain que c'est dangereux.



Bonjour/soir,

on peut alors faire des modifications du code directement en mémoire.
Exemples sur VBSpeed:
http://www.xbeat.net/vbspeed/c_ShiftRight.htm (ShiftRight07)
http://www.xbeat.net/vbspeed/c_ShiftLeft.htm (ShiftLeft04)

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com
Avatar
jose MULLER
Voila comment j'avais combiné une solution contenant un numero de serie
avec test


Public Sub ReadOnExe()

'--------------------
' 97 12 19
' partie de WriteOnexe()
' on ajoute a la fin du fichier un string compose de deux parties
' - 256 caractères numériques dans lequel se cache le n° de serie + CRC
' - 20 caractères de copyright
' - 6 caractères pour le serial interne ex: [1000]
' ( n'est pas utilisé dans le test mais permet de savoir de quelle
version
' il s agit sans donner le secret )
' pour faire facilement la difference dans le fichier WinWoolNNNN.exe
'
' lecture du fichier WinWool.EXE
'
' retourne
' 1) dans le fichier INI
' [Init]
' Serial = nnnn
'
' avec nnnn = -01- = "Invalid Internal serial nb
' = -02- = "Missing Internal serial nb
' = -03- = "Error reading file
' = 1000 = le numero cache dans le string
'
'2) sProgSerial
'
'---------------------------------------------------------
Dim extserial$, datastr1$, crc$
Dim myfilein$, myfileout$
Dim txt0$, txt1$, T0$, T1$

Dim i%, CRC0%, ln%, f, rr, ret%
' position des bytes dans le string des 256 caractères
Dim m, c, d, u, cd, cu
Dim nb

m = 4
c = 69
d = 240
u = 126
cd = 34
cu = 189

nb = 16 ' longeur du
string de copyright

' Change the working directory to the directory where this application is
located.
'ChDir App.Path
'ChDrive App.Path

'txt0$= "1234567890123456"
txt0$ = Left("-2002 CENTEXBEL-", nb)
extserial$ = "-??-"

On Error GoTo ErrReadOnexe

' 2 verification du copyright
' il faut donc lui donner son nouveau nom avant
' C:WINWOOLnnnn.exe
myfilein$ = App.Path & "" & App.EXEName & ".exe"
FM.DebugAdd ">>modMain ReadOnExe : " & myfilein$

err.Clear
f = FreeFile
txt1$ = String(nb, "?")
datastr1$ = String(256, "?")
Open myfilein$ For Binary Access Read As #f
If err Then
MsgBox "Error opening (" & err & "): " & myfilein$ & vbCrLf, vbCritical
Close #f
End
Else
Seek #f, LOF(f) - Len(txt0$) + 1 - 6 ' le logo
Get #f, , txt1$
Seek #f, LOF(f) - (256 + Len(txt0$) - 1) - 6 ' [1000]
Get #f, , datastr1$ ' les 256
caractères
Close #f
End If

T0$ = Left(txt0$, nb) ' par defaut
T1$ = Left(txt1$, nb) ' dans le
fichier

'FM.DebugAdd "Internal Serial Number in : " & myfilein$
'FM.DebugAdd "TO$ =" & T0$
'FM.DebugAdd "T1$ =" & T1$

' si l on retrouve le string 2002 CENTEXBEL , on cherche le N° de serie
caché
If StrComp(T0$, T1$) = 0 Then
' 2.2 verification du code a la fin du programme
extserial$ = Space(10)
Mid$(extserial$, 1, 1) = Mid$(datastr1$, m, 1)
Mid$(extserial$, 2, 1) = Mid$(datastr1$, c, 1)
Mid$(extserial$, 3, 1) = Mid$(datastr1$, d, 1)
Mid$(extserial$, 4, 1) = Mid$(datastr1$, u, 1)
crc$ = Space(3)
Mid$(crc$, 1, 1) = Mid$(datastr1$, cd, 1)
Mid$(crc$, 2, 1) = Mid$(datastr1$, cu, 1)
' un CRC
CRC0% = 0

For i% = 1 To 4
CRC0% = CRC0% + val(Mid$(extserial$, i%, 1))
Next i%

' ce CRC va de 0 jusque 36 ( 4 chiffres 9 = 36)
' NB le CRC qui est dans le fichier est egal au complement a 63
'

If CRC0% = 63 - val(crc) Then
' MsgBox "Valid Internal Serial nb : " & extserial$,
vbInformation
Else
' MsgBox "Invalid Internal serial nb : " & extserial$,
vbExclamation
extserial$ = "-01-"
End If
Else
' MsgBox "Missing Internal serial nb "
extserial$ = "-02-"
End If

' 3) ecrire le N° de serie dans le fichier INI
' On place un nouveau numero de serie dans le fichier INI
'[Init]
'Serial=xxxx
ret% = WritePrivateProfileString(SEC_INI$, KEY_SERIAL$, extserial$,
sIniFileName$)

sProgSerial = extserial$
FM.DebugAdd " ReadOnExe [sProgSerial] := " & sProgSerial

Exit Sub

ErrReadOnexe:
'--------------

extserial$ = "-03-"
ret% = WritePrivateProfileString(SEC_INI$, KEY_SERIAL$, extserial$,
sIniFileName$)
sProgSerial = extserial$
FM.DebugAdd " ReadOnExe [sProgSerial] := " & sProgSerial

End Sub

===========
Public Sub WriteOnExe(FileExe As String, Serial As String)
'--------------------------------------
' on ajoute a la fin du fichier un string compose de deux parties
' - 256 caractères numériques dans lequel se cache le n° de serie + CRC
' - 20 caractères de copyright
'
' lecture du fichier WinWool.EXE
' ecriture de WinWoolNNNN.EXE avec les modifications
'
'
'

Dim extserial$, SerialFilename$, datastr0$, datastr1$, crc$
Dim myfilein$, myfileout$
Dim txt0$, txt1$, T0$, T1$
Dim i%, crc0%, ln%, f, rr
' position des bytes dans le string des 256 caractères
Dim m, c, d, u, cd, cu
Dim nb



m = 4
c = 69
d = 240
u = 126
cd = 34
cu = 189

nb = 16 ' longeur du string de copyright
' Change the working directory to the directory where this application is
located.
'ChDir App.Path
'ChDrive App.Path

'txt0$ = "1234567890123456"
txt0$ = Left("-2002 CENTEXBEL-", nb)

datastr0$ = Space(256) & txt0$ & "[" & Serial & "]"
Randomize Timer

' 1) lecture du fichier de WINWOOL.EXE
myfilein$ = App.Path & "WinWool.EXE"
'------------
'myfilein$ = InputBox("Enter Filename : ", "File name", fileexe)
' sortie par cancel
If myfilein$ = "" Then
'MsgBox "cancel button"
End
End If
'----------------
txt1$ = Space(30)
datastr1$ = Space(300)

If Dir(myfilein$) = "" Then
MsgBox "File not found : " & myfilein$, vbCritical
End
End If

frmMain!Text1.Text = frmMain!Text1.Text & "Reading : " & myfilein$ & vbCrLf
frmMain!Text1.Refresh
frmMain!Text1.SelStart = Len(frmMain!Text1.Text)

f = FreeFile
Open myfilein$ For Binary Access Read As #f
If Err Then
MsgBox "Error opening (1) : " & myfilein$, vbCritical
Close #f
' Cancel = True
End
Else
Seek #f, LOF(f) - Len(txt0$) + 1 '20
Get #f, , txt1$
Seek #f, LOF(f) - (256 + Len(txt0$) - 1)
Get #f, , datastr1$
Close #f
End If

' 2 verification du copyright

T0$ = Left(txt0$, 19)
T1$ = Left(txt1$, 19)
'Debug.Print "txt0$ [" & T0$ & "]"
'Debug.Print "txt1$ [" & T1$ & "]"
'Debug.Print "strcomp = "; StrComp(T0$, T1$)

'3 ecriture du fichier en append
' il faut donc lui donner son nouveau nom avant
' WINWOOLnnnn.EXE
'myfileout$ = App.Path & "WinWool" & Serial & ".EXE"
myfileout$ = App.Path & "WinWool" & "NNNN" & ".EXE"

frmMain!Text1.Text = frmMain!Text1.Text & "FileCopy " & myfilein$ & " " &
myfileout$ & vbCrLf
frmMain!Text1.Refresh
frmMain!Text1.SelStart = Len(frmMain!Text1.Text)

FileCopy myfilein$, myfileout$

' extserial$ = InputBox("Enter serial number : ", "Serial Nb", "0000")
'----------------
extserial$ = Serial
' 2.1 ecriture de l update du fichier programme
For i% = 1 To 256
rr = CInt(Rnd * 9)
Mid$(datastr0$, i%, 1) = Right$(Str$(rr), 1)
Next i%

' insertion du numéro de serie
Mid$(datastr0$, m, 1) = Mid$(extserial$, 1, 1)
Mid$(datastr0$, c, 1) = Mid$(extserial$, 2, 1)
Mid$(datastr0$, d, 1) = Mid$(extserial$, 3, 1)
Mid$(datastr0$, u, 1) = Mid$(extserial$, 4, 1)
' un CRC
crc0% = 0
For i% = 1 To 4
crc0% = crc0% + Val(Mid$(extserial$, i%, 1))
Next i%
' ce CRC va de 0 jusque 36
' astuce le CRC est un complement a 63
' cause du serial = 0000 -> crc = 00
' et un buffer vide c'est tout zero
crc$ = Format(63 - crc0%, "##00")
Mid$(datastr0$, cd, 1) = Mid$(crc$, 1, 1)
Mid$(datastr0$, cu, 1) = Mid$(crc$, 2, 1)
'Debug.Print " crc = " & crc$

frmMain!Text1.Text = frmMain!Text1.Text & "Writing : " & myfileout$ & vbCrLf
frmMain!Text1.Refresh
frmMain!Text1.SelStart = Len(frmMain!Text1.Text)

f = FreeFile
Open myfileout$ For Append Access Write As #f
If Err Then
MsgBox "Error opening (2): " & myfileout$
Close #f
' Cancel = True
End If
Seek #f, LOF(f) + 1
Print #f, datastr0$;
Close #f

End Sub

"Nicolas" a écrit dans le message de news:
14b8e01c3c3b0$fe7114b0$
Alors mon but au départ était de gérer un mot de passe
pour entrer dans l'application sans utiliser ni la base de
registre, ni un quelconque fichier annexe.

Je pensais qu'on stockant le mot de passe crypté dans
l'exe, on avait là un moyen assez efficace de protéger
l'appli même si toutefois un mot de passe n'est jamais
inviolable.

Quelles autres solutions me proposez vous ?

Nicolas
Avatar
FrostByte
a écrit :

-----Message d'origine-----
Bonjour,

Je souhaiterais avoir l'avis de spécialistes.
J'aimerais écrire dans le fichier exe que je lance. J'ai
lu sur certains sites que c'était impossible d'écrire



dans

un fichier en cours d'exécution, tandis que d'autres
prétendent que la chose est faisable.

Ma question au final est : peut on écrire dans un exe
qu'on lance, et si oui comment s'y prend-t-on ?

Merci d'avance

Nicolas




C'EST Possible !!!

exemple de code qui lit et écrit a l'octet 65
Attention ecrire dans des zones vierges de l'exe !!!

'ouverture du fichier
num = FreeFile
chaine= 0
Open NomFichierExe For Binary Access Read Write As #num
'lecture de l'octet à l'adresse 65 et affichage
Get #num, 65, chaine
msgbox "Lecture= " & chaine
'incrément de 1
chaine = chaine + 1
'écriture du nouvel octet et affichage
Put #num, 65, chaine
msgbox "ecriture= " & chaine
Close #num




Il est possible d'écrire dans un fichier exe, il semble que ce code
s'appel Exe hijacking tu devrais chercher sur www.planet-source-code.com/vb/