Comment signer toutes vos applications ?

11 commentaires - Ajouter un commentaire.

Symbian a fermé récemment son site Symbian Signed qui délivrait des certificats afin de pouvoir signer nos applications. Depuis quelques semaines, la réouverture du site ne permet plus d'obtenir ces fameux et précieux certificats, et en remplacement un nouveau système a été mis en place. Maintenant la signature des applications se fait directement en ligne via ce portail Open Signed Online. Malheureusement, ce nouveau service de signature n'autorise pas la signature des applications utilisant un protected UID, ce qui pénalise bien les utilisateurs de Symbian S60 3rd. En effet si les applications shareware sont déjà signées, certains (voire beaucoup) applications freewares (nécessitant d'être signées) utilisent un protected UID, ce qui empêche à l'état actuel leur installation.
Le but de ce tutoriel est de montrer qu'il est toutefois possible de remédier à ce problème en modifiant cet UID avec une valeur non protégée. Avec ce tutoriel, vous pouvez passer avec succès la signature de Open Signed Online.
Rien de méchant dans ce tutoriel car tout est plus ou moins documenté par Symbian. Je ne rentrerai pas dans les détails techniques pour l'instant, je vous laisse le soin d'aller consulter les sites de Symbian. Je détaillerai les différents points dans des posts ultérieurs.


Avant de poursuivre la suite de ce tutoriel, je tiens à préciser que le tutoriel est à caractère strictement informatif (comme tout le site) et par conséquent je ne serai en aucun cas responsable des problèmes que vous pouvez rencontrer par la suite ou de que vous pouvez faire avec mon tutoriel. Je décline toute responsabilité.

1. Logiciels requis

Commençons par lister les applications que vous devez installer sur votre PC Windows.

Commençons par lister les applications que vous devez installer sur votre PC Windows :

  • un éditeur hexadécimal : Winhex par exemple ;
  • uNsis et winSiS, deux logiciels qui permettent respectivement de décompresser un fichier .sis pour voir son contenu et de reconstituer ensuite le .sis (avec makesis) ;
  • S60 SDK for Symbian OS : bien utile car il contient une richesse d'information et des outils pour manipuler les fichiers .sis et leurs contenus. Allez sur cette page et à gauche sélectionnez "3rd Edition FP1" dans la menu déroulant "Download version for", puis cliquez sur "Download now".
  • optionnel : SiSXplorer qui est un IHM pratique pour voir les détails d'un fichier .sis.
Toutes ces applications sont faciles à installer sous Windows. Suivez juste les instructions et laissez tous par défaut.

La suite de ce tutoriel sera faite avec un exemple d'une application fictive toto.sis. Remplacez juste toto.sis par l'application que vous souhaitez signer.

2. Décompressez l'archive toto.sis avec uNsIs

Par défaut uNsIs et WinSIS sont installés dans les répertoires C:\uNsIs et C:\WinSIS.
Lancez uNsIs. En bas de la fenêtre uNiS, vous voyez Open SIS, cliquez sur ce bouton puis sélectionnez votre fichier toto.sis. Vous verrez alors apparaitre dans la partie Information de la fenêtre uNsIs le contenu de toto.sis (la liste des fichiers contenus à l'intérieur). Cliquez alors sur Extract pour extraire le contenu. Les fichiers extraits se retrouvent dans le répertoire C:\uNsIs\temp (vous y avez en principe trois répertoires private, resource et sys). Dans le répertoire C:\uNsIs\pkg, vous pouvez trouver le fichier pkg.txt qui liste le contenu de votre fichier toto.sis.


Important, pensez à effacer le contenu de ces deux répertoires C:\uNsIs\temp et C:\uNsIs\pkg avant d'exécuter uNsIs pour extraire un autre fichier .sis. Et surtout ne touchez à rien au répertoire C:\uNsIs\bin qui contient les fichiers d'installation de uNsIs, nécessaires à son bon fonctionnement.

Maintenant que votre fichier toto.sis est décompressé. Vous devez modifier certains fichiers extraits. Les fichiers les plus importants à modifier sont les fichiers avec l'extension .exe (qui se trouve dans C:\uNsIs\temp\sys\bin) et .dll. Les fichiers .dll ne sont pas présents dans tous les fichiers .sis, mais leur structure est identique au fichier .exe.
Allez dans le répertoire C:\uNsIs\temp\sys\bin, vous devez trouver un fichier avec l'extension .exe, toto.exe dans notre example. Ce fichier binaire, contrairement à ce que vous pouvez pensez, a une structure bien particulière, il s'agit d'un exécutable SymbianOS 9 (appelé E32Image) possédant un format bien défini. Voici le format du E32Image :


C'est dans l'entête de l'image E32 (partie E32 Header) que se trouvent les UID et SID utilisés par notre application Symbian toto.sis. Pour rappel, ce sont ces valeurs qu'on doit modifier pour pouvoir passer avec succès la signature online de Symbian Signed. Pour plus de détails sur le format E32, je vous conseille de venir voir ici. Vous pouvez aussi trouver des explications bien intéressantes sur le site de Symbian.

3. Modification de l'UID

Nous entrons, dans cette section, au cœur du sujet même de ce tutoriel. Cette partie concerne la modification du fichier toto.exe (et aussi des fichier .dll si vous en avez).

Avant toute chose, si vous n'êtes pas familier avec la notation hexadécimale, je vous conseille de jeter un coup d'oeil sur wikipédia. En effet, nous allons utiliser l'éditeur hexadécimal Winhex pour modifier l'exécutable toto.exe (il est plus facile de voir en hexa qu'en binaire avec des 0 et 1 !!!).
Le Header du E32Image, entête du fichier toto.exe, est la partie la plus intéressante, déclarée dans le fichier \epoc32\include\f32image.h si vous avez installé le SDK Symbian S60 3rd FP1. Elle est composée de trois sous-parties E32ImageHeader, E32HeaderComp et E32ImageHeaderV. Les classes E32ImageHeader et E32ImageHeaderV nous intéressent ici.
Voici format de E32ImageHeader (j'ai mis en rouge les champs qui nous intéressent) :

TUint32 iUid1;
TUint32 iUid2;
TUint32 iUid3; // l'UID qu'on doit modifier
TUint32 iUidChecksum;
TUint iSignature; // 'EPOC'
TUint32 iHeaderCrc; // CRC-32 of entire header
TUint32 iModuleVersion; // Version number for this executable
TUint32 iCompressionType; // Type of compression used (UID or 0 for none)
TVersion iToolsVersion; // Version of PETRAN/ELFTRAN which generated this file
TUint32 iTimeLo;
TUint32 iTimeHi;
TUint iFlags; // 0 = exe, 1 = dll, 2 = fixed address exe
TInt iCodeSize; // size of code, import address table, constant data and export dir
TInt iDataSize; // size of initialised data
TInt iHeapSizeMin;
TInt iHeapSizeMax;
TInt iStackSize;
TInt iBssSize;
TUint iEntryPoint; // offset into code of entry point
TUint iCodeBase; // where the code is linked for
TUint iDataBase; // where the data is linked for
TInt iDllRefTableCount; // filling this in enables E32ROM to leave space for it
TUint iExportDirOffset; // offset into the file of the export address table
TInt iExportDirCount;
TInt iTextSize; // size of just the text section
TUint iCodeOffset; // file offset to code section, ça donne la taille de l'entête
TUint iDataOffset; // file offset to data section
TUint iImportOffset; // file offset to import section
TUint iCodeRelocOffset; // relocations for code and const
TUint iDataRelocOffset; // relocations for data
TUint16 iProcessPriority; // executables priority
TUint16 iCpuIdentifier; // 0x1000 = X86, 0x2000 = ARM

Précisons maintenant les 4 champs qui nous intéressent :
  • iUid3 (offset 0x08) : c'est l'UID de l'application Symbian (toto.sis dans notre cas), elle est unique sur le téléphone; c'est cet élément qu'on va modifier par la suite ;
  • iUidChecksum (offset 0x0C) : checksum calculé à partir des 3 UIDs (iUid1, iUid2 et iUid3) ; il existe une commande uidcrc dans le SDK qui permettent de calculer ce checksum ;
  • iHeaderCrc (offset 0x14) : le CRC32 de toute l'entete E32Image ; le CRC permet de vérifier, au moment de l'installation de l'application toto.sis, l'intégrité du fichier toto.exe (voir s'il y a des erreurs) ; donc si ce CRC n'est pas correctement calculé, l'installation sera impossible ;
  • iCodeOffset (offset 0x64) : donne la taille (en octets) de l'entête E32Image.
A cela, s'ajoute aussi le champ iSecureId (offset 0x80) dans la classe E32ImageHeaderV qui, habituellement, prend la même valeur que iUid3 ; il faudra donc aussi le modifier.

Comme vous pouvez constater, la modification seule de l'iUid3 nécessite la modification des autres champs (iUidChecksum, iHeaderCrc, iCodeOffset et iSecureId).

Pour mieux comprendre, rien ne vaut que la pratique ! Lancez Winhex, puis ouvrez le fichier toto.exe (qui se trouve dans C:\uNsIs\temp\sys\bin). Vous verrez alors apparaître quelque chose qui ressemble à la figure suivante :


J'ai mis en fond bleu l'entête du E32Image dont la taille est de 0x9C qui correspond bien à la valeur donnée par le champ iCodeOffset (mis en évidence sur le sreenshot par un rectangle vert). Le champ iUid3 (situé à l'offset 0x08 et identifié par le premier rectangle rouge) a la valeur 0xA0231DD2 : attention le fichier étant en binaire est codé en little endian, ce qui veut dire que les octets sont inversés. Vous voyez que le champ iSecureId (se positionnant à l'offset 0x80 et identifié par le deuxième rectangle rouge) a la même valeur que l'iUid3. Les rectangles rose et bleu vous donnent respectivement les champs iUidChecksum et iHeaderCrc.

Nous allons maintenant modifier ces différents champs. Commencez par l'iUid3 : vous devez prendre une valeur qui est dite "unprotected" afin de pouvoir signer votre application. Pour cela, prenez une valeur (sur 4 octets) commencant par 0xE*******, par exemple 0xE400234A.

A freeware developer should release an application with a UID from the *0xE*-range (Development use). Using such a UID allows users to get the according application signed via Open Signed Online. The 0xA-range (V9 unprotected UID allocations) does not work! As the Symbiansigned documentation is not clear on this it will be changed soon.

Dans notre exemple, nous devons donc modifier avec l'aide de Winhex les valeurs des deux rectangles rouges par cette nouvelle valeur 0xE400234A. Pour cela allez dans le menu Search, puis Replace Hex Values : dans la petite fenêtre contextuelle qui apparaît, mettez dans "Search for" la valeur D21D23A0 et dans "Replace with" 4A2300E4 (notez bien l'ordre little endian - en inversant les octets), et choississez "Prompt when found" et pour terminer, cliquez sur OK.


Regardez bien ce que Winhex vous propose alors de modifier : vérifier que les valeurs que vous remplacez correspondent bien aux deux offsets 0x08 et 0x80 (où se trouvent les champs iUid3 et iSecureId).

Comme vous avez modifié les deux champs iUid3 et iSecureId du fichier toto.exe, vous devez recalculer les checksums, autrement dit vous devez mettre à jour les deux champs iUidChecksum et iHeaderCrc.

Le cheksum iUidChecksum est calculé sur les trois champs iUid1 (offset 0x0), iUid2 (offset 0x04) et iUid3 (offset 0x08). Pour cela nous allons utiliser l'outil udicrc du SDK Symbian. Ouvrez une fenetre DOS, puis tapez
C:\>uidcrc 0x1000007A 0x00000000 0xE400234A
(ceci correspond à notre exemple, vous devez mettre par ordre vos iUid1, iUid2 et le nouveau iUid3 que vous venez de modifier)
Modifiez alors le champ iUidChecksum avec cette nouvelle valeur obtenue par uidcrc.

Il ne reste plus qu'à modifier le champ iHeaderCrc. Avant tout, je vous explique comment est calculé ce CRC32. Avant l'installation, l'installer de Symbian vérifie ce CRC32 : il remplace la valeur présente dans le champ iHeaderCrc, notée x, par cette valeur 0xc90fdaa2, puis calcule le CRC32 sur toute l'entête. Si la valeur obtenue n'est pas égale à la valeur x d'origine, Symbian conclut qu'il y a des erreurs, donc l'intégrité du fichier est corrompue, et l'installation ne se fera pas ! De plus il est important de noter que Symbian utilise une valeur nulle pour initialiser l'algorithme de calcul du CRC32.

Pour modifier notre champ iHeaderCrc, remplacez donc la valeur présente par 0xc90fdaa2 (pensez bien à mettre l'ordre little endian), puis sélectionnez toute l'entête E32Image en prenant bien connaissance de sa taille donnée par le champ iCodeOffset (cf figure de la fenetre Winhex, zone en fond bleu). Vous devez alors appliquer l'algorithme CRC32 sur ce bloc de données avec une valeur d'initialisation nulle. Malheureusement, vous ne pouvez pas utiliser Winhex pour faire ce calcul ! En effet Winhex utilise la valeur Oxffffffff pour initialiser l'algorithme CRC32. Le seul moyen qu'il vous reste est d'implémenter vous-même dans un langage de programmation cet algorithme CRC32, largement documenté sur le net ! Une fois obtenu le CRC, vous devez le mettre dans le champ iHeaderCrc (en remplacement de 0xc90fdaa2).

Voilà c'est terminé pour le fichier toto.exe. Faites de même pour les fichiers .dll si vous en avez. N'oubliez pas aussi de modifier les autres fichiers (.rsc par exemple) qui peuvent contenir la valeur de l'UID soit directement en binaire soit en affichage ascii (texte). Pensez également à modifier les noms des fichiers en accord avec le nouveau UID.

4. Reconstruction du fichier .sis

Une fois l'UID modifié dans les fichiers de votre .sis, vous devez repackager ces fichiers pour reconstruire votre .sis. Pour cela, vous pouvez utiliser makesis ou lancez WinSIS Pro et pensez à bien mettre votre nouveau UID dans WinSIS


5. Signez votre application

Signez maintenant votre application sur le site de Symbian Signed ! ;-)

 
Cet article a 11 commentaires. Ajoutez le vôtre !
Anonyme - 9 mars 2008 à 21:08

Sympa ton tutorial.
Juste une question sur l'IHeaderCrc; on est d'accord que dans ton example il est égal à: 0x420AEA54(encadré bleu), seulement si on fait selectionne le fond bleu que tu nous dit, on obtient pas le bon crc32(jusqu'a l'offset 0x9C on est d'accord?).
Alors comment faire?

Anonyme - 9 mars 2008 à 22:08

si tu veux retrouver l'iHeaderCrc sur mon exemple, tu changes 54EA0A42 par A2DA0FC9, puis tu calcules le CRC32 sur le bloc allant de l'offset 0x0 à 0x9C (exclu).
Tu devrais avoir 0x420AEA54

Unknown - 10 mars 2008 à 02:17

merci pour le taf est il possible de faire ca sur mac ???

Moonlight - 10 mars 2008 à 10:31

je ne sais pas, j'ai pas de mac !
sous linux aucun souci !

Anonyme - 11 mars 2008 à 20:12

salut, super ton tuto ! je n'ai pas pû trouver Winsis pro , tout les liens sont down :(
peux tu me le fournir ? zebulon94 [ at ] wanadoo.fr

merci bcp !!

Anonyme - 14 mars 2008 à 17:40

Pour winsis, on le trouve
ICI

Anonyme - 17 mars 2008 à 01:22

franchement c'est très bien expliqué ,voir même trop bien.T'aurais du faire plus léger sur les explications -c limite si c'est pas un cours ! ;)
pourrais tu faire un tuto plus simple pour un forum ex: forum mobile ou forumnokia?
merci

Anonyme - 19 mars 2008 à 17:35

bonjour, déjà je tiens a te remercier pour ce super tuto.
J'ai une question à te poser ci cela ne te dérange pas.
pour calculer le nouveau iHeaderCrc, il faut juste changer ce qu'il y a en rose, et en rouge?
et la bleu on la change une fois la valeur obtenu non?

Parceque là j'ai un soucis j'arrive a calculer le crc avec un programme mais il faut juste que je sélectionne de l'offset 0x0 à 0x9C (exclu).
Donc si je cré un nouveau fichier winhex en copier juste e l'offset 0x0 à 0x9C (exclu) et en l'enregistran je devrais pouvoir trouver le bon IHeaderCrc?

merci de m'aider.
Cordialement

Al - 26 mars 2008 à 00:11

Very nice tutorial but i still have some problems.. how can i contact you privately to discuss my technical concerns? please write back to me, here's my email address: alberto DOT rossi87 AT gmail DOT com

Thanks!

Anonyme - 23 avril 2008 à 03:15

Heelo, Tous mes compliments pour ce tuto ; j'ai fait quelques essais sur un P1i sous UIQ3 et j'utilise des logiciels quelques peut differents. ESSAIS concluant , sauf avec un fichier SIS (signé par symbian ) mais dont l'installation ne va pas à son terme (la barre de défillement s'arrete au 3/4 )C'est un logiciel pour regarder la TV ou toutes sources video privées par internet avec télécommande : LFTV Je peux t'envoyer le fichier SIS sous zip ;voici mon Mail : marthube[at]ifrance.com ; A++++++ et encore BRAVO ! OEIL

Anonyme - 1 mai 2008 à 19:35

Hello , je reviens vers toi , car dans le forum nokia , il est dit que des applications SIS meme signées ne ,s'installe mais ne veulent pas demarer ; j' ai le meme probleme avec mon application LFP que je veux utiliser à titre privé sur mon P1i sonyericsson sous UIQ3 ; J' ai modifié les fichiers MMP , PKG , de l'EXE avec CARBIDE 1.3 (en plus du PKG du SIS ), mais c'est toujours le meme probleme bien que l'appli soit signée par symbian signed ou avec un certif du site chinois OPA.
j'ai lu que ton nokia 95 est "optimisé" ; pourrais tu m'en dire plus ; mon adresse mail plus haut .
Voici le bébé dans un fichier rar (non signé) http://pierrehubert.com/SELECT/LFPunsign.rar
Pourrais tu y jetter un oeil ?
A++++@@@@
OEIL

Enregistrer un commentaire