Просмотр содержимого регистра в ASCII в GDB - PullRequest
2 голосов
/ 07 апреля 2019

enter image description here

Предположим, я сейчас на этой позиции и хочу увидеть содержимое cl, ch, cx, ecx и т. Д. В формате ascii.

Что делать?

Ниже приведена подпрограмма, отображаемая в команде layout asm.

RemCharCodeFromAToB:
    ; standard entry sequence
    push    ebp             ; save the previous value of ebp for the benefi$
    mov     ebp, esp        ; copy esp -> ebp so that ebp can be used as a $   

    ; accessing arguments  
                            ; [ebp + 0] = old ebp stack frame
                            ; [ebp + 4] = return address
    mov     edx, [ebp + 8]  ; string address

    while_loop_rcc:
        mov cl, [edx]       ; obtain the address of the 1st character of the string
        cmp cl, 0           ; check the null value  

        je  while_loop_exit_rcc     ; exit if the null-character is reached

        mov al, cl ; save cl
        mov cl, [ebp + 16]      ; end-char
        push cx                 ; push end-char
        mov cl, [ebp + 12]      ; start-char
        push cx                 ; push start-char
        push ax;                ; push ch
        call IsBetweenAandB
        add esp, 12

        cmp eax, 0          ; if(ch is not between 'a' and 'e')

        je inner_loop_exit_rcc

        mov eax, edx    ; copy the current address

        inner_loop_rcc:
            mov cl, [eax+1]
            cmp cl, 0
            je  inner_loop_exit_rcc

            mov [eax], cl

            inc eax
            jmp inner_loop_rcc
        inner_loop_exit_rcc:

        inc edx             ; increment the address
        jmp while_loop_rcc  ; start the loop again
    while_loop_exit_rcc:

    ; standard exit sequence
    mov     esp, ebp        ; restore esp with ebp
    pop     ebp             ; remove ebp from stack
    ret                     ; return the value of temporary variable

Ответы [ 2 ]

3 голосов
/ 07 апреля 2019

Это определит макрос asciiprint, который будет печатать значение регистра аргумента в виде последовательности символов от младшего байта до большинства.

(gdb) define asciiprint
 set $len = sizeof($arg0)
 set $val = (unsigned long long)($arg0)
 while $len-- > 0
   set $char = $val & 0xff
   if $char >= 0x20 && $char <= 0x7e
     printf "%c", $char
   else
     printf "\\x%02x", $char
   end
   set $val >>= 8
 end
 printf "\n"
end


(gdb) set $rcx=0x6b63616a70616c66
(gdb) asciiprint $rcx
flapjack
(gdb) asciiprint $ecx
flap
(gdb) asciiprint $cx
fl
(gdb) asciiprint $cl
f
(gdb) asciiprint $ch
l
1 голос
/ 07 апреля 2019

Я не уверен, что это то, что вам нужно, но если вы введете следующую команду:

print (char)$ch

... вы увидите значение регистра ch в виде символа ASCII:

$3 = 70 'F'

Однако это будет работать только для байтовых регистров.Если вы печатаете 16- или 32-битный регистр таким образом, будет напечатан только младший байт.

Вы можете использовать сдвиг вправо для печати 8 битов в некотором регистре в виде символа ASCII.В следующем примере биты 27 ... 20 из ecx будут напечатаны как символ ASCII:

print (char)(((long)$ecx)>>20)
...