//copyright by Pnluck 20005 pnluck@virgilio.it //if u use this script for write a tutorial, u can put me in thankses :D //i must to thanks MaRKuS-DJM and KaGra for their info at http://forum.exetools.com/showthread.php?t=7545 //modified by D3XT3R for the recursive capabilities var x_addr //addr originale var x_LoadLib //addr LoadLibraryA var x_AddrApi var data_sect var end_data var x_eax var go var xvar var str var x var str_eax var str_edi var sav_eax var sav_ecx var sav_edx var sav_ebx var sav_esp var sav_ebp var sav_esi var sav_edi var save_data var confronta var iat_section var save_dll var OEP var save_iats var save_iate var prevcall var calldest var checkadd var endadd var firstchecks //chiedo l'addr della .data section mov firstchecks,0 mov OEP,eip msgyn "Is the IAT of this PE corrupt?" cmp $RESULT,0 je start_std ask "Enter the address of code section:" cmp $RESULT,0 je exit mov prevcall, $RESULT ask "Enter the address of section where is the IAT:" cmp $RESULT,0 je exit mov iat_section,$RESULT mov xvar,$RESULT ask "Enter the size of same section: " cmp $RESULT,0 je exit mov str,$RESULT //find the start of iat inizio: mov x,[iat_section] cmp x,0 je do_jmp gn x cmp $RESULT_1,0 jne trovato1 mov [iat_section],0 do_jmp: add iat_section,4 jmp inizio trovato1: mov save_iats,iat_section eval "The iat start at {iat_section}" MSG $RESULT //find the end of iat mov iat_section,str add iat_section,xvar inizio1: mov x,[iat_section] cmp x,0 je do_jmp1 gn x cmp $RESULT_1,0 jne pre_start mov [iat_section],0 do_jmp1: sub iat_section,4 jmp inizio1 pre_start: mov save_iate,iat_section add iat_section,4 mov data_sect,iat_section //ora cancello dall'iat gli addr errati erase_garbage: mov x,[save_iats] gn x cmp $RESULT_1,0 jne add_addr mov [save_iats],0 add_addr: cmp save_iats,save_iate je getcall add save_iats,4 jmp erase_garbage getcall: ask "Enter the AIP Call destination address:" cmp $RESULT,0 je exit mov endadd,$RESULT jmp start_proc start_proc: //domando che call devo analizzare cmp firstchecks,1 je seccheck add prevcall,1 find prevcall, #e8????????# cmp $RESULT,0 je fine1 mov prevcall,$RESULT mov x_addr,$RESULT mov eip,$RESULT jmp cont seccheck: add prevcall,1 find prevcall, #e8????????# cmp $RESULT,0 je fine mov prevcall,$RESULT mov x_addr,$RESULT mov eip,$RESULT cont: mov checkadd,eip add checkadd,1 mov calldest, [checkadd] add calldest, eip add calldest,5 cmp calldest,endadd jne start_proc GPA "LoadLibraryA","kernel32.dll" cmp $RESULT,0 je exit mov x_LoadLib,$RESULT add x_LoadLib,b bp x_LoadLib //setto bp al je di LoadLibraryA run bc x_LoadLib //al bp //verifico secon i egistri è tutto a posto cmp eax,0 je vuoi_usci cmp edi,0 je vuoi_usci mov x_eax,eax mov str,"" mov go,1 //inizio della proc hex->ascii analize: mov xvar,[x_eax] shl xvar,8 shl xvar,8 shl xvar,8 shr xvar,8 shr xvar,8 shr xvar,8//prelevo il primo byte cmp xvar,0 je fin_an cmp xvar,2e jne prox_0 mov x,"." jmp add prox_0: cmp xvar,30 jne prox_1 mov x,"0" jmp add prox_1: cmp xvar,31 jne prox_2 mov x,"1" jmp add prox_2: cmp xvar,32 jne prox_3 mov x,"2" jmp add prox_3: cmp xvar,33 jne prox_4 mov x,"3" jmp add prox_4: cmp xvar,34 jne prox_5 mov x,"4" jmp add prox_5: cmp xvar,35 jne prox_6 mov x,"5" jmp add prox_6: cmp xvar,36 jne prox_7 mov x,"6" jmp add prox_7: cmp xvar,37 jne prox_8 mov x,"7" jmp add prox_8: cmp xvar,38 jne prox_9 mov x,"8" jmp add prox_9: cmp xvar,39 jne prox_A mov x,"9" jmp add prox_A: cmp xvar,41 jne prox_B mov x,"A" jmp add prox_B: cmp xvar,42 jne prox_C mov x,"B" jmp add prox_C: cmp xvar,43 jne prox_D mov x,"C" jmp add prox_D: cmp xvar,44 jne prox_E mov x,"D" jmp add prox_E: cmp xvar,45 jne prox_F mov x,"E" jmp add prox_F: cmp xvar,46 jne prox_G mov x,"F" jmp add prox_G: cmp xvar,47 jne prox_H mov x,"G" jmp add prox_H: cmp xvar,48 jne prox_I mov x,"H" jmp add prox_I: cmp xvar,49 jne prox_J mov x,"I" jmp add prox_J: cmp xvar,4A jne prox_K mov x,"J" jmp add prox_K: cmp xvar,4B jne prox_L mov x,"K" jmp add prox_L: cmp xvar,4C jne prox_M mov x,"L" jmp add prox_M: cmp xvar,4D jne prox_N mov x,"M" jmp add prox_N: cmp xvar,4E jne prox_O mov x,"N" jmp add prox_O: cmp xvar,4F jne prox_P mov x,"O" jmp add prox_P: cmp xvar,50 jne prox_Q mov x,"P" jmp add prox_Q: cmp xvar,51 jne prox_R mov x,"Q" jmp add prox_R: cmp xvar,52 jne prox_S mov x,"R" jmp add prox_S: cmp xvar,53 jne prox_T mov x,"S" jmp add prox_T: cmp xvar,54 jne prox_U mov x,"T" jmp add prox_U: cmp xvar,55 jne prox_V mov x,"U" jmp add prox_V: cmp xvar,56 jne prox_W mov x,"V" jmp add prox_W: cmp xvar,57 jne prox_X mov x,"W" jmp add prox_X: cmp xvar,58 jne prox_Y mov x,"X" jmp add prox_Y: cmp xvar,59 jne prox_Z mov x,"Y" jmp add prox_Z: cmp xvar,5A jne prox_a mov x,"Z" jmp add prox_a: cmp xvar,61 jne prox_b mov x,"a" jmp add prox_b: cmp xvar,62 jne prox_c mov x,"b" jmp add prox_c: cmp xvar,63 jne prox_d mov x,"c" jmp add prox_d: cmp xvar,64 jne prox_e mov x,"d" jmp add prox_e: cmp xvar,65 jne prox_f mov x,"e" jmp add prox_f: cmp xvar,66 jne prox_g mov x,"f" jmp add prox_g: cmp xvar,67 jne prox_h mov x,"g" jmp add prox_h: cmp xvar,68 jne prox_i mov x,"h" jmp add prox_i: cmp xvar,69 jne prox_j mov x,"i" jmp add prox_j: cmp xvar,6A jne prox_k mov x,"j" jmp add prox_k: cmp xvar,6B jne prox_l mov x,"k" jmp add prox_l: cmp xvar,6C jne prox_m mov x,"l" jmp add prox_m: cmp xvar,6D jne prox_n mov x,"m" jmp add prox_n: cmp xvar,6E jne prox_o mov x,"n" jmp add prox_o: cmp xvar,6F jne prox_p mov x,"o" jmp add prox_p: cmp xvar,70 jne prox_q mov x,"p" jmp add prox_q: cmp xvar,71 jne prox_r mov x,"q" jmp add prox_r: cmp xvar,72 jne prox_s mov x,"r" jmp add prox_s: cmp xvar,73 jne prox_t mov x,"s" jmp add prox_t: cmp xvar,74 jne prox_u mov x,"t" jmp add prox_u: cmp xvar,75 jne prox_v mov x,"u" jmp add prox_v: cmp xvar,76 jne prox_w mov x,"v" jmp add prox_w: cmp xvar,77 jne prox_x mov x,"w" jmp add prox_x: cmp xvar,78 jne prox_y mov x,"x" jmp add prox_y: cmp xvar,79 jne prox_z mov x,"y" jmp add prox_z: cmp xvar,7A jne exit mov x,"z" jmp add add: eval "{str}{x}" mov str,$RESULT inc x_eax jmp analize fin_an: cmp go,1 je ana_edi jne fin_str_cov ana_edi: mov str_eax,str mov str,"" mov x_eax,edi inc go jmp analize //fine proc hex->ascii fin_str_cov: //trovo l'addr mov str_edi,str GPA str_edi,str_eax cmp $RESULT,0 je exit mov x,$RESULT //inizio la ricerca di un dword usabile start_trovo: cmp save_dll,str_eax je trovato add data_sect,4 mov save_dll,str_eax trovato: mov [data_sect],x trov: eval "jmp dword ptr [{data_sect}]" asm x_addr,$RESULT mov eip,x_addr add data_sect,4 jmp start_proc fine: mov eip,OEP ret fine1: //mov firstchecks,1 mov eip,OEP //jmp start_proc ret exit: MSG "Error" ret vuoi_usci: MSGYN "Error: eax or edi value is 0, do you want continue with analising?" cmp $RESULT,1 jne fine mov eip,x_addr jmp start_proc start_std: mov firstchecks,0 mov OEP,eip mov sav_eax,eax mov sav_ecx,ecx mov sav_edx,edx mov sav_ebx,ebx mov sav_esp,esp mov sav_ebp,ebp mov sav_esi,esi mov sav_edi,edi ask "Enter the address of the data section:" cmp $RESULT,0 je exit_std mov data_sect,$RESULT mov save_data,$RESULT mov end_data,$RESULT ask "Enter the size of the data section:" cmp $RESULT,0 je exit_std add end_data,$RESULT ask "Enter the address of the code section (or the section after the header):" cmp $RESULT,0 je exit_std mov x_addr,$RESULT ask "Enter the AIP Call destination address:" cmp $RESULT,0 je exit_std mov endadd,$RESULT jmp start_proc_std start_proc_std: cmp firstchecks,1 je seccheck_std add x_addr,1 find x_addr, #e8????????# cmp $RESULT,0 je fine1_std mov x_addr,$RESULT mov eip,$RESULT jmp cont_std seccheck_std: add x_addr,1 find x_addr, #e8????????# cmp $RESULT,0 je fine_std mov x_addr,$RESULT mov eip,$RESULT cont_std: mov checkadd,eip add checkadd,1 mov calldest, [checkadd] add calldest, eip add calldest,5 cmp calldest,endadd jne start_proc_std mov eip,x_addr GPA "LoadLibraryA","kernel32.dll" cmp $RESULT,0 je exit_std mov x_LoadLib,$RESULT add x_LoadLib,b bp x_LoadLib run bc x_LoadLib mov x_eax,eax mov str,"" mov go,1 analyze: mov xvar,[x_eax] shl xvar,8 shl xvar,8 shl xvar,8 shr xvar,8 shr xvar,8 shr xvar,8 cmp xvar,0 je fin_an_std cmp xvar,2E jne prox_0_std mov x,"." jmp add_std prox_0_std: cmp xvar,30 jne prox_1_std mov x,"0" jmp add_std prox_1_std: cmp xvar,31 jne prox_2_std mov x,"1" jmp add_std prox_2_std: cmp xvar,32 jne prox_3_std mov x,"2" jmp add_std prox_3_std: cmp xvar,33 jne prox_4_std mov x,"3" jmp add_std prox_4_std: cmp xvar,34 jne prox_5_std mov x,"4" jmp add_std prox_5_std: cmp xvar,35 jne prox_6_std mov x,"5" jmp add_std prox_6_std: cmp xvar,36 jne prox_7_std mov x,"6" jmp add_std prox_7_std: cmp xvar,37 jne prox_8_std mov x,"7" jmp add_std prox_8_std: cmp xvar,38 jne prox_9_std mov x,"8" jmp add_std prox_9_std: cmp xvar,39 jne prox_A_std mov x,"9" jmp add_std prox_A_std: cmp xvar,41 jne prox_B_std mov x,"A" jmp add_std prox_B_std: cmp xvar,42 jne prox_C_std mov x,"B" jmp add_std prox_C_std: cmp xvar,43 jne prox_D_std mov x,"C" jmp add_std prox_D_std: cmp xvar,44 jne prox_E_std mov x,"D" jmp add_std prox_E_std: cmp xvar,45 jne prox_F_std mov x,"E" jmp add_std prox_F_std: cmp xvar,46 jne prox_G_std mov x,"F" jmp add_std prox_G_std: cmp xvar,47 jne prox_H_std mov x,"G" jmp add_std prox_H_std: cmp xvar,48 jne prox_I_std mov x,"H" jmp add_std prox_I_std: cmp xvar,49 jne prox_J_std mov x,"I" jmp add_std prox_J_std: cmp xvar,4A jne prox_K_std mov x,"J" jmp add_std prox_K_std: cmp xvar,4B jne prox_L_std mov x,"K" jmp add_std prox_L_std: cmp xvar,4C jne prox_M_std mov x,"L" jmp add_std prox_M_std: cmp xvar,4D jne prox_N_std mov x,"M" jmp add_std prox_N_std: cmp xvar,4E jne prox_O_std mov x,"N" jmp add_std prox_O_std: cmp xvar,4F jne prox_P_std mov x,"O" jmp add_std prox_P_std: cmp xvar,50 jne prox_Q_std mov x,"P" jmp add_std prox_Q_std: cmp xvar,51 jne prox_R_std mov x,"Q" jmp add_std prox_R_std: cmp xvar,52 jne prox_S_std mov x,"R" jmp add_std prox_S_std: cmp xvar,53 jne prox_T_std mov x,"S" jmp add_std prox_T_std: cmp xvar,54 jne prox_U_std mov x,"T" jmp add_std prox_U_std: cmp xvar,55 jne prox_V_std mov x,"U" jmp add_std prox_V_std: cmp xvar,56 jne prox_W_std mov x,"V" jmp add_std prox_W_std: cmp xvar,57 jne prox_X_std mov x,"W" jmp add_std prox_X_std: cmp xvar,58 jne prox_Y_std mov x,"X" jmp add_std prox_Y_std: cmp xvar,59 jne prox_Z_std mov x,"Y" jmp add_std prox_Z_std: cmp xvar,5A jne prox_a_std mov x,"Z" jmp add_std prox_a_std: cmp xvar,61 jne prox_b_std mov x,"a" jmp add_std prox_b_std: cmp xvar,62 jne prox_c_std mov x,"b" jmp add_std prox_c_std: cmp xvar,63 jne prox_d_std mov x,"c" jmp add_std prox_d_std: cmp xvar,64 jne prox_e_std mov x,"d" jmp add_std prox_e_std: cmp xvar,65 jne prox_f_std mov x,"e" jmp add_std prox_f_std: cmp xvar,66 jne prox_g_std mov x,"f" jmp add_std prox_g_std: cmp xvar,67 jne prox_h_std mov x,"g" jmp add_std prox_h_std: cmp xvar,68 jne prox_i_std mov x,"h" jmp add_std prox_i_std: cmp xvar,69 jne prox_j_std mov x,"i" jmp add_std prox_j_std: cmp xvar,6A jne prox_k_std mov x,"j" jmp add_std prox_k_std: cmp xvar,6B jne prox_l_std mov x,"k" jmp add_std prox_l_std: cmp xvar,6C jne prox_m_std mov x,"l" jmp add_std prox_m_std: cmp xvar,6D jne prox_n_std mov x,"m" jmp add_std prox_n_std: cmp xvar,6E jne prox_o_std mov x,"n" jmp add_std prox_o_std: cmp xvar,6F jne prox_p_std mov x,"o" jmp add_std prox_p_std: cmp xvar,70 jne prox_q_std mov x,"p" jmp add_std prox_q_std: cmp xvar,71 jne prox_r_std mov x,"q" jmp add_std prox_r_std: cmp xvar,72 jne prox_s_std mov x,"r" jmp add_std prox_s_std: cmp xvar,73 jne prox_t_std mov x,"s" jmp add_std prox_t_std: cmp xvar,74 jne prox_u_std mov x,"t" jmp add_std prox_u_std: cmp xvar,75 jne prox_v_std mov x,"u" jmp add_std prox_v_std: cmp xvar,76 jne prox_w_std mov x,"v" jmp add_std prox_w_std: cmp xvar,77 jne prox_x_std mov x,"w" jmp add_std prox_x_std: cmp xvar,78 jne prox_y_std mov x,"x" jmp add_std prox_y_std: cmp xvar,79 jne prox_z_std mov x,"y" jmp add_std prox_z_std: cmp xvar,7A jne exit_std mov x,"z" jmp add_std add_std: eval "{str}{x}" mov str,$RESULT inc x_eax jmp analyze fin_an_std: cmp go,1 je ana_edi_std jne fin_str_cov_std ana_edi_std: mov str_eax,str mov str,"" mov x_eax,edi inc go jmp analyze fin_str_cov_std: mov str_edi,str GPA str_edi,str_eax cmp $RESULT,0 je exit_std mov x,$RESULT start_fix: mov xvar,[data_sect] cmp x,xvar je fix add data_sect,4 cmp data_sect,end_data je exit jmp start_fix fix: eval "jmp dword ptr [{data_sect}]" asm x_addr,$RESULT mov eip,x_addr mov data_sect,save_data jmp start_proc_std fine_std: mov eip,OEP ret fine1_std: //mov firstchecks,1 mov eip,OEP //jmp start_proc_std ret exit_std: msg "Error" ret