IDA PRO 在跟踪时确实会错过呼叫

逆向工程 艾达 调试 调试器 补丁反转
2021-06-21 22:12:45

我正在关注本教程: 在此处输入链接描述

虽然它使用 Olly,但我正在关注 IDA。

基本上,我想了解程序中发生弹出式决定的位置。我虽然在正确的位置放置了一个 BP。我不明白的是:当我在这个位置只放置一个 BP 时: 在此处输入图片说明 并且我运行调试器,它在这个 BP 上停止。我按 F8,它继续“推 esi”,按 F8,我得到了我正在寻找的弹出消息。

然而,当我在这个位置放置另一个 BP 时 - 这个是从使用 Olly 的教程中扣除的。 在此处输入图片说明 我遵循相同的调试程序;我按 F8,它继续“推 esi”,F8 并且它在新的 BP @0043F812 上弯下腰,只有在再次按 F8 后,我才会在它调用“DialogBoxParamA”后得到弹出窗口。

所以我的问题是,当我必须放置 1 个 BP 时,为什么我不能到达 DialogBoxParamA @43F818?如何从外部的“DispatchMessageA”跳转到@43F818?

我将尝试将其形象化:

在此处输入图片说明

无论 BP 的数量如何,我都不能遵循相同的轨迹吗?

下面是 2 个跟踪日志。1 - 只有 1 个 BP 的跟踪日志,这个非常好

Thread  Address Instruction Result
00002378    .text:sub_442C44+2D4    Memory layout changed: 505 segments Memory layout changed: 505 segments
00002378            ST0=FFFFFFFFFFFFFFFF ST1=FFFFFFFFFFFFFFFF ST2=FFFFFFFFFFFFFFFF ST3=FFFFFFFFFFFFFFFF ST4=FFFFFFFFFFFFFFFF ST5=FFFFFFFFFFFFFFFF ST6=FFFFFFFFFFFFFFFF ST7=FFFFFFFFFFFFFFFF CTRL=FFFF CS=0023 DS=002B ES=002B FS=0053 GS=002B SS=002B EAX=00000000 EBX=00000000 ECX=741B2E09 EDX=00000000 ESI=0018E6C0 EDI=00000000 EBP=00000000 ESP=0018E6BC EFL=00200246 XMM0= XMM1= XMM2= XMM3= XMM4= XMM5= XMM6= XMM7= MXCSR=FFFFFFFF MM0= MM1= MM2= MM3= 
00002378    .text:sub_442C44+2D4    call    TranslateMessage; Call Procedure    ECX=0018E6C0 EDX=0000000F ESP=0018E6C0 EFL=00200244 
00002378    .text:sub_442C44+2D9    Memory layout changed: 522 segments Memory layout changed: 522 segments
00002378    .text:sub_442C44+2D9    push    esi; lpMsg  ESP=0018E6BC EFL=00200246 

************* 2nd TRACE with 2 BP ****************


Thread  Address Instruction Result
00002280    .text:sub_442C44+2D4    Memory layout changed: 505 segments Memory layout changed: 505 segments
00002280            ST0=FFFFFFFFFFFFFFFF ST1=FFFFFFFFFFFFFFFF ST2=FFFFFFFFFFFFFFFF ST3=FFFFFFFFFFFFFFFF ST4=FFFFFFFFFFFFFFFF ST5=FFFFFFFFFFFFFFFF ST6=FFFFFFFFFFFFFFFF ST7=FFFFFFFFFFFFFFFF CTRL=FFFF CS=0023 DS=002B ES=002B FS=0053 GS=002B SS=002B EAX=00000000 EBX=00000000 ECX=741B2E09 EDX=00000000 ESI=0018E6C0 EDI=00000000 EBP=00000000 ESP=0018E6BC EFL=00200246 XMM0= XMM1= XMM2= XMM3= XMM4= XMM5= XMM6= XMM7= MXCSR=FFFFFFFF MM0= MM1= MM2= MM3= 
00002280    .text:sub_442C44+2D4    call    TranslateMessage; Call Procedure    ECX=0018E6C0 EDX=0000000F ESP=0018E6C0 EFL=00200244 
00002280    .text:sub_442C44+2D9    push    esi; lpMsg  ESP=0018E6BC EFL=00200246 
00002280    .text:sub_442C44+2DA    call    DispatchMessageA; Call Procedure    ESP=0018E6B8 
00002280    .text:DispatchMessageA  jmp     ds:__imp_DispatchMessageA; Indirect Near Jump   
00002280    75FC7BBB        
00002280    75FC7BBD    Memory layout changed: 522 segments Memory layout changed: 522 segments
00002280    75FC7BBD        ESP=0018E6B4 
00002280    75FC7BBE        EBP=0018E6B4 
00002280    75FC7BC0        ESP=0018E6B0 
00002280    75FC7BC2        ESP=0018E6AC 
00002280    75FC7BC5        ESP=0018E6A8 
00002280    75FC76D7        ESP=0018E6A4 
00002280    75FC76D9        ESP=0018E6A0 
00002280    75FC76DE        EAX=0018E694 EBP=0018E6A4 ESP=0018E66C EFL=00200280 PF=0 ZF=0 SF=1 
00002280    75FC76E3        EFL=00200246 PF=1 ZF=1 SF=0 
00002280    75FC76E5        
00002280    75FC76E8        
00002280    75FC76EB        
00002280    75FC76F2        
00002280    75FC76F8        ECX=00B123FC 
00002280    75FC76FA        ZF=0 
00002280    75FC76FC        
00002280    75FC7702        EAX=00BB6A10 ECX=C0540000 EDX=00000000 EFL=00200200 PF=0 
00002280    75FC7707        EBX=00BB6A10 EFL=00200202 
00002280    75FC7709        
00002280    75FC770B        
00002280    75FC770D        
00002280    75FC7713        EAX=00B123FC 
00002280    75FC7715        
00002280    75FC7717        EAX=00000113 
00002280    75FC771A    Memory layout changed: 527 segments Memory layout changed: 527 segments
00002280    75FC771A        CF=1 SF=1 
00002280    75FC771F        
00002280    75FC788E        CF=0 PF=1 ZF=1 SF=0 
00002280    75FC7895        
00002280    75FC789B        CF=1 AF=1 ZF=0 SF=1 
00002280    75FC78A0        
00002280    75FC78A6        PF=0 
00002280    75FC78AB        
00002280    75FC7725        EDX=00000113 
00002280    75FC7728        CF=0 PF=1 AF=0 ZF=1 SF=0 
00002280    75FC772E        
00002280    75FC792D        EAX=00000000 
00002280    75FC7930        
00002280    75FC7932        
00002280    75FC7740        EAX=00BB6A10 
00002280    75FC7742        PF=0 ZF=0 
00002280    75FC7744        
00002280    75FC774A        EDI=0018E6C8 
00002280    75FC774D        ECX=0000000A 
00002280    75FC774F        
00002280    75FC7752        EAX=0043F070 
00002280    75FC7758    Memory layout changed: 527 segments Memory layout changed: 527 segments
00002280    75FC7758        
00002280    75FC775B        PF=1 ZF=1 
00002280    75FC775F        
00002280    75FC7765        PF=0 AF=1 ZF=0 
00002280    75FC7768        
00002280    75FC776E        EAX=FFFFFED3 
00002280    75FC7774        SF=1 
00002280    75FC7777        
00002280    75FC777D        EAX=00000119 
00002280    75FC7782        CF=1 PF=1 
00002280    75FC7784        
00002280    75FC778A        EAX=0000000A 
00002280    75FC778E        EAX=00000001 CF=0 PF=0 AF=0 SF=0 
00002280    75FC7791        EAX=FFFFFFFE 
00002280    75FC7793        EAX=00000000 PF=1 ZF=1 
00002280    75FC7796        ECX=00000000 
00002280    75FC7798        PF=0 ZF=0 
00002280    75FC779B        
00002280    75FC779E        PF=1 ZF=1 
00002280    75FC77A0        
00002280    75FC77A6        ESP=0018E668 
00002280    75FC77A8        EAX=00BB6A38 
00002280    75FC77AB        ESP=0018E664 
00002280    75FC77AC        ESP=0018E660 
00002280    75FC77AF        ESP=0018E65C 
00002280    75FC77B1        ESP=0018E658 
00002280    75FC77B4        ESP=0018E654 
00002280    75FC77B6        ESP=0018E650 
00002280    75FC77B9        ESP=0018E64C 
00002280    75FC77BF        EAX=000B3E35 EBX=00000113 ECX=EED71FD0 EDX=00000072 ESI=00B123FC EDI=00000000 EBP=0018E5A0 ESP=0018C1C4 PF=0 AF=1 ZF=0 
00002280    .text:sub_43F070+7A8    call    **DialogBoxParamA**; Call Procedure EAX=0018BA94 ECX=00000000 EDX=00000001 EBP=0018BFF0 ESP=00189C28 EFL=00200200 AF=0 
00002280    .text:sub_43F070:loc_43F81D Memory layout changed: 532 segments Memory layout changed: 532 segments
00002280    .text:sub_43F070:loc_43F81D cmp     byte_4A6894, 0; Compare Two Operands
1个回答

TranslateMessage&DispatchgMessage是处理 WinAPI 和消息循环时的标准 Windows 函数

当 aDispatchMessage被调用时,存储在其中的消息esi由 Windows 处理,然后应用程序中的消息处理程序被调用,这就是你看到你的DialogBoxParamA.

windows 处理程序注册在WNDCLASS结构的字段之一中,即lpfnWndProc. 在逆向 WinAPI 应用程序时,寻找有趣代码的最明显的地方是定位消息处理程序代码。

总而言之,当您在 Windows 处理程序代码中有第二个断点时,当处理此消息时,您会在DialogBoxParamA. 如果您没有它,则会处理消息,显示弹出窗口,然后您继续之前所在的位置。