rev.ng logo

Next-gen decompiler.

Modern UI. Automatic struct detection. Declarative. Easily scriptable. Collaborative by design. Open source.

Data structures recovery

Automatic, interprocedural
data structure recovery

rev.ng auto-detects arrays, structs and unions for you.

Others
1__int64 __fastcall sum(__int64 a1)
2{
3  __int64 v1; // rcx
4  __int64 result; // rax
5
6  v1 = 0LL;
7  result = 0LL;
8  do
9    result += *(_QWORD *)(a1 + 8 * v1++);
10  while ( v1 != 5 );
11  return result;
12}
13
rev.ng
1typedef struct _PACKED {
2  generic64_t _offset_0[5];
3  _struct_1876 *_offset_40;
4} _struct_1876;
5
6_ABI(SystemV_x86_64)
7generic64_t sum(_struct_1876 *_arg_0) {
8  generic64_t _var_0 = 0, _var_1 = 0;
9  do {
10    _var_0 = _var_0 + _arg_0->_offset_0[_var_1];
11    _var_1 = _var_1 + 1;
12  } while (_var_1 != 5);
13  return _var_0;
14}
15
Features you will love

Easily integrate it
in your workflow

Declarative

Simple YAML file format easily processable in your language of choice

Can parse YAML? Then you can define new functions, edit prototypes and rename anything.

Read documentation

1Architecture:    x86_64
2DefaultABI:      SystemV_x86_64
3Segments:
4  - StartAddress:    "0x400000:Generic64"
5    ...
6Functions:
7- Entry:           "0x400000:Code_x86_64"
8  CustomName:      Sum
9  Prototype:       "/Types/CABIFunctionType-1"
10Types:
11- Kind:            CABIFunctionType
12  ABI:             SystemV_x86_64
13  ID:              1
14  Arguments:
15    ...
16  ReturnType:
17    ...
18
VSCode-based UI

UI: VSCode-based.
In your browser or as a standalone app.

Cloud or standalone application, same user experience.

VSCode-based UI
Built-in collaboration

Collaborating is as simple as sharing a URL

One server, many clients. In the cloud too.

1Functions:
2- Entry:           "0x400000:Code_x86_64"
3  CustomName:      dunno
4- Entry:           "0x400100:Code_x86_64"
5  CustomName:      compute_square_root
6
1Functions:
2- Entry:           "0x400000:Code_x86_64"
3  CustomName:      compute_checksum
4- Entry:           "0x400100:Code_x86_64"
5  CustomName:      something_something
6

Want to know more?

Open source

1for (BasicBlock *Succ : successors(Current)) {
2  revng_log(Log, "Considering successor " << getName(Succ));
3  if (isa<ReturnInst>(Succ->getTerminator())) {
4    revng_log(Log, "It's a ret");
5    // Did we meet the end of the cloned function? Do nothing
6    revng_assert(Succ->size() == 1);
7  } else if (auto *Call = getCallTo(&*Succ->begin(),
8                                    PreCallHook.get())) {
9    // Handle edge for regular function calls
10    if (auto MaybeEdge = handleCall(Call); MaybeEdge) {
11      revng_log(Log, "It's a direct call, emitting a CallEdge");
12      Block.Successors().insert(*MaybeEdge);
13    }
14
  • LLVM

    rev.ng is heavily based on LLVM, the compiler framework behind clang, rustc and swiftc.

  • VSCode

    Our UI is based on VSCode, providing a familiar and modern UX.

  • Qemu

    We use QEMU to lift executable x86-64, AArch64, i386, ARM and MIPS code.

What's open?

The rev.ng decompilation pipeline is entirely Free Software.
The UI will be available commercially, both in the cloud and as standalone application.

See all features included

Community

Join the conversation!

Connect with other users and share your feedback and projects.

Discourse

Discourse

The place for asking question, giving feedback and reporting problems.

Join the discussion

Discord

Discord

Wanna chat with us directly? Join our server!

Join our server

Discorse

X (was: Twitter)

X (was: Twitter) is the best way to get the latest news about the project.

Follow us

E-mail

E-mail

Want to get in touch directly? Drop us an e-mail.

Write us

Register to the UI closed beta!

Want to try the UI? We're now inviting people on a FIFO basis.