Hi Thomas,

While Dyninst fully supports 64-bit ELF binaries, I don't think Dyninst
currently work with 64-bit PE binaries. I need to ask others to know how
much efforts are needed if you really want to do analyze 64-bit PE binaries.

In terms of your 32-bit code example, the jump table construct looks very
primitive, so I am a little surprise that Dyninst currently failed to
analyze it.

To debug this, you can first set "DYNINST_DEBUG_PARSING" to 1 and then run
your program again. This will dump the complete debugging log. In terms of
the code, you want to start with parseAPI/src/IndirectAnalyzer.C, which
performs the analysis of the jump tables. It contains two major pieces:
parseAPI/src/JumpTableFormatPred.C, which contains the code to determine
the jump table locations, jump table index variables, and other format
elements, and parseAPI/src/JumpTableIndexPred.C, which tries the determine
the value bound of the index variables.

In your case, I am guessing that the problem is in JumpTableFormatPred.C.

If you find it difficult to debug this by your own and if it is possible to
share this problematic binary with me, I can take a look at it.

Thanks,

--Xiaozhu

On Tue, Aug 22, 2017 at 7:50 AM, Thomas Dullien <thomasdull...@google.com>
wrote:

> Hey there,
>
> I gave the fork a try, but it does not seem to have handled the switch I
> encounter either. The construct looks
> as follows:
>
> .text:5A6E59FA                 push    ebp
> .text:5A6E59FB                 mov     ebp, esp
> .text:5A6E59FD                 sub     esp, 18h
> .text:5A6E5A00                 imul    eax, [ebp+arg_4], 28h
> .text:5A6E5A04                 push    ebx
> .text:5A6E5A05                 mov     ebx, [ebp+arg_0]
> .text:5A6E5A08                 push    esi
> .text:5A6E5A09                 mov     esi, ecx
> .text:5A6E5A0B                 mov     [ebp+var_8], 17D7840h
> .text:5A6E5A12                 add     eax, ebx
> .text:5A6E5A14                 mov     [ebp+var_14], esi
> .text:5A6E5A17                 mov     [ebp+var_C], ebx
> .text:5A6E5A1A                 mov     [ebp+var_18], eax
> .text:5A6E5A1D                 push    edi
> .text:5A6E5A1E                 cmp     ebx, eax
> .text:5A6E5A20                 jnb     loc_5A6E608A
> .text:5A6E5A26                 lea     eax, [ebx+8]
> .text:5A6E5A29                 mov     ecx, esi
> .text:5A6E5A2B                 push    eax
> .text:5A6E5A2C                 call    (..)
> .text:5A6E5A31                 mov     edi, eax
> .text:5A6E5A33                 lea     eax, [ebx+18h]
> .text:5A6E5A36                 push    eax
> .text:5A6E5A37                 call    (...)
> .text:5A6E5A3C                 mov     ecx, eax
> .text:5A6E5A3E                 mov     eax, [ebx]
> .text:5A6E5A40                 cmp     eax, 36h        ; switch 55 cases
> .text:5A6E5A43                 ja      loc_5A6E6095    ; jumptable
> 5A6E5A49 default case
> .text:5A6E5A49                 jmp     ds:off_5A6E609A[eax*4] ; switch jump
>
> Any advice on where in the dyninst codebase I should go digging for the
> switch handling code?
>
> Cheers,
> Thomas
>
> On Tue, Aug 22, 2017 at 1:26 PM, Thomas Dullien <thomasdull...@google.com>
> wrote:
>
>> Hey there,
>>
>> an example from 32-bit code where the default switch handling fails:
>>
>> .text:00412990                 sub     esp, 50h
>> .text:00412993                 mov     eax, ___security_cookie
>> .text:00412998                 xor     eax, esp
>> .text:0041299A                 mov     [esp+50h+var_4], eax
>> .text:0041299E                 mov     edx, [esp+50h+arg_0]
>> .text:004129A2                 push    ebx
>> .text:004129A3                 mov     ebx, ecx
>> .text:004129A5                 lea     eax, [edx-1]
>> .text:004129A8                 cmp     eax, 6          ; switch 7 cases
>> .text:004129AB                 ja      loc_412F7E      ; jumptable
>> 004129B4 default case
>> .text:004129B1                 push    ebp
>> .text:004129B2                 push    esi
>> .text:004129B3                 push    edi
>> .text:004129B4                 jmp     ds:off_412F90[eax*4] ; switch jump
>>
>> Enough of this for the moment, though :-)) -- I will check your branch
>> now :-)
>>
>> Cheers,
>> Thomas
>>
>> On Tue, Aug 22, 2017 at 1:24 PM, Thomas Dullien <thomasdull...@google.com
>> > wrote:
>>
>>> Hey there,
>>>
>>> I am back at work on this :-).
>>>
>>> A few questions:
>>>  - Your fork is a fork of Dyninst 9 ?
>>>  - Are there any things I need to be aware of when building it?
>>>
>>> The particular scenario I am dealing with right now is the following
>>> construct (x86_64 disassembly of
>>> Visual Studio compiled code).
>>>
>>> .text:000000014004D970                 mov     [rsp+arg_8], edx
>>> .text:000000014004D974                 mov     [rsp+arg_0], rcx
>>> .text:000000014004D979                 push    rdi
>>> .text:000000014004D97A                 sub     rsp, 220h
>>> .text:000000014004D981                 mov     rdi, rsp
>>> .text:000000014004D984                 mov     ecx, 88h
>>> .text:000000014004D989                 mov     eax, 0CCCCCCCCh
>>> .text:000000014004D98E                 rep stosd
>>> .text:000000014004D990                 mov     rcx, [rsp+228h+arg_0]
>>> .text:000000014004D998                 mov     rax, cs:__security_cookie
>>> .text:000000014004D99F                 xor     rax, rsp
>>> .text:000000014004D9A2                 mov     [rsp+228h+var_18], rax
>>> .text:000000014004D9AA                 mov     eax, [rsp+228h+arg_8]
>>> .text:000000014004D9B1                 mov     [rsp+228h+var_80], eax
>>> .text:000000014004D9B8                 mov     eax, [rsp+228h+var_80]
>>> .text:000000014004D9BF                 dec     eax
>>> .text:000000014004D9C1                 mov     [rsp+228h+var_80], eax
>>> .text:000000014004D9C8                 cmp     [rsp+228h+var_80], 5 ;
>>> switch 6 cases
>>> .text:000000014004D9D0                 ja      loc_14004EA48   ;
>>> jumptable 000000014004D9EF default case
>>> .text:000000014004D9D6                 movsxd  rax, [rsp+228h+var_80]
>>> .text:000000014004D9DE                 lea     rcx, cs:140000000h
>>> .text:000000014004D9E5                 mov     eax, ds:(off_14004EA70 -
>>> 140000000h)[rcx+rax*4]
>>> .text:000000014004D9EC                 add     rax, rcx
>>> .text:000000014004D9EF                 jmp     rax             ; switch
>>> jump
>>> .text:000000014004D9F1 ; ------------------------------
>>> ---------------------------------------------
>>>
>>> Cheers,
>>> Thomas
>>>
>>> On Tue, Jun 13, 2017 at 4:35 PM, Thomas Dullien <
>>> thomasdull...@google.com> wrote:
>>>
>>>> Hey there,
>>>>
>>>> excellent, thanks for your quick response :-) I will give your fork a
>>>> try in the next 2-3 days -- I am currently
>>>> at a conference and hence won't have time to try it today :-)
>>>>
>>>> Cheers,
>>>> Thomas
>>>>
>>>> On Tue, Jun 13, 2017 at 10:30 AM, Xiaozhu Meng <mxz...@gmail.com>
>>>> wrote:
>>>>
>>>>> Hi Thomas,
>>>>>
>>>>> I am working with an improved jump table analysis. Its prototype is
>>>>> available at my Dyninst fork (https://github.com/mxz297/dyn
>>>>> inst/tree/jump_table_multi_slices). This improved version should be
>>>>> merged back to mainstream Dyninst in the near future. Could you try my
>>>>> version to see whether it solves your problem? If the problem remains,
>>>>> could you provide me the problematic binary so that I can further improve
>>>>> my code?
>>>>>
>>>>> Thanks,
>>>>>
>>>>> --Xiaozhu
>>>>>
>>>>> On Tue, Jun 13, 2017 at 7:25 AM, Thomas Dullien <
>>>>> thomasdull...@google.com> wrote:
>>>>>
>>>>>> Hey all,
>>>>>>
>>>>>> I am using DynInst for a small project that helps search for similar
>>>>>> flowgraph in a search index (https://www.github.com/thomas
>>>>>> dullien/functionsimsearch)
>>>>>> and noticed that most switch statements that it encounters are not
>>>>>> handled properly (e.g. the control flow reconstruction fails to
>>>>>> resolve
>>>>>> the switch targets).
>>>>>>
>>>>>> Where in the source code should I go looking for the relevant code?
>>>>>> I'd love to have a look around to see if it can be improved.
>>>>>>
>>>>>> Cheers,
>>>>>> Thomas
>>>>>>
>>>>>> _______________________________________________
>>>>>> Dyninst-api mailing list
>>>>>> Dyninst-api@cs.wisc.edu
>>>>>> https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api
>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
_______________________________________________
Dyninst-api mailing list
Dyninst-api@cs.wisc.edu
https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api

Reply via email to