Comment changer les chaînes dans la section rdata d'un fichier exécutable?


1

Je suis un programmeur et j'ai une application (un fichier exécutable qui peut être compilé à partir d'une source C++).

Il a une rdata section (lecture seule section de données) qui comprennent de nombreux (plusieurs milliers) des chaînes de l'interface utilisateur de l'application et je veux changer ces chaînes de sorte qu'après les modifications, le fichier exécutable correspondant peut être exécuté sans aucune erreur (la source n'est pas disponible).

enter image description here

L'application dispose de 32 et 64 bits.

Je dois changer les chaînes dans la section rdata sans endommager le fichier exécutable.

Par exemple, changer la section mise en surbrillance: enter image description here

  • Est-il possible?
  • Quelles sont les étapes correctes et meilleurs outils changer trop ces cordes et faire un nouveau fichier exe?

S'il vous plaît guider mon avec des outils et des liens supplémentaires à des tutoriels si cela est possible dans votre réponse et commentaires.


Mise à jour:

chaînes nouvelles sont dans une autre langue et ont des longueurs différentes avec la longueur des cordes principales et je devrais changer beaucoup la chaîne dans rdata.

Plate-forme: Windows 8.1

  0

si elles sont des ressources essayer ResHacker par angus johnson 18 nov.. 172017-11-18 06:25:17

  0

@blabb, je suis familier avec la modification des ressources des fichiers exécutables, mais comme je l'ai dit ces chaînes ne sont pas des ressources et certaines applications comme la dose de pirate de ressources ne les montrent pas. Ils sont dans la section 'rdata' et je dois changer' rdata' sans endommager le fichier exécutable. Je trouve des étapes correctes et des outils utiles pour le faire. 18 nov.. 172017-11-18 13:32:32

  0

Pour les chaînes de même longueur, vous pouvez directement appliquer un patch depuis un éditeur hexadécimal tel que ghex dans Ubuntu. Pour des cordes plus courtes, tamponnez avec \ x00 à la même longueur. 18 nov.. 172017-11-18 13:52:53

  0

@blabb, j'ai mis à jour la question avec quelques images et ... S'il vous plaît le lire. 18 nov.. 172017-11-18 13:57:40

  0

@sudhackar, Merci pour votre réponse. Ma plate-forme est 'Windows' et les nouvelles chaînes sont dans une langue différente avec une longueur différente. 18 nov.. 172017-11-18 13:59:15

2

est une tâche difficile et fastidieuse et complètement sujette aux erreurs

en supposant que vous avez le code compilé et exécuté la première chaîne aura un 68 pousser opcode et la deuxième chaîne aura un opcode FF35 push et les chaînes seraient en.section RDATA

#include <windows.h> 
const char mystr1[] = "mystr1"; 
const char *mystr2 = "mystr2"; 
void main(void) { 
    MessageBoxA(0,mystr2,mystr1,0); 
} 

comme on le voit ci-dessous

|   0x00401000  6a00   push 0 
|   0x00401002  6810204000  push str.mystr1 
|   0x00401007  ff3500304000 push dword [0x403000] 
|   0x0040100d  6a00   push 0 
|   0x0040100f  ff1500204000 call dword [sym.imp.USER32.dll_MessageBoxA] 
|   0x00401015  33c0   xor eax, eax 
\   0x00401017  c3    ret 

vérifier les chaînes

[0x00401000]> ps @0x402010 
mystr1 
[0x00401000]> pv @0x403000 
0x00402018 
[0x00401000]> ps @0x402018 
mystr2 

vous pouvez utiliser des outils comme CFF_Explorer iidking etc ajouter une section

radare2 ajoute également une section mais je ne pouvais pas l'amadouer pour écrire la section détails retour à pe tête er

Comparing files rdata.exe and RDATA1.EXE 
000000C6: 04 05 
00000111: 50 60 
000001C0: 1E 00 
000001C1: 00 10 
000001E8: C2 00 
000001E9: 01 10 
00000210: 04 00 
00000211: 00 10 
00000238: 1C 00 
00000239: 00 10 
00000258: 00 2E 
00000259: 00 6A 
0000025A: 00 73 
0000025B: 00 74 
00000260: 00 80 
00000265: 00 50 
00000269: 00 02 
0000026D: 00 0C 
0000027F: 00 40 
00000800: 18 00 
00000801: 20 50 
FC: RDATA1.EXE longer than rdata.exe 

la nouvelle chaîne à la nouvelle section comme suit

:\>xxd -s 0xc00 -l 0x60 rdata1.exe 
0000c00: 8341 838a 8347 838b 82f0 8e67 82c1 82c4 .A...G.....g.... 
0000c10: 8376 838d 8379 838d 82c9 82e6 82c1 82c4 .v...y.......... 
0000c20: 9755 9866 82b3 82ea 82bd 9792 82cd 8141 .U.f...........A 
0000c30: 837e 8389 8393 835f 82aa 88a4 82f0 91cc .~....._........ 
0000c40: 8cb1 82c5 82ab 82e9 82e6 82a4 82c9 82b7 ................ 
0000c50: 82e9 0000 0000 0000 0000 0000 0000 0000 ................ 

la modification à 0x800, 0x801 dans diff ci-dessus est une redirection vers cette chaîne

maintenant si vous exécutez cela, vous obtiendrez gibberish

vous devrez peut-être définir les paramètres régionaux du système ou besoin de l'application maintenant abandonnée comme applocale.applet avec la base de données appcompat shim pour accrocher et pirater le ch Unicode aracters

font si elle est votre tasse de thé :) (essayez de traduire le message messagebox pour une remise à niveau)

enter image description here

  0

avez-vous utilisé le caractère nul dans la chaîne? et avez-vous vérifié qu'il est codé ascii? 27 nov.. 172017-11-27 13:56:33

  0

@idle désolé je ne suis pas en mesure de comprendre votre commentaire 27 nov.. 172017-11-27 17:41:55

  0

C'est parce que le formatage de chaîne ne ressemble pas du tout à l'ascii, plus comme UTF-16. 27 nov.. 172017-11-27 17:45:02

  0

@idle je n'ai jamais mentionné ascii dans ma démo je dis unicode ou plutôt un large tableau de caractères dans une langue non anglaise 27 nov.. 172017-11-27 17:49:31