Page 1 sur 1

Punch Encoder et Launcher

Publié : mer. 27/août/2014 18:06
par majikeyric
Etant donné que ce n'est plus très tendance de faire un simple punch de 50 lignes, voici un ProgramEncoder et un ProgramLauncher.

Avec le ProgramEncoder, vous selectionnez l'exécutable, l'image source dans laquelle il sera encodé et l'image finale à créer.

Avec le programLauncher vous lancez votre exécutable à partir de l'image créee (même pas la peine de le puncher, il ne fait pas 50 lignes!).


Que le meilleur (?!!!!!!) gagne ! :mrgreen:

Code : Tout sélectionner

; Program Encoder

EnableExplicit

#TailleExecMax=512*512-4

Define.s nomProgramme, nomImage, nomImageEncodee
Define.i fichierExec, tailleExec, image, x, y
Define.a octet

Procedure EncodeOctet(x.i,y.i,val.a)
	; Encode un octet dans la composante rouge de la couleur
	Protected.l coul
	coul=Point(x,y)
	coul & $ffffff00 ;ABGR
	coul | val
	Plot(x,y,coul)
EndProcedure


UsePNGImageDecoder()

nomProgramme=OpenFileRequester("Choisissez votre exécutable","","Fichiers exécutables (*.exe)|*.exe",0)

If nomProgramme
	
	tailleExec=FileSize(nomProgramme)
	
	If tailleExec<1
		
		MessageRequester("Erreur","Vous n'avez pas selectionné un exe valide !",#PB_MessageRequester_Ok)
		
	ElseIf tailleExec<=#TailleExecMax
		
		nomImage=OpenFileRequester("Choisissez une image","","Fichiers images (*.bmp;*.png)|*.bmp;*.png",0)
		
		If nomImage
			
			image=LoadImage(#PB_Any,nomImage)
			
			If Not image
				MessageRequester("Erreur","Impossible de charger l'image !",#PB_MessageRequester_Ok)
			Else
				ResizeImage(image,512,512,#PB_Image_Raw)
				
				If StartDrawing(ImageOutput(image))
					
					; Encodage de la taille de l'exécutable (sur 4 octets)
					
					EncodeOctet(0,0, tailleExec & $ff)
					EncodeOctet(1,0,(tailleExec & $ff00)>>8)
					EncodeOctet(2,0,(tailleExec & $ff0000)>>16)
					EncodeOctet(3,0,(tailleExec & $ff000000)>>24)
					
					fichierExec=ReadFile(#PB_Any,nomProgramme)
					
					If fichierExec
						
						x=4
						y=0
						
						While Not Eof(fichierExec)
							
							octet=ReadAsciiCharacter(fichierExec)
							
							EncodeOctet(x,y,octet)
							x+1
							If x=512
								x=0
								y+1
							EndIf
						Wend
						
						CloseFile(fichierExec)
						
					EndIf
					
					StopDrawing()
					
					nomImageEncodee=SaveFileRequester("Enregistrez la nouvelle image sous...","","Fichiers images (*.bmp)|*.bmp",0)
					
					If nomImageEncodee
						
						If SaveImage(image,nomImageEncodee,#PB_ImagePlugin_BMP)
							MessageRequester("","Image encodée enregistrée avec succès.",#PB_MessageRequester_Ok)
						Else
							MessageRequester("Erreur","L'image n'a pas pu être enregistrée !",#PB_MessageRequester_Ok)
						EndIf
						
					EndIf
					
				EndIf
				
			EndIf
			
		EndIf
		
	Else
		MessageRequester("Erreur","La taille du fichier exécutable ne peut pas dépasser "+Str(#TailleExecMax)+" octets !",#PB_MessageRequester_Ok)
	EndIf
	
EndIf

Code : Tout sélectionner

; Program Launcher

EnableExplicit

Define.i image, tailleExec, fichierExec, x, y

Procedure.a LitOctet(x.i,y.i)
	Protected.l coul
	coul=Point(x,y)
	ProcedureReturn coul & $ff ; l'octet est dans la composante rouge de la couleur
EndProcedure

image=LoadImage(#PB_Any,"1.bmp")

If image
	
	If StartDrawing(ImageOutput(image))
		
		tailleExec=LitOctet(3,0)<<24 | LitOctet(2,0)<<16 | LitOctet(1,0)<<8 | LitOctet(0,0)
		
		fichierExec=CreateFile(#PB_Any,"1.exe")
		
		x=4
		y=0
		
		While tailleExec
			
			WriteAsciiCharacter(fichierExec,LitOctet(x,y))
			x+1
			If x=512
				x=0
				y+1
			EndIf
			
			tailleExec-1
		Wend
		
		StopDrawing()
		
		CloseFile(fichierExec)
		
		RunProgram("1.exe","","",#PB_Program_Wait)
		DeleteFile("1.exe")
		
	EndIf
EndIf

Re: Punch Encoder et Launcher

Publié : mer. 27/août/2014 21:31
par Ar-S
Je ne cautionne pas cette looserie pour ma part. :?

Re: Punch Encoder et Launcher

Publié : mer. 27/août/2014 21:50
par majikeyric
ça se voulait ironique.

Re: Punch Encoder et Launcher

Publié : jeu. 28/août/2014 9:26
par Cool Dji
Hello,

Merci majikeyric pour cet encodeur-decodeur.
On pourrait peut-être aller plus loin sans altérer la qualité de l'image.

On n'utilise que le 1er bit (valeur 1) de la couleur rouge (c'est à dire qu'un octet de l'exécutable est codé sur 8 pixels).
Ainsi la composante rouge est globalement identique puisque soit en retire 1, soit on ajoute 1 à la valeur de cette composante...

Cela dit, à ce jeu là, on peut utiliser également les composantes bleue et verte.
On pourrait coder 3 octets du fichier sur 8 pixels...

@+

ps : j'ai toujours été fan de Mr Al Bundy

Re: Punch Encoder et Launcher

Publié : jeu. 28/août/2014 12:58
par majikeyric
Effectivement agir sur un seul bit de chaque composante permettrait de complètement camoufler l'EXE. Par contre sa taille ne dépasserait pas 98Ko.
Faut jongler avec les masquages et décalages de bits.
Cool Dji a écrit :j'ai toujours été fan de Mr Al Bundy
Ouais j'adoooooore :lol: :D

Re: Punch Encoder et Launcher

Publié : ven. 29/août/2014 0:56
par majikeyric
Je me suis amusé à retravailler les codes, en intégrant l'idée de Cool Dji, à savoir encoder l'exécutable sur le bit 0 de chaque composante (R,G,B et Alpha) de l'image.
L'image est convertie en 32 bit pour intégrer le canal Alpha si elle ne l'est pas déjà.

De ce fait, l'image n'est pas dégradée et on peut encoder un exécutable de 128Ko.

Code : Tout sélectionner

; Program Encoder 4 bit
; Exécutable encodé sur le bit 0 de chaque composante (R,G,B et Alpha)

EnableExplicit

#TailleExecMax=((512*512*4)/8)-4 ; 131068 octets ~= 128 Ko

Enumeration
	#Composante_Red
	#Composante_Green
	#Composante_Blue
	#Composante_Alpha
EndEnumeration

Define.s nomProgramme, nomImage, nomImageEncodee
Define.i fichierExec, tailleExec, imageSource, imageCible, x, y
Define.a octet

Procedure EncodeOctet(val.a,*x.integer,*y.integer)
	
	Protected.i xs, ys, composante, pixelX, i
	Protected.l coul
	Protected.a valComposante, valBit, valR, valG, valB, valA
	
	xs=*x\i
	ys=*y\i
	
	For i=0 To 7
		
		composante=xs%4
		pixelX=xs/4
		
		coul=Point(pixelX,ys)
		valR=Red(coul)
		valG=Green(coul)
		valB=Blue(coul)
		valA=Alpha(coul)
		
		Select composante
			Case #Composante_Red
				valComposante=valR
			Case #Composante_Green
				valComposante=valG
			Case #Composante_Blue
				valComposante=valB
			Case #Composante_Alpha
				valComposante=valA
		EndSelect
		
		valBit=(val & $80) >> 7
		val<<1
		valComposante=(valComposante & $fe) | valBit
		
		Select composante
			Case #Composante_Red
				coul=RGBA(valComposante,valG,valB,valA)
			Case #Composante_Green
				coul=RGBA(valR,valComposante,valB,valA)
			Case #Composante_Blue
				coul=RGBA(valR,valG,valComposante,valA)
			Case #Composante_Alpha
				coul=RGBA(valR,valG,valB,valComposante)
		EndSelect
		
		Plot(pixelX,ys,coul)
		
		xs+1
		If xs=4*512
			xs=0
			ys+1
		EndIf
		
	Next
	
	*x\i=xs
	*y\i=ys
	
EndProcedure


UsePNGImageDecoder()
UsePNGImageEncoder()

nomProgramme=OpenFileRequester("Choisissez votre exécutable","","Fichiers exécutables (*.exe)|*.exe",0)

If nomProgramme
	
	tailleExec=FileSize(nomProgramme)
	
	If tailleExec<1
		
		MessageRequester("Erreur","Vous n'avez pas selectionner un exe valide !",#PB_MessageRequester_Ok)
		
	ElseIf tailleExec<=#TailleExecMax
		
		nomImage=OpenFileRequester("Choisissez une image","","Fichiers images (*.bmp;*.png)|*.bmp;*.png",0)
		
		If nomImage
			
			imageSource=LoadImage(#PB_Any,nomImage)
			
			If Not imageSource
				MessageRequester("Erreur","Impossible de charger l'image !",#PB_MessageRequester_Ok)
			Else
				ResizeImage(imageSource,512,512,#PB_Image_Raw)
				
				imageCible=CreateImage(#PB_Any,512,512,32)
				
				If imageCible
					
					If StartDrawing(ImageOutput(imageCible))
						
						DrawingMode(#PB_2DDrawing_AllChannels)
						DrawImage(ImageID(imageSource),0,0)
						
						x=0
						y=0
						
						; Encodage de la taille de l'exécutable (sur 4 octets)
						
						EncodeOctet( tailleExec & $ff			,@x,@y)
						EncodeOctet((tailleExec & $ff00)>>8		,@x,@y)
						EncodeOctet((tailleExec & $ff0000)>>16	,@x,@y)
						EncodeOctet((tailleExec & $ff000000)>>24,@x,@y)
						
						fichierExec=ReadFile(#PB_Any,nomProgramme)
						
						If fichierExec
							
							While Not Eof(fichierExec)
								octet=ReadAsciiCharacter(fichierExec)
								EncodeOctet(octet,@x,@y)
							Wend
							
							CloseFile(fichierExec)
							
						EndIf
						
						StopDrawing()
						
						nomImageEncodee=SaveFileRequester("Enregistrez la nouvelle image sous...","","Fichiers images (*.png)|*.png",0)
						
						If nomImageEncodee
							
							If GetExtensionPart(nomImageEncodee)=""
								nomImageEncodee+".png"
							EndIf
							
							If SaveImage(imageCible,nomImageEncodee,#PB_ImagePlugin_PNG)
								MessageRequester("OK!","Image encodée enregistrée avec succès.",#PB_MessageRequester_Ok)
							Else
								MessageRequester("Erreur","L'image n'a pas pu être enregistrée !",#PB_MessageRequester_Ok)
							EndIf
							
						EndIf
						
					EndIf
					
				Else
					MessageRequester("Erreur","Impossible de créer l'image cible !",#PB_MessageRequester_Ok)
				EndIf
				
			EndIf
			
		EndIf
		
	Else
		MessageRequester("Erreur","La taille du fichier exécutable ne peut pas dépasser "+Str(#TailleExecMax)+" octets !",#PB_MessageRequester_Ok)
	EndIf
	
EndIf

Code : Tout sélectionner

; Program launcher 4 bit
; Exécutable encodé sur le bit 0 de chaque composante (R,G,B et Alpha)

EnableExplicit

Enumeration
	#Composante_Red
	#Composante_Green
	#Composante_Blue
	#Composante_Alpha
EndEnumeration

Define.i image, tailleExec, fichierExec, x, y

Procedure.a LitOctet(*x.integer,*y.integer)
	
	Protected.i xs, ys, composante, pixelX, i
	Protected.l coul
	Protected.a valComposante, valBit, val
	
	xs=*x\i
	ys=*y\i
	
	val=0
	
	For i=0 To 7
		
		composante=xs%4
		pixelX=xs/4
		
		coul=Point(pixelX,ys)
		
		Select composante
			Case #Composante_Red
				valComposante=Red(coul)
			Case #Composante_Green
				valComposante=Green(coul)
			Case #Composante_Blue
				valComposante=Blue(coul)
			Case #Composante_Alpha
				valComposante=Alpha(coul)
		EndSelect
		
		valBit=valComposante & 1
		val << 1
		val | valBit
		
		xs+1
		If xs=4*512
			xs=0
			ys+1
		EndIf
		
	Next
	
	*x\i=xs
	*y\i=ys
	
	ProcedureReturn val
	
EndProcedure

UsePNGImageDecoder()

image=LoadImage(#PB_Any,"1.png")

If image
	
	If StartDrawing(ImageOutput(image))
		
		DrawingMode(#PB_2DDrawing_AllChannels)
		
		x=0
		y=0
		
		tailleExec=LitOctet(@x,@y)| LitOctet(@x,@y)<<8 | LitOctet(@x,@y)<<16 | LitOctet(@x,@y)<<24
		
		fichierExec=CreateFile(#PB_Any,"1.exe")
		
		While tailleExec
			WriteAsciiCharacter(fichierExec,LitOctet(@x,@y))
			tailleExec-1
		Wend
		
		StopDrawing()
		
		CloseFile(fichierExec)
		
		RunProgram("1.exe","","",#PB_Program_Wait)
		DeleteFile("1.exe")
		
	EndIf
EndIf

Re: Punch Encoder et Launcher

Publié : ven. 29/août/2014 8:09
par Cool Dji
Yes, joli !

Bravo, par contre, t'es viré du PurePunch, ça dépasse 50 lignes :mrgreen:

Re: Punch Encoder et Launcher

Publié : dim. 31/août/2014 11:07
par graph100
Génial, maintenant ça devient intéressant :mrgreen: