'\" t .\" Title: compel .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets vsnapshot .\" Date: 08/05/2023 .\" Manual: CRIU Manual .\" Source: criu 3.17.1 .\" Language: English .\" .TH "COMPEL" "1" "08/05/2023" "criu 3\&.17\&.1" "CRIU Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * (re)Define some macros .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" toupper - uppercase a string (locale-aware) .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .de toupper .tr aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ \\$* .tr aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz .. .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" SH-xref - format a cross-reference to an SH section .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .de SH-xref .ie n \{\ .\} .toupper \\$* .el \{\ \\$* .\} .. .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" SH - level-one heading that works better for non-TTY output .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .de1 SH .\" put an extra blank line of space above the head in non-TTY output .if t \{\ .sp 1 .\} .sp \\n[PD]u .nr an-level 1 .set-an-margin .nr an-prevailing-indent \\n[IN] .fi .in \\n[an-margin]u .ti 0 .HTML-TAG ".NH \\n[an-level]" .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 \." make the size of the head bigger .ps +3 .ft B .ne (2v + 1u) .ie n \{\ .\" if n (TTY output), use uppercase .toupper \\$* .\} .el \{\ .nr an-break-flag 0 .\" if not n (not TTY), use normal case (not uppercase) \\$1 .in \\n[an-margin]u .ti 0 .\" if not n (not TTY), put a border/line under subheading .sp -.6 \l'\n(.lu' .\} .. .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" SS - level-two heading that works better for non-TTY output .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .de1 SS .sp \\n[PD]u .nr an-level 1 .set-an-margin .nr an-prevailing-indent \\n[IN] .fi .in \\n[IN]u .ti \\n[SN]u .it 1 an-trap .nr an-no-space-flag 1 .nr an-break-flag 1 .ps \\n[PS-SS]u \." make the size of the head bigger .ps +2 .ft B .ne (2v + 1u) .if \\n[.$] \&\\$* .. .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" BB/EB - put background/screen (filled box) around block of text .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .de BB .if t \{\ .sp -.5 .br .in +2n .ll -2n .gcolor red .di BX .\} .. .de EB .if t \{\ .if "\\$2"adjust-for-leading-newline" \{\ .sp -1 .\} .br .di .in .ll .gcolor .nr BW \\n(.lu-\\n(.i .nr BH \\n(dn+.5v .ne \\n(BHu+.5v .ie "\\$2"adjust-for-leading-newline" \{\ \M[\\$1]\h'1n'\v'+.5v'\D'P \\n(BWu 0 0 \\n(BHu -\\n(BWu 0 0 -\\n(BHu'\M[] .\} .el \{\ \M[\\$1]\h'1n'\v'-.5v'\D'P \\n(BWu 0 0 \\n(BHu -\\n(BWu 0 0 -\\n(BHu'\M[] .\} .in 0 .sp -.5v .nf .BX .in .sp .5v .fi .\} .. .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" BM/EM - put colored marker in margin next to block of text .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .de BM .if t \{\ .br .ll -2n .gcolor red .di BX .\} .. .de EM .if t \{\ .br .di .ll .gcolor .nr BH \\n(dn .ne \\n(BHu \M[\\$1]\D'P -.75n 0 0 \\n(BHu -(\\n[.i]u - \\n(INu - .75n) 0 0 -\\n(BHu'\M[] .in 0 .nf .BX .in .fi .\} .. .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "Name" compel \- Execute parasitic code within another process\&. .SH "Synopsis" .sp \fBcompel\fR \fIhgen\fR [\fIoption\fR \&...] .sp \fBcompel\fR \fIplugins\fR [\fIPLUGIN_NAME\fR \&...] .sp \fBcompel\fR [\fI\-\-compat\fR] \fIincludes\fR | \fIcflags\fR | \fIldflags\fR .sp \fBcompel\fR [\fI\-\-compat\fR] [\fI\-\-static\fR] \fIlibs\fR .SH "DESCRIPTION" .sp \fBcompel\fR is a utility to execute arbitrary code, also called parasite code, in the context of a foreign process\&. The parasitic code, once compiled with compel flags and packed, can be executed in the context of other tasks\&. Currently there is only one way to load the parasitic blob into victim task using libcompel\&.a, called c\-header\&. .SH "ARGUMENTS" .SS "Positional Arguments" .PP \fBhgen\fR .RS 4 create a header from the \&.po file, which is the parasite binary\&. .RE .PP \fBplugins\fR .RS 4 prints the plugins available\&. .RE .PP \fBldflags\fR .RS 4 prints the ldflags available to compel during linking of parasite code\&. .RE .PP \fBcflags\fR .RS 4 prints the compel cflags to be used during compilation of parasitic code\&. .RE .PP \fBincludes\fR .RS 4 prints list of standard include directories\&. .RE .PP \fBlibs\fR .RS 4 prints list of static or dynamic libraries that compel can link with\&. .RE .SH "OPTIONS" .PP \fB\-f\fR, \fB\-\-file\fR \fIFILE\fR .RS 4 Path to the binary file, \fIFILE\fR, which \fBcompel\fR must turn into a header .RE .PP \fB\-o\fR, \fB\-\-output\fR \fIFILE\fR .RS 4 Path to the header file, \fIFILE\fR, where compel must write the resulting header\&. .RE .PP \fB\-p\fR, \fB\-\-prefix\fR \fINAME\fR .RS 4 Specify prefix for var names .RE .PP \fB\-l\fR, \fB\-\-log\-level\fR \fINUM\fR .RS 4 Default log level of compel\&. .RE .PP \fB\-h\fR, \fB\-\-help\fR .RS 4 Prints usage and exits\&. .RE .PP \fB\-V\fR, \fB\-\-version\fR .RS 4 Prints version number of compel\&. .RE .SH "SOURCE EXAMPLES" .SS "Parasitic Code" .sp \fB#include \fR .sp \fBint parasite_trap_cmd(int cmd, void *args);\fR //gets called by compel_run_in_thread() .sp \fBint parasite_daemon_cmd(int cmd, void *arg);\fR // gets called by compel_rpc_call() and compel_rpc_call_sync() .sp \fBvoid parasite_cleanup(void);\fR //gets called on parasite unload by compel_cure() .SS "Infecting code" .sp The parasitic code is compiled and converted to a header using \fBcompel\fR, and included here\&. .sp \fB#include \fR .sp \fB#include "parasite\&.h"\fR .sp Following steps are performed to infect the victim process: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} stop the task: \fBint compel_stop_task(int pid);\fR .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} prepare infection handler: \fBstruct parasite_ctl *compel_prepare(int pid);\fR .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} execute system call: \fBint compel_syscall(ctl, int syscall_nr, long *ret, int arg \&...);\fR .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} infect victim: \fBint compel_infect(ctl, nr_thread, size_of_args_area);\fR .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} cure the victim: \fBint compel_cure(ctl);\fR //ctl pointer is freed by this call .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} Resume victim: \fBint compel_resume_task(pid, orig_state, state);\fR .RE .sp \fBctl\fR must be configured with blob information by calling \fBPREFIX_setup_c_header()\fR, with ctl as its argument\&. \fBPREFIX\fR is the argument given to \fB\-p\fR when calling hgen, else it is deduced from file name\&. .SH "EXAMPLES" .sp To generate a header file(\&.h) from a parasite binary file(\&.po) use: .sp .if n \{\ .RS 4 .\} .fam C .ps -1 .nf .BB lightgray compel hgen \-f parasite\&.po \-o parasite\&.h .EB lightgray .fi .fam .ps +1 .if n \{\ .RE .\} .sp \fIparasite\&.po\fR file is obtained by compiling the parasite source with compel flags and linking it with the compel plugins\&. .SH "AUTHOR" .sp The CRIU team\&.