2010-09-03 6 views
6

J'ai un exe que j'ai ouvert avec PE Explorer Disassembler. Maintenant, je peux voir le code asm, qui ressemble à ça:Comment convertir ASM en code lisible?

push ebx 
    push esi 
    mov ebx,eax 
    mov eax,[ebx+38h] 
    push eax 
    mov eax,[ebx+3Ch] 
    push eax 
    mov ecx,edx 
    mov eax,ebx 
    mov edx,[ebx+30h] 
    mov esi,[eax] 
    call [esi+7Ch] 
    or byte ptr [ebx+00000088h],02h 
    pop esi 
    pop ebx 
    retn 

Je n'ai aucune idée de ce que cela signifie. Existe-t-il un moyen de convertir ceci maintenant en code lisible (C, C++, C# ou VB.NET)? Informations sur l'arrière-plan: La raison pour laquelle j'ai besoin de cela est que je dois appeler la fonction ci-dessus à partir de mon application Windows. Maintenant, cette fonction réside dans l'exe tiers - il n'y a pas d'API ou de code source pour cela. Toute aide ou conseil est apprécié.

Répondre

0

Ce que vous voulez est appelé "décompilation".

Ce n'est pas facile à résoudre, et souvent pas du tout possible. Vous pouvez essayer Google comme un début.

+0

J'ai lu l'article suivant sur cp: http://www.codeproject.com/KB/cpp/funccaller.aspx - Cant je applique les mêmes méthodes? – vikasde

+0

C'est ce que font les décompilleurs (entre autres choses). Vous pouvez sûrement le faire, mais ce n'est pas une tâche de 5 minutes. – BarsMonster

+0

ok. J'ai essayé de le faire de la façon dont il a été décrit dans l'article, mais je ne pouvais trouver aucune des fonctions qui auraient du sens pour moi. – vikasde

0

Vous pouvez le décompiler en C ou dans un autre langage avec des pointeurs, mais il sera toujours illisible.

1

Si vous pouvez vous en procurer, IDA Pro + Hex-Rays pourrait le décompiler en code semi-lisible.

+1

Hey, seulement 2000 EUR tout ensemble;) ... Je suis un client d'IDA Pro depuis des années, mais en tant qu'individu, je ne pouvais toujours pas être dérangé pour débourser encore plus pour le plugin. – 0xC0000022L

2

Vous devez connaître les arguments utilisés. Dans ce cas, il semble que les arguments sont passés à cette routine dans les registres eax & edx. Une fois que vous savez ce que ces valeurs signifient, vous pouvez probablement comprendre comment cette routine est utilisée et le re-coder dans la langue que vous utilisez.

0

À première vue, c'est un code objectuel; il obtient (au moins) un objet en tant qu'argument, appelle une méthode de cet objet qui prend comme arguments trois des attributs de l'objet, puis place un bit (flag?) dans un autre attribut du même objet à un.

IDA Pro serait probablement en mesure d'identifier le prototype de la fonction et il a une version gratuite disponible qui a toutes les fonctionnalités dont vous avez besoin: http://www.hex-rays.com/idapro/idadownfreeware.htm. Cela ne vous donnera cependant qu'une idée du prototype de la fonction, pas de son comportement (sauf si vous pouvez "lire" l'assemblage x86). Le retour en C/C++ simple nécessite le plugin HexRays qui est plutôt cher et ne fonctionne pas toujours (la décompilation vers un langage de haut niveau est plutôt compliquée).

0

Je suis un peu en retard pour répondre à ce post mais vu que la réponse acceptée est fausse, je donnerai toujours mon 0.2 au cas où d'autres personnes chercheraient la même chose. Ce que vous cherchez n'est pas "décompilation" puisque vous l'avez déjà décompilé en code ASM. Ce que vous voulez, c'est une sorte de compilation du code désassemblé en quelque chose que vous pouvez lire (comme C)

Ce domaine du reverse engineering n'est pas encore bien développé. Certains ont mentionné l'IDA avec certains plugins coûteux, mais il ne vous fera pas bon ... Je mentionnerai le seul programme qui pourraient vous aider: REC

La sortie pourrait ne pas être exacte ou vous pourriez ne pas être en mesure d'obtenir une C code du tout en fonction du programme que vous souhaitez déboguer. Mais c'est la meilleure option que vous avez si vous ne connaissez pas l'assemblage. En ce qui concerne ce que vous essayez de faire, la fonction que vous avez affichée ne fait rien. Il appelle une autre fonction avec des paramètres et obtient une valeur de retour. Ce qui vous intéresse est appelez [esi + 7Ch]. Vous avez besoin d'un débogueur et entrez dans cet appel.

Accrochez cette fonction dans votre programme, c'est une autre histoire ... Vous feriez mieux d'écrire vous-même.

Questions connexes