Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
R_SEARCH(3)		     Library Functions Manual		     R_SEARCH(3)

NAME
     r_search -- radare2 search library

SYNOPSIS
     #include <r_search.h>

DESCRIPTION
     The   r_search  library  provides	comprehensive  search  capabilities  for
     radare2, supporting various search modes including keyword search,  regular
     expressions, cryptographic patterns, strings, and more. It allows for effi-
     cient  searching  through	binary	data with customizable callbacks and hit
     management.

     The core structure is RSearch, which manages search keywords, modes,  call-
     backs, and search results.

INITIALIZATION
     Initialization covers creating and freeing a search context. Use these rou-
     tines  to	allocate a fresh RSearch object configured for a search mode be-
     fore adding keywords or running updates; free it when you	no  longer  need
     the search context to avoid memory leaks.

     RSearch * r_search_new(int mode)

     Allocates and returns a new search context initialized for the given `mode`
     (for  example `R_SEARCH_KEYWORD` or `R_SEARCH_STRING`). The returned object
     owns internal lists and state used by subsequent API calls.

     void r_search_free(RSearch *s)

     Releases all resources held by the search context,  including  keyword  and
     hit  lists.  Do  not  call  any other `r_search_*` functions with `s` after
     freeing it.

KEYWORD MANAGEMENT
     Keywords describe the byte sequences, strings or patterns you want to find.
     Create keywords with the `r_search_keyword_new*` helpers and  add	them  to
     the  `RSearch`  context. In practice keywords are used to implement literal
     byte searches  (hex  or  binary),	case-sensitive	or  -insensitive  string
     searches,	and  regular expression matching. For example, `r_anal_preludes`
     uses `r_search_keyword_new_hexstr` to build prelude patterns  for	function
     detection.

     RSearchKeyword  *	r_search_keyword_new(const ut8 *kw, int kwlen, const ut8
     *bm, int bmlen, const char *data)

     Creates a binary keyword with optional binary  mask.  `kw`/`kwlen`  specify
     the pattern bytes; `bm` is an optional mask applied per-byte.

     RSearchKeyword  *	r_search_keyword_new_str(const char *kw, const char *bm,
     const char *data, bool icase)

     Creates a keyword from a C string; `icase` controls case  sensitivity.  Use
     this  for	human-readable	searches  (e.g. symbol names embedded in the bi-
     nary).

     RSearchKeyword * r_search_keyword_new_hexstr(const  char  *xs,  const  char
     *data)

     Parses a hex string (like "9090cc") to create a binary keyword. Useful when
     the  search  pattern is expressed as hexpairs (the core search command con-
     structs keywords this way).

     RSearchKeyword * r_search_keyword_new_regexp(const char  *str,  const  char
     *data)

     Compiles a regular expression into a keyword for `R_SEARCH_REGEXP` mode.

     bool r_search_kw_add(RSearch *s, RSearchKeyword *kw)

     Appends  the  keyword  `kw`  to  the search context `s`. The search context
     keeps ownership of added keywords and will free them  when  `r_search_free`
     or `r_search_kw_reset` is called.

SEARCHING
     Searching covers feeding data to the search engine and retrieving hits. You
     can  push	raw buffers directly with `r_search_update`, read ranges from an
     `RIO` implementation using `r_search_update_read`,  or  search  a	complete
     buffer  and  obtain  a  ready-made  list of hits using `r_search_find`. For
     large inputs distributed across mapped regions use `r_search_maps` to iter-
     ate over the IO maps and call `r_search_update_read` for  each  map  a  the
     core `search` command does this to scan an entire binary efficiently.

     int r_search_update(RSearch *s, ut64 from, const ut8 *buf, long len)

     Process  `len` bytes from `buf` starting at virtual address `from`. The ac-
     tive `s->update` handler is invoked depending on the  search  mode  set  by
     `r_search_set_mode`.

     int r_search_update_read(RSearch *s, ut64 from, ut64 to)

     Read  data from the configured I/O callbacks (or `s->consb`) in the address
     range [`from`, `to`) and run the search over that data. This is  convenient
     to  scan  memory  or  file-backed regions without allocating a single large
     buffer.

     RList * r_search_find(RSearch *s, ut64 addr, const ut8 *buf, int len)

     Convenience wrapper that sets an internal callback which collects hits into
     a `RList` and calls `r_search_update`. Use it when  you  already  have  the
     buffer to search and need a quick list of hits.

SEARCH MODES
     Different search engines are implemented behind `RSearch` (keyword, regexp,
     strings, crypto heuristics). Choose the right mode with `r_search_set_mode`
     before  adding keywords or invoking updates; some modes (like `R_SEARCH_RA-
     BIN_KARP`) expect a different workflow and do not use `r_search_update` di-
     rectly.

     int r_search_set_mode(RSearch *s, int mode)

     Selects the active search	algorithm  for	the  context  `s`  (for  example
     `R_SEARCH_KEYWORD`,  `R_SEARCH_REGEXP`,  `R_SEARCH_STRING`, `R_SEARCH_AES`,
     etc.). The function sets internal handlers used by `r_search_update`.

STRINGS
     String search mode detects sequences of  printable  characters  (C-strings,
     UTF-16  wide  strings,  etc.). Use `r_search_strings` to run the string ex-
     traction and `r_search_set_string_limits` to tune what counts as  a  string
     (minimum and maximum length). This is helpful for harvesting embedded iden-
     tifiers,  paths  or textual data from a binary before running more targeted
     keyword searches.

     int r_search_strings(RSearch *s, ut32 min, ut32 max)

     Scans for printable strings with length between `min` and `max` and records
     them as hits.

     bool r_search_set_string_limits(RSearch *s, ut32 min, ut32 max)

     Configure the minimum (`min`) and maximum (`max`) string lengths considered
     when scanning in string mode. The function returns `false` if `max` is non-
     zero and smaller than `min`.

RANGES
     Ranges control which address intervals are scanned when the  search  engine
     reads  from  I/O.	 Adding  ranges  is useful when you want to restrict the
     search to sections, mapped regions, or other subsets of the  address  space
     and skip unmapped or irrelevant areas.

     int r_search_range_add(RSearch *s, ut64 from, ut64 to)

     Include  the  half-open  interval	[`from`, `to`) in the set of ranges that
     `r_search_update_read` may iterate over.

     int r_search_range_reset(RSearch *s)

     Remove all previously added ranges.

CALLBACKS
     Callbacks let you stream matches as they are found, or customize  how  data
     is read for `r_search`.  The typical pattern used in core is to set a call-
     back  that  appends  `RSearchHit` objects into a list or emits JSON output.
     Callbacks are also used to interrupt searches early  (for	example  when  a
     maximum number of hits was reached).

     void   r_search_set_callback(RSearch  *s,	RSearchCallback  callback,  void
     *user)

     Register a hit callback. The callback receives  the  matching  `RSearchKey-
     word`, the `user` pointer and the `addr` of the hit. Return values from the
     callback can control search continuation.

     void r_search_set_read_cb(RSearch *s, RSearchRCb cb, void *user)

     Provide a custom read callback used by `r_search_update_read` to access the
     backing I/O. Core uses the default I/O when this is not set.

HITS
     A	hit  represents  a  successful match of a keyword at a given virtual ad-
     dress. Hits can be created internally  by	the  engine  or  explicitly  via
     `r_search_hit_new`.  When	no  callback is set hits are stored in `s->hits`
     and can be consumed after the search finishes.

     int r_search_hit_new(RSearch *s, RSearchKeyword *kw, ut64 addr)

     Append a hit for `kw` found at `addr` into  the  internal	hits  list.  The
     function enforces alignment and overlap rules configured on the search con-
     text and returns status codes used by `r_search_update`.

RESET
     Reset  routines  reinitialize search state between runs and allow switching
     modes without leaking state. Use `r_search_begin`	before	starting  a  new
     search pass if you want to preserve keywords but clear per-search counters;
     use `r_search_kw_reset` to remove all keywords.

     void r_search_reset(RSearch *s, int mode)

     Reset the context and set a new `mode`. This clears hit counters and recon-
     figures internal handlers.

     void r_search_kw_reset(RSearch *s)

     Remove  all  keywords  and  clear	any stored leftover buffers used by some
     search algorithms.

PATTERNS
     Pattern settings control heuristics such as pattern size  used  for  block-
     similarity  searches  and	delta/differential  searches.  Adjust these when
     searching for repetitive or structured data blocks.

     void r_search_pattern_size(RSearch *s, int size)

     Set the pattern size used by pattern-based search algorithms.

EXAMPLES
     The examples below illustrate realistic usage patterns found in core  code:
     creating keywords from prelude hex strings, searching entire mapped regions
     and collecting hits via a callback.

     1) Simple keyword search returning a list

	   RSearch *s = r_search_new (R_SEARCH_KEYWORD);
	   RSearchKeyword *kw = r_search_keyword_new_str ("password", NULL, NULL, false);
	   if (!r_search_kw_add (s, kw)) { /* handle error */ }
	   // Convenience: r_search_find collects hits into a new RList using an internal callback
	   RList *hits = r_search_find (s, 0x1000, buffer, 1024);
	   // iterate `hits` and free it when done

     2) Using a callback to stream hits (pattern from core: `listcb`)

	   static int listcb(RSearchKeyword *k, void *user, ut64 addr) {
	       RSearchHit *hit = R_NEW0 (RSearchHit);
	       if (!hit) { return 0; }
	       hit->kw = k; hit->addr = addr; r_list_append (user, hit);
	       return 1;
	   }

	   RSearch *s = r_search_new (R_SEARCH_KEYWORD);
	   // add keywords...
	   r_search_set_callback (s, listcb, my_hits_list);
	   r_search_update_read (s, map_from, map_to);

     3)  Searching  entire  IO	maps (as `r_search_maps` does in the interactive
     command)

	   // prepare search context and keywords
	   int rc = r_search_maps (s, core->io->maps);
	   // `r_search_maps` calls `r_search_update_read` for each mapped region

     4) Building preludes from architecture session data (used	by  `r_anal_pre-
     ludes`)

	   // r_anal_preludes builds a RList of RSearchKeyword* with `r_search_keyword_new_hexstr`:
	   RList *preludes = r_anal_preludes (anal);
	   // then keywords are appended to a search context to match known function entry patterns

     5) String extraction and limits

	   r_search_set_mode (s, R_SEARCH_STRING);
	   r_search_set_string_limits (s, 4, 256);
	   r_search_update_read (s, base, base + size);

SEE ALSO
     r_io(3), r_core(3)

FreeBSD ports 15.quarterly     September 20, 2025		     R_SEARCH(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=r_search&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help