IDA Python - Why My code return incorrect ESP Value?

蓝咒 提交于 2019-12-24 00:54:20

问题


I made a ida python code which for checking code coverage. But when I used this script, I got a runtime error and I could not get correct ESP value.

-My code-

from idaapi import *
class DbgHook(DBG_Hooks):
    def dbg_process_exit(self, pid, tid, ea, code):
        # bpt Del
        for fun in Functions(SegStart(ScreenEA()),SegEnd(ScreenEA())):
            DelBpt(fun)
        return
        debugger.unhook()

    def dbg_bpt(self, tid, ea):
        RefCode = get_long(GetRegValue('esp'))
        print "[*] Hit : 0x%08x - %s" % (ea , GetFunctionName(ea))
        print " GetRegValue : compare RET : 0x%08x" % RefCode
        return 1

for fun in Functions(SegStart(ScreenEA()),SegEnd(ScreenEA())):
    fnName = GetFunctionName(fun)
    AddBpt(fun)
    SetBptAttr(fun, BPTATTR_FLAGS, (GetBptAttr(fun, BPTATTR_FLAGS) & ~BPT_BRK ));

debugger = DbgHook()
debugger.unhook()
debugger.hook()

num_bp = GetBptQty()
print "[*] Set %d breakpoints " % num_bp

And I got an error

[*] Set 153 breakpoints 
Cannot find sync source "view:IDA View-A"; ignoring group
400000: process C:\temp\nc.exe has started (pid=6336)
773C0000: loaded C:\WINDOWS\system32\ntdll.dll
Unloaded 
Unloaded 
Unloaded 
Unloaded 
76050000: loaded C:\WINDOWS\SysWOW64\kernel32.dll
76550000: loaded C:\WINDOWS\SysWOW64\KernelBase.dll
76360000: loaded C:\WINDOWS\SysWOW64\msvcrt.dll
77409FA0: thread has started (tid=11496)
77409FA0: thread has started (tid=10228)
74010000: loaded C:\WINDOWS\SysWOW64\wsock32.dll
76130000: loaded C:\WINDOWS\SysWOW64\ws2_32.dll
762B0000: loaded C:\WINDOWS\SysWOW64\sechost.dll
75FA0000: loaded C:\WINDOWS\SysWOW64\rpcrt4.dll
740F0000: loaded C:\WINDOWS\SysWOW64\sspicli.dll
740E0000: loaded C:\WINDOWS\SysWOW64\cryptbase.dll
770B0000: loaded C:\WINDOWS\SysWOW64\bcryptprimitives.dll
77409FA0: thread has started (tid=9556)
[*] Hit : 0x004057f0 - TlsCallback_0
 GetRegValue : compare RET : 0x77436aae
[*] Hit : 0x00405eb0 - sub_405EB0
 GetRegValue : compare RET : 0x00000000
[*] Hit : 0x004061e8 - InitializeCriticalSection
 GetRegValue : compare RET : 0x00000000
Exception in DBG Hook function: SWIG director method error. Error detected when calling 'DBG_Hooks.dbg_bpt'
Traceback (most recent call last):
  File "C:/Users/jm/Documents/MakeCode/ida-python/tutorial/Code_Cover.py", line 18, in dbg_bpt
    RefCode = get_long(GetRegValue('esp'))
StopIteration
Exception in DBG Hook function: SWIG director method error. Error detected when calling 'DBG_Hooks.dbg_bpt'
Traceback (most recent call last):
  File "C:/Users/jm/Documents/MakeCode/ida-python/tutorial/Code_Cover.py", line 18, in dbg_bpt
    RefCode = get_long(GetRegValue('esp'))
StopIteration
[*] Hit : 0x00401020 - sub_401020
 GetRegValue : compare RET : 0x00401178
[*] Hit : 0x004057f0 - TlsCallback_0
 GetRegValue : compare RET : 0x00401160
[*] Hit : 0x00405620 - SetUnhandledExceptionFilter
 GetRegValue : compare RET : 0x00401160
[*] Hit : 0x00405980 - sub_405980
 GetRegValue : compare RET : 0x00401160
[*] Hit : 0x00405e10 - sub_405E10
 GetRegValue : compare RET : 0x00401160
[*] Hit : 0x00406088 - __getmainargs
 GetRegValue : compare RET : 0x00401160
[*] Hit : 0x00406090 - __p__fmode
 GetRegValue : compare RET : 0x00401160
[*] Hit : 0x00405ba0 - sub_405BA0
 GetRegValue : compare RET : 0x00401160
[*] Hit : 0x00405df0 - sub_405DF0
 GetRegValue : compare RET : 0x9b3e0acd
[*] Hit : 0x00405d90 - sub_405D90
 GetRegValue : compare RET : 0x9b3e0acd
Exception in DBG Hook function: SWIG director method error. Error detected when calling 'DBG_Hooks.dbg_bpt'
Traceback (most recent call last):
  File "C:/Users/jm/Documents/MakeCode/ida-python/tutorial/Code_Cover.py", line 18, in dbg_bpt
    RefCode = get_long(GetRegValue('esp'))
StopIteration
[*] Hit : 0x00401300 - sub_401300
 GetRegValue : compare RET : 0x00000000

when I manually checked ESP at 0x00401300, I could see 0x0040620b value. but with my code, there was an incorrect ESP value 0x00000000 at 0x00401300.

How could I fix it?


回答1:


Since OP did not provide an answer, I'll give it a shot

IDA maintains it's own copy / representation of the analyzed file in it's IDB file format (and the uncompressed files while active). Those files contain every byte in the executable by default, and will contain most bytes in most allocated memory regions while debugging. A similar thing happens with registers.

IDA does not (and cannot) constantly update the state of memory and registers while the executable is running and only does so periodically. To assist with that, the function RefreshDebuggerMemory() will force IDA to refresh memory (and register) state.



来源:https://stackoverflow.com/questions/35076730/ida-python-why-my-code-return-incorrect-esp-value

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!