Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Documentation: Create man page for libcompel #724

Merged
merged 1 commit into from
Jul 1, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Documentation/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ endif

FOOTER := footer.txt
SRC1 += crit.txt
SRC1 += compel.txt
SRC8 += criu.txt
SRC := $(SRC1) $(SRC8)
XMLS := $(patsubst %.txt,%.xml,$(SRC))
Expand Down
119 changes: 119 additions & 0 deletions Documentation/compel.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
COMPEL(1)
==========
include::footer.txt[]

NAME
----
compel - Execute parasitic code within another process.

SYNOPSIS
--------
*compel* 'hgen' ['option' ...]

*compel* 'plugins' ['PLUGIN_NAME' ...]

*compel* ['--compat'] 'includes' | 'cflags' | 'ldflags'

*compel* ['--compat'] ['--static'] 'libs'

DESCRIPTION
------------
*compel* 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.

ARGUMENTS
----------

Positional Arguments
~~~~~~~~~~~~~~~~~~~~

*hgen*::
create a header from the .po file, which is the parasite binary.

*plugins*::
prints the plugins available.

*ldflags*::
prints the ldflags available to compel during linking of parasite code.

*cflags*::
prints the compel cflags to be used during compilation of parasitic code.

*includes*::
prints list of standard include directories.

*libs*::
prints list of static or dynamic libraries that compel can link with.

OPTIONS
--------
*-f*, *--file* 'FILE'::
Path to the binary file, 'FILE', which *compel* must turn into a header

*-o*, *--output* 'FILE'::
Path to the header file, 'FILE', where compel must write the resulting header.

*-p*, *--prefix* 'NAME'::
Specify prefix for var names

*-l*, *--log-level* 'NUM'::
Default log level of compel.

*-h*, *--help*::
Prints usage and exits.

*-V*, *--version*::
Prints version number of compel.

SOURCE EXAMPLES
----------------

Parasitic Code
~~~~~~~~~~~~~~

*#include <compel/plugins/std.h>*

*int parasite_trap_cmd(int cmd, void *args);* //gets called by compel_run_in_thread()

*int parasite_daemon_cmd(int cmd, void *arg);* // gets called by compel_rpc_call() and compel_rpc_call_sync()

*void parasite_cleanup(void);* //gets called on parasite unload by compel_cure()

Infecting code
~~~~~~~~~~~~~~
The parasitic code is compiled and converted to a header using *compel*, and included here.

*#include <compel/compel.h>*

*#include "parasite.h"*

Following steps are perfomed to infect the victim process:

- stop the task: *int compel_stop_task(int pid);*
- prepare infection handler: *struct parasite_ctl *compel_prepare(int pid);*
- execute system call: *int compel_syscall(ctl, int syscall_nr, long *ret, int arg ...);*
- infect victim: *int compel_infect(ctl, nr_thread, size_of_args_area);*
- cure the victim: *int compel_cure(ctl);* //ctl pointer is freed by this call
- Resume victim: *int compel_resume_task(pid, orig_state, state);*

*ctl* must be configured with blob information by calling *PREFIX_setup_c_header()*, with ctl as its argument.
*PREFIX* is the argument given to *-p* when calling hgen, else it is deduced from file name.


EXAMPLES
---------
To generate a header file(.h) from a parasite binary file(.po) use:

----------
compel hgen -f parasite.po -o parasite.h
----------

'parasite.po' file is obtained by compiling the parasite source with compel flags and
linking it with the compel plugins.

AUTHOR
------
The CRIU team.