# set to 1 to enable 64bits target by default (32bit is the default) set $64BITS = 1 set confirm off set verbose off set prompt \033[31mgdb$ \033[0m set output-radix 0x10 set input-radix 0x10 # These make gdb never pause in its output set height 0 set width 0 # _____________breakpoint aliases_____________ define bpl info breakpoints end document bpl List all breakpoints. end define bp if $argc != 1 help bp else break $arg0 end end document bp Set breakpoint. Usage: bp LOCATION LOCATION may be a line number, function name, or "*" and an address. To break on a symbol you must enclose symbol name inside "". Example: bp "[NSControl stringValue]" Or else you can use directly the break command (break [NSControl stringValue]) end define bpc if $argc != 1 help bpc else clear $arg0 end end document bpc Clear breakpoint. Usage: bpc LOCATION LOCATION may be a line number, function name, or "*" and an address. end define bpe if $argc != 1 help bpe else enable $arg0 end end document bpe Enable breakpoint with number NUM. Usage: bpe NUM end define bpd if $argc != 1 help bpd else disable $arg0 end end document bpd Disable breakpoint with number NUM. Usage: bpd NUM end define bpt if $argc != 1 help bpt else tbreak $arg0 end end document bpt Set a temporary breakpoint. Will be deleted when hit! Usage: bpt LOCATION LOCATION may be a line number, function name, or "*" and an address. end define bpm if $argc != 1 help bpm else awatch $arg0 end end document bpm Set a read/write breakpoint on EXPRESSION, e.g. *address. Usage: bpm EXPRESSION end define bhb if $argc != 1 help bhb else hb $arg0 end end document bhb Set hardware assisted breakpoint. Usage: bhb LOCATION LOCATION may be a line number, function name, or "*" and an address. end # ______________process information____________ define argv show args end document argv Print program arguments. end define stack if $argc == 0 info stack end if $argc == 1 info stack $arg0 end if $argc > 1 help stack end end document stack Print backtrace of the call stack, or innermost COUNT frames. Usage: stack end define frame info frame info args info locals end document frame Print stack frame. end define flags # OF (overflow) flag if (($eflags >> 0xB) & 1) printf "O " set $_of_flag = 1 else printf "o " set $_of_flag = 0 end if (($eflags >> 0xA) & 1) printf "D " else printf "d " end if (($eflags >> 9) & 1) printf "I " else printf "i " end if (($eflags >> 8) & 1) printf "T " else printf "t " end # SF (sign) flag if (($eflags >> 7) & 1) printf "S " set $_sf_flag = 1 else printf "s " set $_sf_flag = 0 end # ZF (zero) flag if (($eflags >> 6) & 1) printf "Z " set $_zf_flag = 1 else printf "z " set $_zf_flag = 0 end if (($eflags >> 4) & 1) printf "A " else printf "a " end # PF (parity) flag if (($eflags >> 2) & 1) printf "P " set $_pf_flag = 1 else printf "p " set $_pf_flag = 0 end # CF (carry) flag if ($eflags & 1) printf "C " set $_cf_flag = 1 else printf "c " set $_cf_flag = 0 end printf "\n" end document flags Print flags register. end define eflags printf " OF <%d> DF <%d> IF <%d> TF <%d>",\ (($eflags >> 0xB) & 1), (($eflags >> 0xA) & 1), \ (($eflags >> 9) & 1), (($eflags >> 8) & 1) printf " SF <%d> ZF <%d> AF <%d> PF <%d> CF <%d>\n",\ (($eflags >> 7) & 1), (($eflags >> 6) & 1),\ (($eflags >> 4) & 1), (($eflags >> 2) & 1), ($eflags & 1) printf " ID <%d> VIP <%d> VIF <%d> AC <%d>",\ (($eflags >> 0x15) & 1), (($eflags >> 0x14) & 1), \ (($eflags >> 0x13) & 1), (($eflags >> 0x12) & 1) printf " VM <%d> RF <%d> NT <%d> IOPL <%d>\n",\ (($eflags >> 0x11) & 1), (($eflags >> 0x10) & 1),\ (($eflags >> 0xE) & 1), (($eflags >> 0xC) & 3) end document eflags Print eflags register. end define reg if ($64BITS == 1) # 64bits stuff printf " " echo \033[32m printf "RAX:" echo \033[0m printf " 0x%016lX ", $rax echo \033[32m printf "RBX:" echo \033[0m printf " 0x%016lX ", $rbx echo \033[32m printf "RCX:" echo \033[0m printf " 0x%016lX ", $rcx echo \033[32m printf "RDX:" echo \033[0m printf " 0x%016lX ", $rdx echo \033[1m\033[4m\033[31m flags echo \033[0m printf " " echo \033[32m printf "RSI:" echo \033[0m printf " 0x%016lX ", $rsi echo \033[32m printf "RDI:" echo \033[0m printf " 0x%016lX ", $rdi echo \033[32m printf "RBP:" echo \033[0m printf " 0x%016lX ", $rbp echo \033[32m printf "RSP:" echo \033[0m printf " 0x%016lX ", $rsp echo \033[32m printf "RIP:" echo \033[0m printf " 0x%016lX\n ", $rip echo \033[32m printf "R8 :" echo \033[0m printf " 0x%016lX ", $r8 echo \033[32m printf "R9 :" echo \033[0m printf " 0x%016lX ", $r9 echo \033[32m printf "R10:" echo \033[0m printf " 0x%016lX ", $r10 echo \033[32m printf "R11:" echo \033[0m printf " 0x%016lX ", $r11 echo \033[32m printf "R12:" echo \033[0m printf " 0x%016lX\n ", $r12 echo \033[32m printf "R13:" echo \033[0m printf " 0x%016lX ", $r13 echo \033[32m printf "R14:" echo \033[0m printf " 0x%016lX ", $r14 echo \033[32m printf "R15:" echo \033[0m printf " 0x%016lX\n ", $r15 echo \033[32m printf "CS:" echo \033[0m printf " %04X ", $cs echo \033[32m printf "DS:" echo \033[0m printf " %04X ", $ds echo \033[32m printf "ES:" echo \033[0m printf " %04X ", $es echo \033[32m printf "FS:" echo \033[0m printf " %04X ", $fs echo \033[32m printf "GS:" echo \033[0m printf " %04X ", $gs echo \033[32m printf "SS:" echo \033[0m printf " %04X", $ss echo \033[0m # 32bits stuff else printf " " echo \033[32m printf "EAX:" echo \033[0m printf " 0x%08X ", $eax echo \033[32m printf "EBX:" echo \033[0m printf " 0x%08X ", $ebx echo \033[32m printf "ECX:" echo \033[0m printf " 0x%08X ", $ecx echo \033[32m printf "EDX:" echo \033[0m printf " 0x%08X ", $edx echo \033[1m\033[4m\033[31m flags echo \033[0m printf " " echo \033[32m printf "ESI:" echo \033[0m printf " 0x%08X ", $esi echo \033[32m printf "EDI:" echo \033[0m printf " 0x%08X ", $edi echo \033[32m printf "EBP:" echo \033[0m printf " 0x%08X ", $ebp echo \033[32m printf "ESP:" echo \033[0m printf " 0x%08X ", $esp echo \033[32m printf "EIP:" echo \033[0m printf " 0x%08X\n ", $eip echo \033[32m printf "CS:" echo \033[0m printf " %04X ", $cs echo \033[32m printf "DS:" echo \033[0m printf " %04X ", $ds echo \033[32m printf "ES:" echo \033[0m printf " %04X ", $es echo \033[32m printf "FS:" echo \033[0m printf " %04X ", $fs echo \033[32m printf "GS:" echo \033[0m printf " %04X ", $gs echo \033[32m printf "SS:" echo \033[0m printf " %04X", $ss echo \033[0m end # call smallregisters smallregisters # display conditional jump routine if ($64BITS == 1) printf "\t\t\t\t" end dumpjump printf "\n" end document reg Print CPU registers. end define smallregisters if ($64BITS == 1) #64bits stuff # from rax set $eax = $rax & 0xffffffff set $ax = $rax & 0xffff set $al = $ax & 0xff set $ah = $ax >> 8 # from rbx set $bx = $rbx & 0xffff set $bl = $bx & 0xff set $bh = $bx >> 8 # from rcx set $ecx = $rcx & 0xffffffff set $cx = $rcx & 0xffff set $cl = $cx & 0xff set $ch = $cx >> 8 # from rdx set $edx = $rdx & 0xffffffff set $dx = $rdx & 0xffff set $dl = $dx & 0xff set $dh = $dx >> 8 # from rsi set $esi = $rsi & 0xffffffff set $si = $rsi & 0xffff # from rdi set $edi = $rdi & 0xffffffff set $di = $rdi & 0xffff #32 bits stuff else # from eax set $ax = $eax & 0xffff set $al = $ax & 0xff set $ah = $ax >> 8 # from ebx set $bx = $ebx & 0xffff set $bl = $bx & 0xff set $bh = $bx >> 8 # from ecx set $cx = $ecx & 0xffff set $cl = $cx & 0xff set $ch = $cx >> 8 # from edx set $dx = $edx & 0xffff set $dl = $dx & 0xff set $dh = $dx >> 8 # from esi set $si = $esi & 0xffff # from edi set $di = $edi & 0xffff end end document smallregisters Create the 16 and 8 bit cpu registers (gdb doesn't have them by default) And 32bits if we are dealing with 64bits binaries end define func if $argc == 0 info functions end if $argc == 1 info functions $arg0 end if $argc > 1 help func end end document func Print all function names in target, or those matching REGEXP. Usage: func end define var if $argc == 0 info variables end if $argc == 1 info variables $arg0 end if $argc > 1 help var end end document var Print all global and static variable names (symbols), or those matching REGEXP. Usage: var end define lib info sharedlibrary end document lib Print shared libraries linked to target. end define sig if $argc == 0 info signals end if $argc == 1 info signals $arg0 end if $argc > 1 help sig end end document sig Print what debugger does when program gets various signals. Specify a SIGNAL as argument to print info on that signal only. Usage: sig end define threads info threads end document threads Print threads in target. end define dis if $argc == 0 disassemble end if $argc == 1 disassemble $arg0 end if $argc == 2 disassemble $arg0 $arg1 end if $argc > 2 help dis end end document dis Disassemble a specified section of memory. Default is to disassemble the function surrounding the PC (program counter) of selected frame. With one argument, ADDR1, the function surrounding this address is dumped. Two arguments are taken as a range of memory to dump. Usage: dis end # __________hex/ascii dump an address_________ define ascii_char if $argc != 1 help ascii_char else # thanks elaine :) set $_c = *(unsigned char *)($arg0) if ($_c < 0x20 || $_c > 0x7E) printf "." else printf "%c", $_c end end end document ascii_char Print ASCII value of byte at address ADDR. Print "." if the value is unprintable. Usage: ascii_char ADDR end define hex_quad if $argc != 1 help hex_quad else printf "%02X %02X %02X %02X %02X %02X %02X %02X", \ *(unsigned char*)($arg0), *(unsigned char*)($arg0 + 1), \ *(unsigned char*)($arg0 + 2), *(unsigned char*)($arg0 + 3), \ *(unsigned char*)($arg0 + 4), *(unsigned char*)($arg0 + 5), \ *(unsigned char*)($arg0 + 6), *(unsigned char*)($arg0 + 7) end end document hex_quad Print eight hexadecimal bytes starting at address ADDR. Usage: hex_quad ADDR end define hexdump if $argc != 1 help hexdump else echo \033[1m if ($64BITS == 1) printf "0x%016lX : ", $arg0 else printf "0x%08X : ", $arg0 end echo \033[0m hex_quad $arg0 echo \033[1m printf " - " echo \033[0m hex_quad $arg0+8 printf " " echo \033[1m ascii_char $arg0+0x0 ascii_char $arg0+0x1 ascii_char $arg0+0x2 ascii_char $arg0+0x3 ascii_char $arg0+0x4 ascii_char $arg0+0x5 ascii_char $arg0+0x6 ascii_char $arg0+0x7 ascii_char $arg0+0x8 ascii_char $arg0+0x9 ascii_char $arg0+0xA ascii_char $arg0+0xB ascii_char $arg0+0xC ascii_char $arg0+0xD ascii_char $arg0+0xE ascii_char $arg0+0xF echo \033[0m printf "\n" end end document hexdump Display a 16-byte hex/ASCII dump of memory at address ADDR. Usage: hexdump ADDR end # _______________data window__________________ define ddump if $argc != 1 help ddump else echo \033[34m if ($64BITS == 1) printf "[0x%04X:0x%016lX]", $ds, $data_addr else printf "[0x%04X:0x%08X]", $ds, $data_addr end echo \033[34m printf "------------------------" printf "-------------------------------" if ($64BITS == 1) printf "-------------------------------------" end echo \033[1;34m printf "[data]\n" echo \033[0m set $_count = 0 while ($_count < $arg0) set $_i = ($_count * 0x10) hexdump $data_addr+$_i set $_count++ end end end document ddump Display NUM lines of hexdump for address in $data_addr global variable. Usage: ddump NUM end define dd if $argc != 1 help dd else if ((($arg0 >> 0x18) == 0x40) || (($arg0 >> 0x18) == 0x08) || (($arg0 >> 0x18) == 0xBF)) set $data_addr = $arg0 ddump 0x10 else printf "Invalid address: %08X\n", $arg0 end end end document dd Display 16 lines of a hex dump of address starting at ADDR. Usage: dd ADDR end define datawin if ($64BITS == 1) if ((($rsi >> 0x18) == 0x40) || (($rsi >> 0x18) == 0x08) || (($rsi >> 0x18) == 0xBF)) set $data_addr = $rsi else if ((($rdi >> 0x18) == 0x40) || (($rdi >> 0x18) == 0x08) || (($rdi >> 0x18) == 0xBF)) set $data_addr = $rdi else if ((($rax >> 0x18) == 0x40) || (($rax >> 0x18) == 0x08) || (($rax >> 0x18) == 0xBF)) set $data_addr = $rax else set $data_addr = $rsp end end end else if ((($esi >> 0x18) == 0x40) || (($esi >> 0x18) == 0x08) || (($esi >> 0x18) == 0xBF)) set $data_addr = $esi else if ((($edi >> 0x18) == 0x40) || (($edi >> 0x18) == 0x08) || (($edi >> 0x18) == 0xBF)) set $data_addr = $edi else if ((($eax >> 0x18) == 0x40) || (($eax >> 0x18) == 0x08) || (($eax >> 0x18) == 0xBF)) set $data_addr = $eax else set $data_addr = $esp end end end end ddump $CONTEXTSIZE_DATA end document datawin Display valid address from one register in data window. Registers to choose are: esi, edi, eax, or esp. end