Changeset 1634

Show
Ignore:
Timestamp:
06/21/08 20:49:48 (2 months ago)
Author:
till
Message:

honeytrap
- cpuEmu: code stepping corrected

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • honeytrap/trunk/src/modules/htm_cpuEmu.c

    r1633 r1634  
    164164 
    165165                int j; 
    166                 for ( j=0;j<8;j++ ) emu_cpu_reg32_set(cpu,j , 0); 
     166                for (j=0; j<8; j++) emu_cpu_reg32_set(cpu,j , 0); 
    167167 
    168168                emu_memory_write_dword(mem, 0xef787c3c, 4711); 
     
    180180 
    181181                // write code to offset 
    182                 int static_offset = CODE_OFFSET; 
    183                 emu_memory_write_block(mem, static_offset, opts.scode,  opts.size); 
     182                emu_memory_write_block(mem, CODE_OFFSET, opts.scode,  opts.size); 
    184183 
    185184                // set eip to code 
    186                 emu_cpu_eip_set(emu_cpu_get(e), static_offset + opts.offset); 
     185                emu_cpu_eip_set(emu_cpu_get(e), CODE_OFFSET + opts.offset); 
    187186                emu_cpu_reg32_set(emu_cpu_get(e), esp, 0x0012fe98); 
    188187 
     
    191190 
    192191                emu_free(e); 
     192 
     193                logmsg(LOG_NOISY, 1, "CPU Emulation - %u bytes processed.\n", attack->a_conn.payload.size); 
    193194                return(1); 
    194195        } 
    195196 
    196197        logmsg(LOG_NOISY, 1, "CPU Emulation - %u bytes processed.\n", attack->a_conn.payload.size); 
    197  
    198198        return(0); 
    199199} 
     
    202202// run detected asm code on emulated CPU 
    203203int run(struct emu *e) { 
    204         int                   j, ret; 
    205         uint32_t                eipsave
     204        int                   j, ret; 
     205        uint32_t                eipsave = 0
    206206        struct emu_cpu          *cpu = emu_cpu_get(e); 
    207207        struct emu_env          *env = emu_env_new(e); 
     208        struct emu_hashtable    *eh = NULL; 
     209 
    208210 
    209211        if (env == NULL) { 
    210                 logmsg(LOG_ERR, 1, "CPU Emulation Error - %s.\n", emu_strerror(e)); 
     212                logmsg(LOG_ERR, 1, "CPU Emulation Error - Unable to create environment: %s.\n", emu_strerror(e)); 
    211213                return -1; 
    212214        } 
     
    216218        emu_env_w32_export_hook(env, "ExitProcess", user_hook_ExitProcess, NULL); 
    217219        emu_env_w32_export_hook(env, "ExitThread", user_hook_ExitThread, NULL); 
     220 
    218221        emu_env_w32_export_hook(env, "CreateProcessA", user_hook_CreateProcess, NULL); 
    219222        emu_env_w32_export_hook(env, "WaitForSingleObject", user_hook_WaitForSingleObject, NULL); 
     
    230233        emu_env_w32_export_hook(env, "WSASocketA", user_hook_WSASocket, NULL); 
    231234 
    232        opts.steps = 1000000; 
     235        opts.steps = 1000000; 
    233236 
    234237        // run the code 
    235238        logmsg(LOG_NOISY, 1, "CPU Emulation - Running code...\n"); 
    236239 
    237         struct emu_hashtable *eh = NULL; 
    238         for (eipsave=0, j=0;j<opts.steps;j++ ) { 
    239                 if (cpu->repeat_current_instr == false) eipsave = emu_cpu_eip_get(emu_cpu_get(e)); 
    240  
    241                 struct emu_env_hook *hook = NULL; 
    242  
    243                 ret = 0; 
     240        for (j=0;j<opts.steps;j++) { 
     241                if ( cpu->repeat_current_instr == false ) eipsave = emu_cpu_eip_get(emu_cpu_get(e)); 
     242 
     243                struct emu_env_hook *hook       = NULL; 
     244                ret                             = 0; 
    244245 
    245246                if ((hook = emu_env_w32_eip_check(env)) != NULL) { 
     
    249250                        } 
    250251                } else { 
    251                         if ((ret = emu_cpu_parse(emu_cpu_get(e))) == -1) { 
    252                                 logmsg(LOG_WARN, 1, "CPU Emulation Warning - CPU Error: %s", emu_strerror(e)); 
    253                                 break; 
    254                         } 
     252                        ret = emu_cpu_parse(emu_cpu_get(e)); 
     253 
    255254                        if (log_level == LOG_DEBUG) { 
    256255                                emu_log_level_set(emu_logging_get(e),EMU_LOG_DEBUG); 
     
    258257                                emu_log_level_set(emu_logging_get(e),EMU_LOG_NONE); 
    259258                        } 
     259 
     260                        struct emu_env_hook *hook = NULL; 
     261 
     262                        if ( ret != -1 ) { 
     263                                if ( hook == NULL ) ret = emu_cpu_step(emu_cpu_get(e)); 
     264                                else break; 
     265                        } else { 
     266                                logmsg(LOG_WARN, 1, "CPU Emulation Warning - CPU error: %s", emu_strerror(e)); 
     267                                break; 
     268                        } 
    260269                } 
    261270        } 
     271 
    262272        if (eh != NULL) emu_hashtable_free(eh); 
    263273