J'essaie de coder un packer/protecteur exe comme un moyen d'en apprendre plus sur l'assembleur, C++, et comment fonctionnent les fichiers PE. Je l'ai actuellement fonctionné ainsi la section contenant l'EP est XORed avec une clé et une nouvelle section est créée qui contient mon code de déchiffrement. Tout fonctionne très bien sauf quand j'essaie et JMP à l'EP original après le décryptage.JMP à l'adresse absolue (codes op)
En fait, je fais ceci:
DWORD originalEntryPoint = optionalHeader->AddressOfEntryPoint;
// -- snip -- //
crypted.put(0xE9);
crypted.write((char*)&orginalEntryPoint, sizeof(DWORD));
Mais au lieu de sauter au point d'entrée, ollydbg montre que ce code désassemble à:
00404030 .-E9 00100000 JMP 00405035 ; should be 00401000 =[
et lorsque je tente de le changer manuellement olly le nouvel opcode apparaît comme
00404030 -E9 CBCFFFFF JMP crypted.00401000
D'où provient 0xCBCFFFFF? Comment pourrais-je générer cela du côté C++?
Des idées sur ce qui remplacerait E9? –
@Chris: cela peut vous aider dans votre recherche: http://ref.x86asm.net/ – fvu
Les sauts sont généralement relatifs. Il y a un opcode 'EA' pour un saut à une adresse extrême absolue, et des opcodes pour des sauts vers une adresse indirecte (où l'opérande spécifie l'emplacement de mémoire qui contient l'adresse à laquelle on doit sauter). – ChrisW