elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware (Moderador: fary)
| | |-+  [SRC][C] RebuildPE
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [SRC][C] RebuildPE  (Leído 5,998 veces)
[Zero]
Wiki

Desconectado Desconectado

Mensajes: 1.082


CALL DWORD PTR DS:[0]


Ver Perfil WWW
[SRC][C] RebuildPE
« en: 28 Julio 2009, 20:49 pm »

Bueno, pues yo aquí otra vez con una función  :xD. Ésta función cambia bastantes cosas en el PE, cambia las secciones de orden (en lo que es en el archivo, en la cabecera no ya que de poco serviría), mete el EOF Data dentro de la última sección y actualiza el CheckSum (me aburría  :P). Tambien tenía casi terminado para que cambiara el Align del archivo, pero se me extendía demasiado el código, si necesito terminarla lo posteo en una función aparte.

La parte de reordenar las secciones se puede hacer de una forma más rápida y con menos código (Cambiando sólo el PointerToRawData), pero como eso se me ocurrió despues de terminar..

Código
  1. LPSTR RebuildPE(LPSTR FileName,LPSTR lpFileMaped,DWORD FileSize)
  2. {
  3. PIMAGE_DOS_HEADER IDH;
  4. PIMAGE_NT_HEADERS INTH;
  5. PIMAGE_SECTION_HEADER ISH;
  6.  
  7. IDH=(PIMAGE_DOS_HEADER)&lpFileMaped[0];
  8. INTH=(PIMAGE_NT_HEADERS)&lpFileMaped[IDH->e_lfanew];
  9.  
  10. //Creamos un buffer y guardamos una copia del archivo mapeado
  11. LPSTR Temp=(LPSTR)GlobalAlloc(GPTR,FileSize);
  12. CopyMemory(&Temp[0],&lpFileMaped[0],FileSize);
  13.  
  14. //Cambiamos las secciones en el archivo de orden (no en la cabecera)
  15. for(DWORD i=0;i<INTH->FileHeader.NumberOfSections;i++)
  16. {
  17. PIMAGE_DOS_HEADER tIDH;
  18. PIMAGE_NT_HEADERS tINTH;
  19. PIMAGE_SECTION_HEADER tISH;
  20. PIMAGE_SECTION_HEADER tISH2;
  21. PIMAGE_SECTION_HEADER ISH2;
  22.  
  23. tIDH=(PIMAGE_DOS_HEADER)&Temp[0];
  24. tINTH=(PIMAGE_NT_HEADERS)&Temp[tIDH->e_lfanew];
  25.  
  26. tISH=(PIMAGE_SECTION_HEADER)&Temp[tIDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*(i+1)];
  27. ISH2=(PIMAGE_SECTION_HEADER)&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*(i+1)];
  28. tISH2=(PIMAGE_SECTION_HEADER)&Temp[tIDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
  29. ISH=(PIMAGE_SECTION_HEADER)&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
  30.  
  31.  
  32. if(i!=INTH->FileHeader.NumberOfSections-1)
  33. {
  34. CopyMemory(&lpFileMaped[ISH->PointerToRawData],&Temp[tISH->PointerToRawData],tISH->SizeOfRawData);
  35. ISH->SizeOfRawData=tISH->SizeOfRawData;
  36. ISH->Characteristics=tISH->Characteristics;
  37. ISH->VirtualAddress=tISH->VirtualAddress;
  38. CopyMemory(&ISH->Name,&tISH->Name,8);
  39.  
  40. ISH2->PointerToRawData=ISH->PointerToRawData+tISH->SizeOfRawData;
  41. }
  42. else
  43. {
  44. tISH=(PIMAGE_SECTION_HEADER)&Temp[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)];
  45. ISH=(PIMAGE_SECTION_HEADER)&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
  46. CopyMemory(&lpFileMaped[ISH->PointerToRawData],&Temp[tISH->PointerToRawData],tISH->SizeOfRawData);
  47. ISH->SizeOfRawData=tISH->SizeOfRawData;
  48. ISH->Characteristics=tISH->Characteristics;
  49. ISH->VirtualAddress=tISH->VirtualAddress;
  50. CopyMemory(&ISH->Name,&tISH->Name,8);
  51. }
  52. }
  53.  
  54. LPSTR SecTmp=(LPSTR)GlobalAlloc(GPTR,0x28*INTH->FileHeader.NumberOfSections);
  55. CopyMemory(&SecTmp[0],&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)],0x28*INTH->FileHeader.NumberOfSections);
  56.  
  57. //Reordenamos las secciones en la cabecera
  58. for(DWORD i=0;i<INTH->FileHeader.NumberOfSections;i++)
  59. {
  60. if(i==0)
  61. {
  62. CopyMemory(&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)],&SecTmp[0x28*(INTH->FileHeader.NumberOfSections-1)],0x28);
  63. }
  64. else
  65. {
  66. CopyMemory(&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i],&SecTmp[0x28*(i-1)],0x28);
  67. }
  68. }
  69.  
  70. GlobalFree(Temp);
  71.  
  72. //Obtenemos el PointerToRawData más alto y el tamaño total de todas las secciones
  73. DWORD MaxPointerToRawData=0;
  74. DWORD TotalSectionsSize=0;
  75. for(DWORD i=0;i<INTH->FileHeader.NumberOfSections;i++)
  76. {
  77. ISH=(PIMAGE_SECTION_HEADER)&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
  78.  
  79. if(MaxPointerToRawData<ISH->PointerToRawData)
  80. {
  81. MaxPointerToRawData=ISH->PointerToRawData;
  82. }
  83. TotalSectionsSize=TotalSectionsSize+(DWORD)(ISH->SizeOfRawData);
  84. }
  85.  
  86. //Obtenemos la sección con el PointerToRawData más alto
  87. for(DWORD i=0;i<INTH->FileHeader.NumberOfSections;i++)
  88. {
  89. ISH=(PIMAGE_SECTION_HEADER)&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
  90. //Si es la sección que contiene el PointerToRawData más alto salimos del bucle
  91. if(ISH->PointerToRawData==MaxPointerToRawData)
  92. {
  93. i=INTH->FileHeader.NumberOfSections;
  94. }
  95. }
  96.  
  97. //Si hay EOF Data
  98. if(ISH->PointerToRawData+ISH->SizeOfRawData<FileSize)
  99. {
  100. //Metemos el EOF Data dentro de la última sección
  101. ISH->SizeOfRawData=ISH->SizeOfRawData+(FileSize-(ISH->PointerToRawData+ISH->SizeOfRawData));
  102. }
  103.  
  104. //Obtenemos el SizeOfImage y ajustamos el VirtualSize de las secciones
  105. DWORD SizeOfImage=0;
  106. for(DWORD i=0;i<INTH->FileHeader.NumberOfSections;i++)
  107. {
  108. ISH=(PIMAGE_SECTION_HEADER)&lpFileMaped[IDH->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*i];
  109. ISH->Misc.VirtualSize=ISH->SizeOfRawData;
  110. if(SizeOfImage<ISH->VirtualAddress)
  111. {
  112. SizeOfImage=ISH->VirtualAddress+ISH->Misc.VirtualSize;
  113. }
  114. }
  115.  
  116. //Ajustamos el SizeOfImage
  117. INTH->OptionalHeader.SizeOfImage=SizeOfImage;
  118.  
  119. //Recalculamos el CheckSum
  120. _MapFileAndCheckSum miMapFileAndCheckSum=NULL;
  121. HMODULE hLib=LoadLibraryA("IMAGEHLP.DLL");
  122. miMapFileAndCheckSum=(_MapFileAndCheckSum)GetProcAddress(hLib,"MapFileAndCheckSumA");
  123.  
  124. DWORD OrignalCheckSum=0;
  125. DWORD newCheckSum=0;
  126. miMapFileAndCheckSum((PTSTR)FileName,&OrignalCheckSum,&newCheckSum);
  127.  
  128. INTH->OptionalHeader.CheckSum=newCheckSum;
  129.  
  130. return lpFileMaped;
  131. }

Como las secciones no están ordenadas por el PointerToRawData en la cabecera, algunos visores del PE (Pe explorer por ejemplo) dice que tiene EOF data, pero no la tiene  ;D.



Saludos

PD: Gracias a Karcrack y Arkangel por escuchar mis lamentos  ;D.
« Última modificación: 8 Mayo 2010, 13:18 pm por Hacker_Zero » En línea


“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche
Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [SRC][C] RebuildPE
« Respuesta #1 en: 29 Julio 2009, 09:37 am »

Jeje, de nada Hacker_Zero :xD Tampoco te lamentas tanto :rolleyes: :xD

Estas liberando el VM v2 por piezas ;D ;D
En línea

Arkangel_0x7C5


Desconectado Desconectado

Mensajes: 361



Ver Perfil
Re: [SRC][C] RebuildPE
« Respuesta #2 en: 29 Julio 2009, 15:32 pm »

Estas liberando el VM v2 por piezas ;D ;D
Asi se vende mas caro ;D

Saludos
En línea

COND0R

Desconectado Desconectado

Mensajes: 3


puff Kevin Mitnick?? un poroto!! xD


Ver Perfil
Re: [SRC][C] RebuildPE
« Respuesta #3 en: 30 Noviembre 2012, 04:48 am »

Gracias por tu codigo y tengo una pregunta utilizaste la libreria windows.h? para saber de donde salieron PIMAGE_DOS_HEADER IDH, PIMAGE_NT_HEADERS INTH, PIMAGE_SECTION_HEADER ISH;   xD
En línea

El lenguaje global tendría que ser C++ xD...
fary
Moderador
***
Desconectado Desconectado

Mensajes: 1.075



Ver Perfil WWW
Re: [SRC][C] RebuildPE
« Respuesta #4 en: 2 Diciembre 2012, 13:47 pm »

Gracias por tu codigo y tengo una pregunta utilizaste la libreria windows.h? para saber de donde salieron PIMAGE_DOS_HEADER IDH, PIMAGE_NT_HEADERS INTH, PIMAGE_SECTION_HEADER ISH;   xD

Sí, esas estructuras son de windows.h

un saludo.
En línea

Un byte a la izquierda.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Qué es RebuildPE?
Ingeniería Inversa
.:UND3R:. 3 2,271 Último mensaje 18 Junio 2011, 19:06 pm
por .:UND3R:.
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines