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

 

 


Tema destacado: Estamos en la red social de Mastodon


  Mostrar Temas
Páginas: 1 ... 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [22] 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 ... 39
211  Programación / Ingeniería Inversa / tomar valores del log o de un txt con ollyscript? en: 20 Octubre 2011, 02:25 am
Pues eso, algo así como GREFF existirá algún comando que tome valores de un txt o mejor todavía del log

Saludos
212  Programación / Ingeniería Inversa / [SCRIPT]Logeador de saltos V1.2 en: 19 Octubre 2011, 21:39 pm
Versión V1.2
¿Para que sirve?
-Si tenemos un programa trial podremos lanzar el script, luego caducarlo (cambiar la fecha) e ejecutar el script nuevamente, luego de eso comparamos y obtendremos el salto que nos bloquea el acceso al programa.
-Si dumpeamos un programa y tiene detección CRC podemos realizar los pasos comentados anteriormente y obtendremos el salto CRC.
-Si tenemos un serial verdadero podemos obtener el salto que nos considera el serial como válido.

Mejoras:
-Reparado error con 2 opciones activadas al mismo tiempo (filtro bucle con  detenerse en address específico, generaban un error que ya está solucionado)
-Log tipo de salto(idea de tinkipinki)
-Anterior versión solo logeaba saltos SHORT, ahora logea JMP NEAR
-Optimizado el código: V1.0=367 lineas V1.2=309 lineas (incluyendo las opciones adicionales)
-Filtrar los saltos SHORT
EDIT:tenía un pequeño error el código cuando lo subí, ahora está editado y funciona correctamente.

Imágenes:










Código de la versión 1.2:
Código
  1. /*
  2.    -=================================================================-
  3.  
  4.        Script realizado por :UND3R                                      
  5.        Script para : Logear saltos condicionales                                              
  6.        Configuracion: Saltar todas las excepciones y no tener ningún BP                                              
  7.        Fecha : 12/10/2011                                          
  8.  
  9.                    -=[ Comentario del Script ]=-                    
  10.     Ideal para logear todo tipo de saltos condicionales para posteriormente                                                              
  11.     compararlo con otro log con el fin de localizar saltos mágicos                                                                
  12.  
  13.    -=================================================================-
  14. */
  15. VAR AUX_EXIT
  16. VAR T_F_N_LOG
  17. VAR CONT_LOG_N
  18. VAR FILTRO
  19. VAR VEIP
  20. VAR RESP
  21. VAR N_LOGTXT
  22. VAR LOG_SALTO
  23. VAR VMEMORY
  24. VAR VMEMORY2
  25. VAR VMEMORY3
  26. VAR AUX_TS
  27. VAR TIPO_SALTO
  28. VAR AUX_TS2
  29. VAR LOG_BUCLE1
  30. VAR LOG_BUCLE2
  31. VAR COMP
  32. VAR VEIP2
  33. VAR MAX
  34. VAR MIN
  35. VAR CONT_LOG_N2
  36. VAR CANTI_LOG_SAVE
  37. VAR COMPROBAR_SALTO
  38. VAR SI_NO
  39. VAR VAR_EIP
  40. VAR CONT_JUMP
  41. VAR LOG_TIPO_SALTO
  42. VAR ANTIBUCLE2
  43. VAR ANTIBUCLE1
  44. VAR N_BUCLE1
  45. VAR CONT
  46. VAR INF_BUCLE2
  47. VAR INF_BUCLE1
  48. VAR INF_BUCLE
  49. VAR VEIP_2
  50. VAR FILTRAR_JMP_SHORT
  51. ASK "Introduzca el nombre del archivo a crear EJ: LOG1.TXT"
  52. MOV N_LOGTXT,$RESULT
  53. EVAL "{N_LOGTXT}"
  54. WRT $RESULT, "|N:   |ADDRESS:|EIP:    |SALTA: |BUCLE: |TIPO SALTO:|"
  55. WRTA $RESULT, "|---------------------------------------------------|"  
  56. PREG_FILTRO:
  57. MSGYN "¿Opciones avanzadas?"
  58. CMP 1,$RESULT
  59. JE AVANZADO
  60. TRACE:
  61. TICND "byte [EIP] > 6F && byte [EIP] < 80 || byte [EIP+1] > 7F && byte [EIP+1] < 90 && byte [EIP]==0F"
  62. CMP RESP,eip
  63. JE EXIT1
  64. OPCODE eip
  65. MOV LOG_SALTO,$RESULT_1
  66. ALLOC 50
  67. MOV VMEMORY,$RESULT
  68. MOV [VMEMORY],LOG_SALTO
  69. MOV VMEMORY2,VMEMORY
  70. ADD VMEMORY2,2
  71. BUCLE_TS:
  72. CMP [VMEMORY2],20,1
  73. JNE INC_VMEMORY2
  74. MOV VMEMORY3,VMEMORY2
  75. COMP_SHORT:
  76. INC VMEMORY3
  77. MOV AUX_TS,[VMEMORY3],5
  78. CMP AUX_TS,"SHORT"
  79. JE SALTO_TIPO1
  80. SALTO_TIPO2:
  81. SUB VMEMORY2,VMEMORY
  82. MOV TIPO_SALTO,[VMEMORY],VMEMORY2
  83. STR TIPO_SALTO
  84. FREE VMEMORY
  85. JMP TRACE0
  86. SALTO_TIPO1:
  87. ADD VMEMORY3,5
  88. MOV AUX_TS2,[VMEMORY3],1
  89. CMP AUX_TS2,2E
  90. JE SALTO_TIPO2
  91. SUB VMEMORY3,VMEMORY
  92. MOV TIPO_SALTO,[VMEMORY],VMEMORY3
  93. LOG TIPO_SALTO
  94. FREE VMEMORY
  95. CMP FILTRAR_JMP_SHORT,1
  96. JE TRACE
  97. JMP TRACE0
  98. INC_VMEMORY2:
  99. INC VMEMORY2
  100. JMP BUCLE_TS
  101. TRACE0:
  102. CMP eip,VEIP
  103. JE CONT_BUCLE
  104. MOV LOG_BUCLE1,0
  105. MOV LOG_BUCLE2,0
  106. TRACE1:
  107. OPCODE eip
  108. MOV VEIP,eip
  109. MOV VEIP2,VEIP
  110. ADD VEIP2,$RESULT_2
  111. STI
  112. CMP FILTRO,1
  113. JNZ TRACE2
  114. CMP eip,MAX
  115. JA TRACE2
  116. CMP eip,MIN
  117. JAE TRACE
  118. TRACE2:
  119. CMP LOG_BUCLE1,1
  120. JNE TRACE3
  121. MOV LOG_BUCLE2,"!"
  122. TRACE3:
  123. INC CONT_LOG_N
  124. ITOA CONT_LOG_N, 10.
  125. MOV CONT_LOG_N2,$RESULT
  126. CMP T_F_N_LOG,1
  127. JNE TRACE4
  128. CMP CONT_LOG_N2,CANTI_LOG_SAVE
  129. JE EXIT2
  130. TRACE4:
  131. CMP VEIP2,eip
  132. JE NO
  133. SI:
  134. MOV COMPROBAR_SALTO,1
  135. MOV SI_NO,"SI"
  136. JMP LOG_COMPR_TXT
  137. NO:
  138. MOV COMPROBAR_SALTO,0
  139. MOV SI_NO,"NO"
  140. LOG_COMPR_TXT:
  141. EVAL "|{CONT_LOG_N2}"
  142. MOV CONT_LOG_N2,$RESULT
  143. LOG_COMPR_TXT_:
  144. LEN CONT_LOG_N2
  145. CMP $RESULT,6
  146. JNE INC_LOG_COMPR_TXT
  147. ADD CONT_LOG_N2,"|"
  148. EVAL "{N_LOGTXT}"
  149. WRTA $RESULT,CONT_LOG_N2
  150. LOG_CMPR_TXT2:
  151. EVAL "{VEIP}"
  152. MOV VEIP_2,$RESULT
  153. LOG_CMPR_TXT2_:
  154. LEN VEIP_2
  155. CMP $RESULT,8
  156. JNE INC_LOG_CMPR_TXT2
  157. ADD VEIP_2,"|"
  158. EVAL "{N_LOGTXT}"
  159. WRTA $RESULT,VEIP_2,""
  160. LOG_CMPR_TXT3:
  161. EVAL "{eip}"
  162. MOV VAR_EIP,$RESULT
  163. LOG_CMPR_TXT3_:
  164. LEN VAR_EIP
  165. CMP $RESULT,8
  166. JNE INC_LOG_CMPR_TXT3
  167. ADD VAR_EIP,"|"
  168. EVAL "{N_LOGTXT}"
  169. WRTA $RESULT,VAR_EIP,""
  170. LOG_CMPR_TXT4:
  171. EVAL "{SI_NO}     |{LOG_BUCLE2}      |"
  172. MOV CONT_JUMP,$RESULT
  173. EVAL "{N_LOGTXT}"
  174. WRTA $RESULT,CONT_JUMP,""
  175. CMPR_LEN_TS:
  176. LEN TIPO_SALTO
  177. CMP $RESULT,B
  178. JNE INC_LEN_TS
  179. EVAL "{TIPO_SALTO}|"
  180. MOV LOG_TIPO_SALTO,$RESULT
  181. EVAL "{N_LOGTXT}"
  182. WRTA $RESULT,LOG_TIPO_SALTO,""
  183. CMP AUX_EXIT,1
  184. JE LOG_COMPR_TXT2
  185. JMP TRACE
  186. LOG_COMPR_TXT2:
  187. JMP EXIT
  188. STOP:
  189. BPHWS RESP, "x"
  190. JMP FILTRO
  191. EXIT1:
  192. BPHWC RESP
  193. EXIT:
  194. EVAL "{N_LOGTXT}"
  195. WRTA $RESULT,"`---------------------------------------------------´"
  196. ret
  197. EXIT2:
  198. MOV AUX_EXIT,1
  199. JMP TRACE4
  200. AVANZADO:
  201. MSGYN "¿Detener en Nº cantidad de datos logeados?"
  202. CMP 0,$RESULT
  203. JE AVANZADO2
  204. N_LOG_SAVE:
  205. ASK "Introduzca número de datos a logear:"
  206. MOV CANTI_LOG_SAVE,$RESULT
  207. ITOA CANTI_LOG_SAVE
  208. MOV CANTI_LOG_SAVE,$RESULT
  209. MOV T_F_N_LOG,1
  210. JMP FILTRO
  211. AVANZADO2:
  212. MSGYN "¿Detener log en address determinado?"
  213. CMP 0,$RESULT
  214. JE FILTRO
  215. BP_ADDRESS:
  216. ASK "Introduzca la dirección en donde desea detener el log"
  217. MOV RESP,$RESULT
  218. CMP RESP,0
  219. JNE STOP
  220. FILTRO:
  221. MSGYN "¿Excluir en el log rango de address?"
  222. CMP 0,$RESULT
  223. JE FILTRO_JMP
  224. FILTRO2:
  225. MOV FILTRO,1
  226. ASK "Introduzca el rango a excluir,desde:"
  227. MOV MIN,$RESULT
  228. ASK "hasta:"
  229. MOV MAX,$RESULT
  230. FILTRO_JMP:
  231. MSGYN "¿Excluir saltos SHORT?"
  232. CMP 0,$RESULT
  233. JE ANTIBUCLE
  234. MOV FILTRAR_JMP_SHORT,1
  235. ANTIBUCLE:
  236. MSGYN "¿Log inteligente (evita bucle's)?"
  237. CMP 0,$RESULT
  238. JE OLLYH
  239. ANTIBUCLE2:
  240. MOV ANTIBUCLE1,1
  241. ASK "Nº de veces que debe repetirse un salto para ser considerado bucle"
  242. MOV N_BUCLE1,$RESULT
  243. OLLYH:
  244. MSGYN "¿Ocultar OllyDBG mientras se ejecuta el script?"
  245. CMP $RESULT,0
  246. JE GOTRACE
  247. DBH
  248. GOTRACE:
  249. JMP TRACE
  250. CONT_BUCLE:
  251. INC CONT
  252. MOV LOG_BUCLE1,1
  253. CMP CONT,N_BUCLE1
  254. JE SALTAR_BUCLE
  255. JMP TRACE1
  256. SALTAR_BUCLE:
  257. CMP COMPROBAR_SALTO,0
  258. JE NO_SALTA_BUCLE
  259. SI_SALTA_BUCLE:
  260. MOV INF_BUCLE2,VEIP2
  261. JMP BUCLE2
  262. NO_SALTA_BUCLE:
  263. MOV INF_BUCLE,VEIP
  264. ADD INF_BUCLE,1
  265. MOV INF_BUCLE,[INF_BUCLE],1
  266. MOV INF_BUCLE2,eip
  267. ADD INF_BUCLE2,INF_BUCLE
  268. ADD INF_BUCLE2,2
  269. CMP INF_BUCLE,7F
  270. JBE BUCLE2
  271. SUB INF_BUCLE2,100
  272. BUCLE2:
  273. EVAL "|----[{VEIP}]-¡BUCLE ENCONTRADO!------------------"
  274. MOV CONT_JUMP,$RESULT
  275. BUCLE2_:
  276. LEN CONT_JUMP
  277. CMP $RESULT,34
  278. JNE INC_BUCLE2
  279. ADD CONT_JUMP,"|"
  280. EVAL "{N_LOGTXT}"
  281. WRTA $RESULT,CONT_JUMP
  282. BUCLE_CONT_:
  283. BP INF_BUCLE2
  284. RUN
  285. CMP INF_BUCLE2,eip
  286. JNE ERROR1
  287. BC INF_BUCLE2
  288. MOV CONT,0
  289. MOV LOG_BUCLE1,0
  290. MOV LOG_BUCLE2,0
  291. JMP TRACE
  292. INC_LEN_TS:
  293. ADD TIPO_SALTO," "
  294. JMP CMPR_LEN_TS
  295. INC_BUCLE2:
  296. ADD CONT_JUMP,"-"
  297. JMP BUCLE2_
  298. INC_LOG_CMPR_TXT3:
  299. ADD VAR_EIP," "
  300. JMP LOG_CMPR_TXT3_
  301. INC_LOG_CMPR_TXT2:
  302. ADD VEIP_2," "
  303. JMP LOG_CMPR_TXT2_
  304. INC_LOG_COMPR_TXT:
  305. ADD CONT_LOG_N2," "
  306. JMP LOG_COMPR_TXT_
  307. ERROR1:
  308. MSG "Error inesperado #1"
  309. RET
  310.  



Versión V1.0
Este script como el título lo dice se encarga de logear todos los diferentes tipos de saltos condicionales hasta un cierto punto especificado por el usuario y los guarda en un documento de texto (archivo log) indicando el address en donde estaba el salto,si se realizó el salto o no y si se realizó indica hacia donde salto, esto puede ser útil para encontrar comprobaciones CRC, antidump de tamaño o detección de si el programa está siendo ejecutado bajo una máquina virtual, la idea es generar dos log
EJ: archivo desempaqueta=Log1 archivo empaquetado=Log2, ambos detenidos en el OEP, de esta forma con algún comparador de textos podremos ver que salto tienen de diferencia siendo este el posible causante de las detecciones mencionadas anteriormente.

Imágen de logs:



=el número de log, este es el que se debe especificar dentro de las opciones si se quiere detener en N cantidad de log especificado.

ADDRESS=Indica en donde está el salto encontrado

EIP=Indica la ubicación luego de que se ejecutó el salto

BUCLE=!: indica que se está repitiendo un salto
           0:Indica que NO se está repitiendo el salto

SALTA: SI/NO este es la acción más importante del script



*En esta imagen muestra la detección de un bucle, para evitar que se repita en el log, con la opción de log inteligente en vez de ver los address repetidos, veremos una alerta


-Nombre del .txt:
El script en primera instancia nos preguntará con que nombre queremos guardar el log

-Opciones avanzadas:
Si no optamos por esta opción el script comenzará a logear todos

-Detener en Nº cantidad de datos logeados:
Esta opción nos da la posibilidad de que el script se detenga en una cierta cantidad de números de registro.

-Detener en un determinado address:
Si queremos detener el script en un cierto address

-Excluir en el log rango de address:
Nos da la posibilidad de poder excluir un rango de address, estas no serán mostradas en el log, ideal para excluir los saltos de las API'S si elegimos esta opción nos preguntara desde donde queremos que excluya y hasta que address

-Log inteligente:
esta opción evita bucles ideal para evitar tener repetidos datos en el log que pueden estorbar la comparación, si elegimos esta opción nos preguntará cuantas veces debe pasar el programa por un mismo salto para que sea considerado bucle
*Recomendación:4
*Actualmente no considera como bucle en donde un salto salta a otro salto
-Ocultar OllyDBG mientras se ejecuta el script:
esta opción habilita el comando DBGH

SCRIPT:
Código
  1. /*
  2.    -=================================================================-
  3.  
  4.        Script realizado por :UND3R                                      
  5.        Script para : Logear saltos condicionales                                              
  6.        Configuracion: Saltar todas las excepciones y no tener ningún BP                                              
  7.        Fecha : 12/10/2011                                          
  8.  
  9.                    -=[ Comentario del Script ]=-                    
  10.     Ideal para logear todo tipo de saltos condicionales para posteriormente                                                              
  11.     compararlo con otro log con el fin de localizar saltos mágicos                                                                
  12.  
  13.    -=================================================================-
  14. */
  15. VAR INFO_N4
  16. VAR STR_4
  17. VAR STR_2
  18. VAR STR_1
  19. VAR INFO_N3
  20. VAR INFO_N2
  21. VAR INFO_N
  22. VAR CONT_LOG_N2
  23. VAR AUX_EXIT
  24. VAR T_F_N_LOG
  25. VAR CANTI_LOG_SAVE
  26. VAR CONT_LOG_N
  27. VAR SI_NO
  28. VAR CONT_JUMP
  29. VAR N_LOGTXT
  30. VAR LOG_BUCLE2
  31. VAR LOG_BUCLE1
  32. VAR COMPROBAR_SALTO
  33. VAR INF_BUCLE2
  34. VAR INF_BUCLE
  35. VAR N_BUCLE1
  36. VAR CONT
  37. VAR ANTIBUCLE1
  38. VAR FILTRO
  39. VAR MIN
  40. VAR MAX
  41. VAR COMP
  42. VAR RESP
  43. VAR VEIP2
  44. VAR VEIP
  45. ASK "Introduzca el nombre del archivo a crear EJ: LOG1.TXT"
  46. MOV N_LOGTXT,$RESULT
  47. EVAL "{N_LOGTXT}"
  48. WRT $RESULT, "|N:   |ADDRESS:|EIP:    |BUCLE: |SALTA: |"
  49. WRTA $RESULT, "|---------------------------------------|"  
  50. PREG_FILTRO:
  51. MSGYN "¿Opciones avanzadas?"
  52. CMP 1,$RESULT
  53. JE AVANZADO
  54. TRACE:
  55. TICND "byte [EIP] > 6F && byte [EIP] < 80"
  56. CMP RESP,eip
  57. JE EXIT1
  58. CMP eip,VEIP
  59. JE CONT_BUCLE
  60. MOV LOG_BUCLE1,0
  61. MOV LOG_BUCLE2,0
  62. TRACE1:
  63. MOV COMP,[eip],1
  64. CMP COMP,70
  65. JB TRACE
  66. CMP COMP,7F
  67. JA TRACE
  68. OPCODE eip
  69. MOV VEIP,eip
  70. MOV VEIP2,VEIP
  71. ADD VEIP2,$RESULT_2
  72. STI
  73. CMP FILTRO,1
  74. JNZ TRACE2
  75. CMP eip,MAX
  76. JA TRACE2
  77. CMP eip,MIN
  78. JAE TRACE
  79. TRACE2:
  80. CMP LOG_BUCLE1,1
  81. JNE TRACE3
  82. MOV LOG_BUCLE2,"!"
  83. TRACE3:
  84. INC CONT_LOG_N
  85. ITOA CONT_LOG_N, 10.
  86. MOV CONT_LOG_N2,$RESULT
  87. CMP T_F_N_LOG,1
  88. JNE TRACE4
  89. CMP CONT_LOG_N2,CANTI_LOG_SAVE
  90. JE EXIT2
  91. TRACE4:
  92. CMP VEIP2,eip
  93. JE NO
  94. SI:
  95. MOV COMPROBAR_SALTO,1
  96. MOV SI_NO,"SI"
  97. JMP LOG_COMPR_TXT
  98. NO:
  99. MOV COMPROBAR_SALTO,0
  100. MOV SI_NO,"NO"
  101. LOG_COMPR_TXT:
  102. LEN CONT_LOG_N2
  103. MOV INFO_N,$RESULT
  104. CMP INFO_N,1
  105. JE LOG_CMPR_TXT_1
  106. CMP INFO_N,2
  107. JE LOG_CMPR_TXT_2
  108. CMP INFO_N,3
  109. JE LOG_CMPR_TXT_3
  110. CMP INFO_N,4
  111. JE LOG_CMPR_TXT_4
  112. CMP INFO_N,5
  113. JE LOG_CMPR_TXT__5
  114. JMP ERROR2
  115. LOG_CMPR_TXT_1:
  116. EVAL "|{CONT_LOG_N2}    |"
  117. MOV CONT_JUMP,$RESULT
  118. EVAL "{N_LOGTXT}"
  119. WRTA $RESULT,CONT_JUMP
  120. JMP LOG_CMPR_TXT2
  121. LOG_CMPR_TXT_2:
  122. EVAL "|{CONT_LOG_N2}   |"
  123. MOV CONT_JUMP,$RESULT
  124. EVAL "{N_LOGTXT}"
  125. WRTA $RESULT,CONT_JUMP
  126. JMP LOG_CMPR_TXT2
  127. LOG_CMPR_TXT_3:
  128. EVAL "|{CONT_LOG_N2}  |"
  129. MOV CONT_JUMP,$RESULT
  130. EVAL "{N_LOGTXT}"
  131. WRTA $RESULT,CONT_JUMP
  132. JMP LOG_CMPR_TXT2
  133. LOG_CMPR_TXT_4:
  134. EVAL "|{CONT_LOG_N2} |"
  135. MOV CONT_JUMP,$RESULT
  136. EVAL "{N_LOGTXT}"
  137. WRTA $RESULT,CONT_JUMP
  138. JMP LOG_CMPR_TXT2
  139. LOG_CMPR_TXT__5:
  140. EVAL "|{CONT_LOG_N2}|"
  141. MOV CONT_JUMP,$RESULT
  142. EVAL "{N_LOGTXT}"
  143. WRTA $RESULT,CONT_JUMP
  144. LOG_CMPR_TXT2:
  145. ITOA VEIP
  146. MOV STR_1,$RESULT
  147. LEN STR_1
  148. MOV INFO_N2,$RESULT
  149. CMP INFO_N2,5
  150. JE LOG_CMPR_TXT_5
  151. CMP INFO_N2,6
  152. JE LOG_CMPR_TXT_6
  153. CMP INFO_N2,7
  154. JE LOG_CMPR_TXT_7
  155. CMP INFO_N2,8
  156. JE LOG_CMPR_TXT_8
  157. JMP ERROR3
  158. LOG_CMPR_TXT_5:
  159. EVAL "{VEIP}   |"
  160. MOV CONT_JUMP,$RESULT
  161. EVAL "{N_LOGTXT}"
  162. WRTA $RESULT,CONT_JUMP,""
  163. JMP LOG_CMPR_TXT3
  164. LOG_CMPR_TXT_6:
  165. EVAL "{VEIP}  |"
  166. MOV CONT_JUMP,$RESULT
  167. EVAL "{N_LOGTXT}"
  168. WRTA $RESULT,CONT_JUMP,""
  169. JMP LOG_CMPR_TXT3
  170. LOG_CMPR_TXT_7:
  171. EVAL "{VEIP} |"
  172. MOV CONT_JUMP,$RESULT
  173. EVAL "{N_LOGTXT}"
  174. WRTA $RESULT,CONT_JUMP,""
  175. JMP LOG_CMPR_TXT3
  176. LOG_CMPR_TXT_8:
  177. EVAL "{VEIP}|"
  178. MOV CONT_JUMP,$RESULT
  179. EVAL "{N_LOGTXT}"
  180. WRTA $RESULT,CONT_JUMP,""
  181. LOG_CMPR_TXT3:
  182. ITOA eip
  183. MOV STR_2,$RESULT
  184. LEN STR_2
  185. MOV INFO_N3,$RESULT
  186. CMP INFO_N3,5
  187. JE LOG_CMPR_TXT2_5
  188. CMP INFO_N3,6
  189. JE LOG_CMPR_TXT2_6
  190. CMP INFO_N3,7
  191. JE LOG_CMPR_TXT2_7
  192. CMP INFO_N3,8
  193. JE LOG_CMPR_TXT2_8
  194. JMP ERROR4
  195. LOG_CMPR_TXT2_5:
  196. EVAL "{eip}   |"
  197. MOV CONT_JUMP,$RESULT
  198. EVAL "{N_LOGTXT}"
  199. WRTA $RESULT,CONT_JUMP,""
  200. JMP LOG_CMPR_TXT4
  201. LOG_CMPR_TXT2_6:
  202. EVAL "{eip}  |"
  203. MOV CONT_JUMP,$RESULT
  204. EVAL "{N_LOGTXT}"
  205. WRTA $RESULT,CONT_JUMP,""
  206. JMP LOG_CMPR_TXT4
  207. LOG_CMPR_TXT2_7:
  208. EVAL "{eip} |"
  209. MOV CONT_JUMP,$RESULT
  210. EVAL "{N_LOGTXT}"
  211. WRTA $RESULT,CONT_JUMP,""
  212. JMP LOG_CMPR_TXT4
  213. LOG_CMPR_TXT2_8:
  214. EVAL "{eip}|"
  215. MOV CONT_JUMP,$RESULT
  216. EVAL "{N_LOGTXT}"
  217. WRTA $RESULT,CONT_JUMP,""
  218. LOG_CMPR_TXT4:
  219. EVAL "{LOG_BUCLE2}      |{SI_NO}     |"
  220. MOV CONT_JUMP,$RESULT
  221. EVAL "{N_LOGTXT}"
  222. WRTA $RESULT,CONT_JUMP,""
  223. CMP AUX_EXIT,1
  224. JE LOG_COMPR_TXT2
  225. JMP TRACE
  226. LOG_COMPR_TXT2:
  227. JMP EXIT
  228. STOP:
  229. BPHWS RESP, "x"
  230. JMP FILTRO
  231. EXIT1:
  232. BPHWC RESP
  233. EXIT:
  234. EVAL "{N_LOGTXT}"
  235. WRTA $RESULT,"`---------------------------------------´"
  236. ret
  237. EXIT2:
  238. MOV AUX_EXIT,1
  239. JMP TRACE4
  240. AVANZADO:
  241. MSGYN "¿Detener en Nº cantidad de datos logeados?"
  242. CMP 0,$RESULT
  243. JE AVANZADO2
  244. N_LOG_SAVE:
  245. ASK "Introduzca número de datos a logear:"
  246. MOV CANTI_LOG_SAVE,$RESULT
  247. ITOA CANTI_LOG_SAVE
  248. MOV CANTI_LOG_SAVE,$RESULT
  249. MOV T_F_N_LOG,1
  250. JMP FILTRO
  251. AVANZADO2:
  252. MSGYN "¿Detener log en address determinado?"
  253. CMP 0,$RESULT
  254. JE FILTRO
  255. BP_ADDRESS:
  256. ASK "Introduzca la dirección en donde desea detener el log"
  257. MOV RESP,$RESULT
  258. CMP RESP,0
  259. JNE STOP
  260. FILTRO:
  261. MSGYN "¿Excluir en el log rango de address?"
  262. CMP 0,$RESULT
  263. JE ANTIBUCLE
  264. FILTRO2:
  265. MOV FILTRO,1
  266. ASK "Introduzca el rango a excluir,desde:"
  267. MOV MIN,$RESULT
  268. ASK "hasta:"
  269. MOV MAX,$RESULT
  270. ANTIBUCLE:
  271. MSGYN "¿Log inteligente (evita bucle's)?"
  272. CMP 0,$RESULT
  273. JE OLLYH
  274. ANTIBUCLE2:
  275. MOV ANTIBUCLE1,1
  276. ASK "Nº de veces que debe repetirse un salto para ser considerado bucle"
  277. MOV N_BUCLE1,$RESULT
  278. OLLYH:
  279. MSGYN "¿Ocultar OllyDBG mientras se ejecuta el script?"
  280. CMP $RESULT,0
  281. JE GOTRACE
  282. DBH
  283. GOTRACE:
  284. JMP TRACE
  285. CONT_BUCLE:
  286. INC CONT
  287. MOV LOG_BUCLE1,1
  288. CMP CONT,N_BUCLE1
  289. JE SALTAR_BUCLE
  290. JMP TRACE1
  291. SALTAR_BUCLE:
  292. CMP COMPROBAR_SALTO,0
  293. JE NO_SALTA_BUCLE
  294. SI_SALTA_BUCLE:
  295. MOV INF_BUCLE2,VEIP2
  296. JMP BUCLE2
  297. NO_SALTA_BUCLE:
  298. MOV INF_BUCLE,VEIP
  299. ADD INF_BUCLE,1
  300. MOV INF_BUCLE,[INF_BUCLE],1
  301. MOV INF_BUCLE2,eip
  302. ADD INF_BUCLE2,INF_BUCLE
  303. ADD INF_BUCLE2,2
  304. CMP INF_BUCLE,7F
  305. JBE BUCLE2
  306. SUB INF_BUCLE2,100
  307. BUCLE2:
  308. ITOA VEIP
  309. MOV STR_4,$RESULT
  310. LEN STR_4
  311. MOV INFO_N4,$RESULT
  312. CMP INFO_N4,5
  313. JE BUCLE_5
  314. CMP INFO_N4,6
  315. JE BUCLE_6
  316. CMP INFO_N4,7
  317. JE BUCLE_7
  318. CMP INFO_N4,8
  319. JE BUCLE_8
  320. BUCLE_5:
  321. EVAL "|----[{VEIP}]-¡BUCLE ENCONTRADO!---------|"
  322. MOV CONT_JUMP,$RESULT
  323. EVAL "{N_LOGTXT}"
  324. WRTA $RESULT,CONT_JUMP
  325. JMP BUCLE_CONT_
  326. BUCLE_6:
  327. EVAL "|----[{VEIP}]-¡BUCLE ENCONTRADO!--------|"
  328. MOV CONT_JUMP,$RESULT
  329. EVAL "{N_LOGTXT}"
  330. WRTA $RESULT,CONT_JUMP
  331. BP INF_BUCLE2
  332. JMP BUCLE_CONT_
  333. BUCLE_7:
  334. EVAL "|----[{VEIP}]-¡BUCLE ENCONTRADO!-------|"
  335. MOV CONT_JUMP,$RESULT
  336. EVAL "{N_LOGTXT}"
  337. WRTA $RESULT,CONT_JUMP
  338. JMP BUCLE_CONT_
  339. BUCLE_8:
  340. EVAL "|----[{VEIP}]-¡BUCLE ENCONTRADO!------|"
  341. MOV CONT_JUMP,$RESULT
  342. EVAL "{N_LOGTXT}"
  343. WRTA $RESULT,CONT_JUMP
  344. BUCLE_CONT_:
  345. BP INF_BUCLE2
  346. EOB COMPROBAR
  347. RUN
  348. COMPROBAR:
  349. CMP INF_BUCLE2,eip
  350. JNE ERROR1
  351. BC INF_BUCLE2
  352. MOV CONT,0
  353. MOV LOG_BUCLE1,0
  354. MOV LOG_BUCLE2,0
  355. JMP TRACE
  356. ERROR1:
  357. MSG "Error inesperado #1"
  358. RET
  359. ERROR2:
  360. MSG "Los datos registrados exceden la cantidad máxima permitida"
  361. RET
  362. ERROR3:
  363. MSG "Error inesperado #2"
  364. RET
  365. ERROR4:
  366. MSG "Error inesperado #3"
  367. RET

Si no lo entendieron bien, les pido que lo utilicen y notarán que no es nada complicado de entender.

Saludos UND3R

PD: otra funcionalidad puede ser encontrar el salto decisivo de un programa teniendo un serial correcto.
213  Programación / Ingeniería Inversa / Alguna lista con los jump's condicionales junto con su valor hexadecimal? en: 10 Octubre 2011, 18:46 pm
Eso, he encontrado listas de los tipos de saltos, pero sin su valor hexadecimal, si alguien me ayudará estaría muy agradecido, saludos :D
214  Programación / Ingeniería Inversa / [Tutorial]Introducción al cracking en P-Code parte 2 en: 8 Octubre 2011, 16:03 pm
Introducción al cracking en P-Code parte 2

En esta segunda parte le daremos énfasis al programa WKTVBDE, realizaremos una serie de crackmes de manera sencilla y aprenderemos a nopear en P-Code

I-Clave2.exe

Abrimos WKTVBDE y vemos lo siguiente:


Seleccionamos File->Open y elegimos clave2.exe si cargó sin ningún problema nos debería aparecer lo siguiente:


Seleccionamos Action->Run y Nos aparecerán dos alertas, estas deben ser aceptadas rapidamente ya que el debugger crashea:




Si todo ha salido bien, Nos aparecerá clave2 y debajo de el podremos ver el debugger sin ningún P-Code:


Intentemos colocar un nombre y un serial:


Ahora presionemos registrar y veremos a WKTVBDE cargado con los P-Code:


En la parte superior a la derecha, contamos con el stack:


Debajo del stack contamos con un menú muy util:


Memory dump->ALT+M


En esta parte del programa podremos localizar P-codes y modificarlos de manera muy cómoda,Por ejemplo veamos en el dessembler algunos P-codes:


Si nos fijamos en el address 00401CE0 encontraremos un BranchF que es equivalente a 1C
si nos dirigimos a Memory dump y buscamos 00401CE0:


En el costado izquierdo podemos ver los valores hexadecimales que se encuentran a partir de 00401CE0, si hacemos doble click en 1C podremos modificarlo en tiempo de ejecución presionando Patch Now!:


Otra forma un poco más rápida es hacer click derecho en un P-Code ubicado en el dessembler y seleccionar "Modify current opcode". esto nos llevará a Memory dump pero ya apuntando al address del P-Code.

String Refs: Nos muestras las referencias de textos que hay en el programa debuggeado:


API->Ctrl+B:Nos muestra una lista de API'S de Visual Basic, dándonos la posibilidad de colocar BP haciendo doble click:


*Para quitarlo debemos hacer 4 click's

Opcodes->Ctrl+O:Nos muestra una lista de P-Codes al igual que API

OnExecution->Ctrl+E:Nos muestra la lista de BP que ya están puestos y nos dá la posibilidad de Colocarlos también:


Para agregar algún BP se debe insertar el address en la parte inferior y luego presionar ADD

Trace Commands:


Como su nombre lo dice nos muestra los comandos que tenemos para tracear
Step Trace cumple el rol de F7 en OllyDBG
Trace Ret cumple el rol de Execute till return
Trace Over cumple el rol de F8 en OllyDBG
Go! cumple el rol de F9 en OllyDBG
Trace X nos da la posibilidad de tracear un número de P-Codes determinados

en la parte inferior podemos encontrar "Analize BranchX" este nos mostrará la lista de BranchT y BranchF que posee el programa a debuggear:


Ya familiarizados con WKTVBDE continuamos reverseando, vamos avanzando con F8 hasta encontrarnos en el siguiente P-Code:


Este Opcode se encarga obtener el serial introducido, a continuación encontramos 6C:
6C    5620 0B33 2          Push#4 [arg]

Encargado de pushear el serial, podemos corroborarlo si nos dirijimos en el dump al address a pushar:


Si continuamos traceando hasta 401D01:

Notaremos una comprobación entre 5 y 6, si miramos en el stack veremos de donde provienen:


Si continuamos traceando hasta 401D08 nos encontraremos con un BranchF=1C, WKTVBDE nos muestra al lado de él si saltará o no, en este caso NO:


Si nos fijamos al no saltar nos mostrará un mensaje que podemos ver en el address 00401D21

Por lo que deducimos que la anterior comparación fue el número de caracteres del nombre introducido con el mínimo permitido UND3R=5 con 6

Por lo que intentaremos modificar el salto para evitar la alerta, hacemos click derecho->Modify current opcode y cambiamos 1C por 1D que es el salto opuesto:


Presionamos F8 y veremos que saltará 00401D3F


*Si quisieramos saltar a otro lugar, podemos utilizar una excelente herramienta que trae P32Dasm llamada Jump calculator


Desgraciadamente P32Dasm trabaja con Offset Raw por lo que podría confundir de alguna forma. Para utilizarla debemos escribir el address en donde se encuentra el salto (Raw) y a continuación hacia que address saltará, en el costado izquierdo podremos seleccionar el tipo de salto.

Seguimos traceando, aquí toma nuestro nombre y lo pone en minúsculas:


Si seguimos traceando una gran serie de P-Code's nos detendremos en el siguiente salto:


Notaremos que si no salta nos llevará a un mensaje de que el serial es incorrecto, intentemos modificar el salto:


Ahora presionemos Go!->F5


II-CrackMe Chronos

Cargamos el crackme desde WKTVBDE


También lo cargamos desde exdec y buscamos referencias, una vez encontrada buscamos el primer Branch desde abajo hacia arriba:


Ahora introducimos un serial cualquiera y traceamos hasta llegar a 402B08, luego lo cambiamos por 1D y presionamos F5 o Go!:



III-nags1

Para eliminar una nag en algunos casos al igual que los serial debemos modificar los Branch, o en otros casos se debemos Nopear un P-Code, en el segundo caso no se pueden eliminar dejando un vacio por lo que siempre se debe reemplazar por otro P-Code, siempre y cuando, el otro ocupe el mismo espacio (número de parámetros)

Veamos un ejemplo a continuación:

Iniciamos nags1 para visualizar el nag a eliminar:



Cargamos nags1 con exedec:


Notaremos que es un rtcMsgBox ubicado en 401A2D. Vamos desde OllyDBG al address:
Veremos un P-Code con 4 bytes de parámetro, cambiemoslo por un push 0=05 00 00 00 00




Si damos RUN F9, notaremos que la nags ha desaparecido










UND3R
215  Programación / Ingeniería Inversa / [Tutorial]Introducción al cracking en P-Code en: 7 Octubre 2011, 19:39 pm
Introducción al cracking de P-Code

Referencia:Capitulo 29 "Introducción al cracking desde 0" por Ricardo Narvaja

Siempre cuando realizamos un previo análisis del ejecutable que nos vamos a enfrentar, cuando sabemos que es un Visual Basic compilado en P-Code intentamos aludirlo
ya que toman su tiempo crackearlo, por eso el motivo de esta introducción, en esta primera parte nos enfocaremos en el capítulo 29 de Ricardo Narvaja, en la segunda entrega nos enfocaremos con más crackmes y empezaremos a utilizar el fomoso WKTVBDE.

Herramientas:
-WKTVBDE
-OllyDbg
-P32Dasm
-exdec

I-¿Qué es P-Code?
Cuando compilados un programa con VB, este nos da la posibilidad de elegir el tipo de compilado diferenciando entre código NATIVO y P-CODE:
el código nativo tiene la gran ventaja que ejecutan el código en la sección code del programa permitiendo esto que sea más "fácil" lograr saltar la seguridad, por otro lado el
P-CODE no posee código de ejecución dentro de la sección code. solo posee una serie de códigos llamados P-Code que son interpretados y ejecutados por la dll de Visual Basic, haciéndonos una tarea más difícil.

II-¿Como saber si es un P-Code?
Los P-Code tienen una grán característica y es el uso de la API: MethCallEngine

Cargamos Clave1 con OllyDBG:


Si subimos un poco veremos que se utiliza la API:


Otra forma de saber que es un P-Code, es el mal análisis de código que realiza OllyDBG a diferencia de un native, si bajamos un poco lo podremos notar:


III-Analizando P-Code con OllyDBG
Para analizar un P-Code bajo OllyDBG debemos usar paralelamente exdec o P32Dasm, estos programas se encargan de encontrar la lista de P-Codes de forma automática. La idea es entender como trabajan estos tipos de programas:

Como sabemos los programas compilados en P-Code no ejecutan su código en la sección code solo executan comandos P-Code's que son interpretados por la dll de Visual Basic por lo que nosotros nos basaremos de eso,encontrar los P-Code de manera manual.

Cargamos clave1.exe en OllyDBG y colocamos un BP en la API MethCallEngine:


Iniciamos el programa con F9 y veremos lo siguiente:


Introducimos un serial cualquiera:


Vemos que se detiene en el BP:


Presionamos Alt+M y colocamos un Memory breakpoint on access en la sección code


Presionamos F9 hasta que se detenga en la siguiente instrucción:

MOV AL,BYTE PTR DS:[ESI]


En este lugar es donde la dll lee el primer P-Code, si miramos arriba del dump veremos de donde proviene:



Comienzan en: 00401BD0, si nos dirigimos ahí desde el dump veremos los P-Code's y sus parámetros:



Presionemos F7,y EAX tomará el valor del primer P-Code:



luego si presionamos F7 nuevamente aumenta ESI, esto lo hace para que ESI apunte a los parámetros del P-Code 04:


Desgraciadamente no existe una lista de P-Code's oficiales pero de todas formas adjunto una.

Para hacernos una idea de que va hacer el programa buscamos el P-Code 04 en la lista:

04    567B 0B8E 2 1 2      Push arg

Osea lo que hará será pushear su argumento,veamos si esto es correcto, luego de INC ESI realiza un JMP:


Presionamos F7 y llegamos aca:


veremos el siguiente comando:MOVSX EAX,WORD PTR DS:[ESI]

"Copies the value of the source operand to the destination register
with the sign extended."

lo que hará será colocar el parámetro de ESI en EAX considerando el signo negativo:



Luego suma EAX con EBP pero EAX por causa del MOVSX quedó en negativo será una resta: FFFFFF74h equivale a -140 decimal(para corroborar se debe hacer doble click en EAX), si 140 lo pasamos a hexadecimal,nos da: 8C por lo que en resumen realizará lo siguiente -8C+0012F4E0:



luego de eso realiza un PUSH EAX:



con eso concluye el P-Code 04 luego de eso realiza un XOR EAX,EAX para limpiar EAX y vuelve a mover el siguiente P-Code a EAX que en este caso es 21:



Luego suma 3 a ESI para apuntar al parámetro del segundo P-Code:



Aquí mueve a EAX el contenido de 0012F4E8 y lo mueve a EAX, luego el contenido de 0012F4E8 que ahora se encuentra en EAX es movido a [EBP-4C] luego de esto realiza un XOR EAX,EAX nuevamente para limpiar EAX y tomar nuevamente el siguiente P-CODE

En resumen la dll realiza lo siguiente:
-Toma el valor de P-Code y lo mueve a EAX: MOV AL,BYTE PTR DS:[ESI]
-Incrementa ESI para apuntar al parámetro del P-Code
-Se dirige al parámetro y ejecuta la operación correspondiente
-Terminada la operación realiza un XOR EAX,EAX para limpiar el registro
-Vuelve nuevamente al primer paso

Todo este análisis manual se puede evitar como comenté anteriormente con programas como exdec o P32Dasm, abrimos exdec y nos aparecerá lo siguiente:



Nos vamos a File->disassemble Prog y elegimos clave1.exe y nos mostrará lo siguiente:



en donde el primer valor es el address(VA) del P-code,el segundo valor es el P-Code mismo, el tercer valor es el nombre del P-Code y el cuarto el parámetro.

Si recordamos el primer P-Code fue 4 y estaba ubicado en el address 401BD0 y lo que realizo fue pushear el valor de EBP-8C, por lo que el programa nos facilita considerablemente la localización de los P-Code junto con sus parámetros

*exdec solo está disponible en fase beta, imposibilitando guardar la lista de P-Code pero de todas formas sigue siendo una herramienta fundamental.

Si abrimos P32Dasm veremos lo parecido que son:


este programa está más avanzado y nos muestra los P-Code de una manera más visible ideal cuando son muchos, También nos facilita la búsqueda de referencias de strings o números:



IV-Crackeando con OllyDBG y exdec

Para crackear de manera básica debemos tener conocimientos de dos P-Codes

1)BranchF=1C
este P-Code es similar a un salto condicional, este salto se realiza si la comprobación anterior es falsa.

2)BranchT=1D
este P-Code es el opuesto a BranchF es decir, este salta cuando la comprobación es verdadera T=True F=false


Una vez entendido como trabajan los programas compilados en P-Code podemos empezar a trabajar, lo primero que haremos será cargar clave1.exe con exdec, bajamos hasta encontrar alguna referencia de texto que sea llamativa:



una vez encontrada la referencia, en este caso:
"Número incorrecto"

debemos subir hasta encontrar algún BranchT o un BranchF. los Branch=1E no los debemos considerar ya que son equivalentes a JMP, es decir saltos incondicionales:



Encontramos un BranchF en 401C2C que si no se cumple la comprobación anterior este saltará a 401C63 vayamos a esa address para ver hacia donde se ubiese dirigido:



Vemos que se dirige a "Número Correcto"

Cargamos clave1.exe desde OllyDBG y nos dirijimos desde el dump a 401C2C (Address del BranchF)



Notaremos que hay un 1C que es equivalente a BranchF, intentemos cambiarlo por BranchT que es 1D y guardamos los cambios:



Iniciamos clave1 modificado, introduzcamos un serial cualquiera y presionamos Registrar:



Nuestro serial es tomado como válido

En esta ocación trabajamos enfocados en OllyDBG, luego trataremos teorias con WKTVBDE,Hasta la Parte II




UND3R
216  Programación / Ingeniería Inversa / hacer que p32dasm muestre los p-codes en VA y no en raw offset en: 7 Octubre 2011, 17:26 pm
eso :B

Saludos
217  Informática / Software / [Descarga]VB Watch v2 en: 7 Octubre 2011, 15:04 pm




Citar
Profile, test, debug and add error handlers to Visual Basic 6.0.
Profiler: ensure test coverage and measure performance.
Protector: handle run-time errors.
Debugger: monitor running programs.

Descarga:http://download.aivosto.net/vbw2.zip

Raul100 me pidió que "crackeara"(reverseara) este programa, hace tiempo le hice un crack y hoy lo vengo a compartir con ustedes

http://www.mediafire.com/?f83x3e2cpmb3kf8


Saludos
218  Foros Generales / Sugerencias y dudas sobre el Foro / sugerencia:Que xxxxxxx no me borre los post que no son spam en: 6 Octubre 2011, 19:58 pm
esa es mi sugerencia
219  Programación / Ingeniería Inversa / duda con mov en: 6 Octubre 2011, 17:17 pm
hola tengo una duda, como puedo mover 66 C7 05 5B F0 45 00 EB 12  (9bytes con mov), solo conozco word y dword


Saludos
220  Programación / Ingeniería Inversa / problemas con parámetros realloc en: 6 Octubre 2011, 05:37 am
Hola tengo la siguiente duda

si en memoria virtual tengo 150000 con size 3000 si quisiera dejarlo el address 150000 con size 4000 que parámetros debería pushear para llamar a realloc?

Gracias
Páginas: 1 ... 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [22] 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 ... 39
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines