8 Commits
6 changed files with 118 additions and 73 deletions

No files matched your search

+63 -8
View File
@@ -1,5 +1,8 @@
name: CI
env:
R2V: 6.2.2
on:
push:
branches:
@@ -25,11 +28,13 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7
- name: Install radare2
id: r2
uses: radareorg/github-actions@v3
with:
version: ${{ env.R2V }}
- name: Build
run: make
@@ -46,11 +51,13 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7
- name: Install radare2
id: r2
uses: radareorg/github-actions@v3
with:
version: ${{ env.R2V }}
- name: Install deps
run: pip install meson ninja --break-system-packages
@@ -69,7 +76,7 @@ jobs:
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7
- name: Install radare2 from git
id: r2
@@ -89,7 +96,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7
with:
fetch-depth: 0
@@ -99,6 +106,8 @@ jobs:
- name: Install radare2
id: r2
uses: radareorg/github-actions@v3
with:
version: ${{ env.R2V }}
- name: Build Debian package
run: make -C dist/debian SUDO=
@@ -119,7 +128,7 @@ jobs:
uses: actions/checkout@v6
- name: Setup Python
uses: actions/setup-python@v6
uses: actions/setup-python@v7
with:
python-version: 3.12.x
@@ -134,6 +143,8 @@ jobs:
- name: Install radare2
id: r2
uses: radareorg/github-actions@v3
with:
version: ${{ env.R2V }}
- name: Configure
run: meson setup build-windows --buildtype=release -Dplugins=enabled
@@ -166,11 +177,47 @@ jobs:
Compress-Archive -Path "$package\*" -DestinationPath $archive -Force
"archive=$archive" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append
- name: Package r2pm binary
shell: pwsh
run: |
New-Item -ItemType Directory -Force -Path bindist\plugins,bindist\bin | Out-Null
Copy-Item build-windows\core_r2unity.dll,build-windows\bin_r2unity.dll bindist\plugins
Copy-Item build-windows\r2unity.exe bindist\bin
Compress-Archive -Path bindist\* -DestinationPath "r2unity-$env:R2V-windows-x86-64.zip" -Force
- name: Upload Windows package artifact
uses: actions/upload-artifact@v7
with:
name: windows-package
path: ${{ steps.package.outputs.archive }}
path: |
${{ steps.package.outputs.archive }}
r2unity-*-windows-x86-64.zip
if-no-files-found: error
bindist:
name: Build r2pm binary (${{ matrix.os }})
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, ubuntu-24.04-arm, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Install radare2
uses: radareorg/github-actions@v3
with:
version: ${{ env.R2V }}
- name: Package r2pm binary
run: make bindist
- name: Upload r2pm binary artifact
uses: actions/upload-artifact@v7
with:
name: bindist-${{ matrix.os }}
path: r2unity-*.zip
if-no-files-found: error
release:
@@ -181,12 +228,13 @@ jobs:
- meson
- debian
- windows
- bindist
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7
with:
fetch-depth: 0
@@ -203,11 +251,18 @@ jobs:
name: windows-package
path: dist/artifacts
- name: Download r2pm binary artifacts
uses: actions/download-artifact@v8
with:
pattern: bindist-*
path: dist/artifacts
merge-multiple: true
- name: Generate release notes
run: ./release.sh notes > release-notes.md
- name: Create GitHub release
uses: softprops/[email protected].0
uses: softprops/[email protected].3
with:
name: ${{ github.ref_name }}
tag_name: ${{ github.ref_name }}
+3
View File
@@ -22,3 +22,6 @@
# Third-party reference checkouts (radare2, il2cpp dumper, etc.)
/third_party/
# r2pm binary packages
/r2unity-*.zip
+9 -1
View File
@@ -66,6 +66,14 @@ user-install: install-plugin
user-uninstall: uninstall-plugin
rm -f "$(R2PM_BINDIR)/$(EXEC)"
# Binary package for r2pm -bi: plugins/ and bin/ for this r2 version and platform
BINDIST_ZIP = r2unity-$(shell r2 -qv)-$(shell r2pm -H R2PM_OS)-$(shell r2pm -H R2PM_ARCH)-$(shell r2pm -H R2PM_BITS).zip
bindist: $(EXEC) $(PLUGINS)
rm -rf build/bindist $(BINDIST_ZIP)
$(MAKE) user-install R2_USER_PLUGINS=$(CURDIR)/build/bindist/plugins R2PM_BINDIR=$(CURDIR)/build/bindist/bin
cd build/bindist && zip -r $(CURDIR)/$(BINDIST_ZIP) plugins bin
$(EXEC): $(OBJS)
$(CC) -o $@ $^ $(LDFLAGS)
@@ -88,4 +96,4 @@ clean:
rm -f $(EXEC) $(OBJS) $(LEGACY_OBJS) $(PLUGINS) $(CONFIG_H)
.PHONY: all clean plugin install-plugin uninstall-plugin fmt
.PHONY: all clean plugin install-plugin uninstall-plugin fmt bindist
+1 -1
View File
@@ -1,7 +1,7 @@
project(
'r2unity',
'c',
version: '1.2.6',
version: '1.2.8',
default_options: [
'c_std=c99',
'warning_level=2',
+17 -7
View File
@@ -30,6 +30,10 @@ static void elf_write_word(ut8 *p, ut64 v, bool is64) {
}
}
static bool elf_range_in_file(const ElfImg *e, ut64 off, ut64 size) {
return size <= e->size && off <= e->size - size;
}
static bool elf_load(const char *path, ElfImg *e) {
memset (e, 0, sizeof (*e));
size_t size = 0;
@@ -58,13 +62,16 @@ static bool elf_load(const char *path, ElfImg *e) {
if (type != 1 && type != 2) {
continue;
}
ElfSeg *s = &e->segs[e->nsegs++];
ElfSeg *s = &e->segs[e->nsegs];
s->type = type;
s->flags = r_read_le32 (ph + 4);
s->offset = r_read_le64 (ph + 8);
s->vaddr = r_read_le64 (ph + 16);
s->filesz = r_read_le64 (ph + 32);
s->memsz = r_read_le64 (ph + 40);
if (s->filesz && elf_range_in_file (e, s->offset, s->filesz)) {
e->nsegs++;
}
}
} else {
ut32 phoff = r_read_le32 (e->file + 0x1c);
@@ -80,13 +87,16 @@ static bool elf_load(const char *path, ElfImg *e) {
if (type != 1 && type != 2) {
continue;
}
ElfSeg *s = &e->segs[e->nsegs++];
ElfSeg *s = &e->segs[e->nsegs];
s->type = type;
s->offset = r_read_le32 (ph + 4);
s->vaddr = r_read_le32 (ph + 8);
s->filesz = r_read_le32 (ph + 16);
s->memsz = r_read_le32 (ph + 20);
s->flags = r_read_le32 (ph + 24);
if (s->filesz && elf_range_in_file (e, s->offset, s->filesz)) {
e->nsegs++;
}
}
}
return true;
@@ -104,7 +114,7 @@ static const ut8 *elf_ptr_at_size(ElfImg *e, ut64 va, ut64 size) {
continue;
}
ut64 delta = va - s->vaddr;
if (delta + size <= s->filesz && s->offset + delta + size <= e->size) {
if (size <= s->filesz && delta <= s->filesz - size && elf_range_in_file (e, s->offset + delta, size)) {
return e->file + s->offset + delta;
}
return NULL;
@@ -170,7 +180,7 @@ static void elf_apply_relocs(ElfImg *e, ut64 base) {
break;
}
}
if (!dyn_off || !dyn_sz || dyn_off + dyn_sz > e->size) {
if (!dyn_off || !dyn_sz || !elf_range_in_file (e, dyn_off, dyn_sz)) {
return;
}
ut64 rela_off = 0, rela_sz = 0, rela_ent = e->is64? 24: 12;
@@ -198,7 +208,7 @@ static void elf_apply_relocs(ElfImg *e, ut64 base) {
}
}
const ut64 type_mask = e->is64? 0xffffffffULL: 0xffULL;
for (ut64 i = 0; rela_off && rela_ent && i + rela_ent <= rela_sz; i += rela_ent) {
for (ut64 i = 0; rela_off && rela_ent == (e->is64? 24: 12) && i + rela_ent <= rela_sz; i += rela_ent) {
const ut8 *rp = elf_ptr_at_size (e, rela_off + i, rela_ent);
if (!rp) {
break;
@@ -214,7 +224,7 @@ static void elf_apply_relocs(ElfImg *e, ut64 base) {
}
}
}
for (ut64 i = 0; rel_off && rel_ent && i + rel_ent <= rel_sz; i += rel_ent) {
for (ut64 i = 0; rel_off && rel_ent == (e->is64? 16: 8) && i + rel_ent <= rel_sz; i += rel_ent) {
const ut8 *rp = elf_ptr_at_size (e, rel_off + i, rel_ent);
if (!rp) {
break;
@@ -230,7 +240,7 @@ static void elf_apply_relocs(ElfImg *e, ut64 base) {
}
}
}
if (!e->is64 || !relr_off || !relr_sz || !relr_ent) {
if (!e->is64 || !relr_off || !relr_sz || relr_ent != 8) {
return;
}
ut64 curr = 0;
+25 -56
View File
@@ -189,15 +189,10 @@ static void fill_metadata_sdb(R2UnityBinObj *obj) {
if (!name) {
continue;
}
char key[192];
snprintf (key, sizeof (key), "sections.%s.offset", name);
sdb_num_set (kv, key, sec.offset, 0);
snprintf (key, sizeof (key), "sections.%s.size", name);
sdb_num_set (kv, key, sec.size, 0);
snprintf (key, sizeof (key), "sections.%s.count", name);
sdb_num_set (kv, key, r2unity_metadata_section_count (meta, (R2UMetadataSectionId)i), 0);
snprintf (key, sizeof (key), "sections.%s.entry_size", name);
sdb_num_set (kv, key, r2unity_metadata_section_entry_size (meta, (R2UMetadataSectionId)i), 0);
sdb_num_setf (kv, sec.offset, 0, "sections.%s.offset", name);
sdb_num_setf (kv, sec.size, 0, "sections.%s.size", name);
sdb_num_setf (kv, r2unity_metadata_section_count (meta, (R2UMetadataSectionId)i), 0, "sections.%s.count", name);
sdb_num_setf (kv, r2unity_metadata_section_entry_size (meta, (R2UMetadataSectionId)i), 0, "sections.%s.entry_size", name);
}
sdb_num_set (kv, "counts.types", r2unity_metadata_section_count (meta, R2U_SEC_TYPE_DEFINITIONS), 0);
sdb_num_set (kv, "counts.methods", r2unity_metadata_section_count (meta, R2U_SEC_METHODS), 0);
@@ -225,40 +220,26 @@ static void fill_serialized_file_sdb(R2UnityBinObj *obj) {
sdb_num_set (kv, "counts.scripts", sf->script_count, 0);
sdb_num_set (kv, "counts.externals", sf->external_count, 0);
for (size_t i = 0; i < sf->external_count; i++) {
char key[128];
snprintf (key, sizeof (key), "externals.%zu.path", i);
sdb_set (kv, key, sf->externals[i].path, 0);
sdb_setf (kv, sf->externals[i].path, 0, "externals.%zu.path", i);
}
for (size_t i = 0; i < sf->object_count; i++) {
R2UnitySerializedObject *asset = &sf->objects[i];
char key[128];
snprintf (key, sizeof (key), "objects.%zu.path_id", i);
sdb_num_set (kv, key, (ut64)asset->path_id, 0);
snprintf (key, sizeof (key), "objects.%zu.class_id", i);
sdb_num_set (kv, key, (ut64)(st64)asset->class_id, 0);
snprintf (key, sizeof (key), "objects.%zu.class", i);
sdb_set (kv, key, r2unity_serialized_class_name (asset->class_id), 0);
snprintf (key, sizeof (key), "objects.%zu.offset", i);
sdb_num_set (kv, key, asset->offset, 0);
snprintf (key, sizeof (key), "objects.%zu.size", i);
sdb_num_set (kv, key, asset->size, 0);
sdb_num_setf (kv, (ut64)asset->path_id, 0, "objects.%zu.path_id", i);
sdb_num_setf (kv, (ut64)(st64)asset->class_id, 0, "objects.%zu.class_id", i);
sdb_setf (kv, r2unity_serialized_class_name (asset->class_id), 0, "objects.%zu.class", i);
sdb_num_setf (kv, asset->offset, 0, "objects.%zu.offset", i);
sdb_num_setf (kv, asset->size, 0, "objects.%zu.size", i);
if (asset->name) {
snprintf (key, sizeof (key), "objects.%zu.name", i);
sdb_set (kv, key, asset->name, 0);
sdb_setf (kv, asset->name, 0, "objects.%zu.name", i);
}
if (asset->payload_size) {
snprintf (key, sizeof (key), "objects.%zu.payload.offset", i);
sdb_num_set (kv, key, asset->payload_offset, 0);
snprintf (key, sizeof (key), "objects.%zu.payload.size", i);
sdb_num_set (kv, key, asset->payload_size, 0);
sdb_num_setf (kv, asset->payload_offset, 0, "objects.%zu.payload.offset", i);
sdb_num_setf (kv, asset->payload_size, 0, "objects.%zu.payload.size", i);
}
if (asset->stream_path) {
snprintf (key, sizeof (key), "objects.%zu.stream.path", i);
sdb_set (kv, key, asset->stream_path, 0);
snprintf (key, sizeof (key), "objects.%zu.stream.offset", i);
sdb_num_set (kv, key, asset->stream_offset, 0);
snprintf (key, sizeof (key), "objects.%zu.stream.size", i);
sdb_num_set (kv, key, asset->stream_size, 0);
sdb_setf (kv, asset->stream_path, 0, "objects.%zu.stream.path", i);
sdb_num_setf (kv, asset->stream_offset, 0, "objects.%zu.stream.offset", i);
sdb_num_setf (kv, asset->stream_size, 0, "objects.%zu.stream.size", i);
}
}
}
@@ -278,23 +259,15 @@ static void fill_bgdatabase_sdb(R2UnityBinObj *obj) {
sdb_num_set (kv, "counts.strings", db->string_count, 0);
for (size_t i = 0; i < db->addon_count; i++) {
R2UnityBGDatabaseAddon *addon = &db->addons[i];
char key[128];
snprintf (key, sizeof (key), "addons.%zu.type", i);
sdb_set (kv, key, addon->type, 0);
snprintf (key, sizeof (key), "addons.%zu.payload.offset", i);
sdb_num_set (kv, key, addon->payload_offset, 0);
snprintf (key, sizeof (key), "addons.%zu.payload.size", i);
sdb_num_set (kv, key, addon->payload_size, 0);
sdb_setf (kv, addon->type, 0, "addons.%zu.type", i);
sdb_num_setf (kv, addon->payload_offset, 0, "addons.%zu.payload.offset", i);
sdb_num_setf (kv, addon->payload_size, 0, "addons.%zu.payload.size", i);
}
for (size_t i = 0; i < db->table_count; i++) {
R2UnityBGDatabaseTable *table = &db->tables[i];
char key[128];
snprintf (key, sizeof (key), "tables.%zu.offset", i);
sdb_num_set (kv, key, table->offset, 0);
snprintf (key, sizeof (key), "tables.%zu.size", i);
sdb_num_set (kv, key, table->size, 0);
snprintf (key, sizeof (key), "tables.%zu.fields", i);
sdb_num_set (kv, key, table->field_count, 0);
sdb_num_setf (kv, table->offset, 0, "tables.%zu.offset", i);
sdb_num_setf (kv, table->size, 0, "tables.%zu.size", i);
sdb_num_setf (kv, table->field_count, 0, "tables.%zu.fields", i);
}
}
@@ -308,13 +281,9 @@ static void fill_resource_pack_sdb(R2UnityBinObj *obj) {
sdb_num_set (kv, "counts.resources", pack->entry_count, 0);
for (size_t i = 0; i < pack->entry_count; i++) {
R2UnityResourcePackEntry *entry = &pack->entries[i];
char key[128];
snprintf (key, sizeof (key), "resources.%zu.name", i);
sdb_set (kv, key, entry->name, 0);
snprintf (key, sizeof (key), "resources.%zu.offset", i);
sdb_num_set (kv, key, entry->payload_offset, 0);
snprintf (key, sizeof (key), "resources.%zu.payload_size", i);
sdb_num_set (kv, key, entry->payload_size, 0);
sdb_setf (kv, entry->name, 0, "resources.%zu.name", i);
sdb_num_setf (kv, entry->payload_offset, 0, "resources.%zu.offset", i);
sdb_num_setf (kv, entry->payload_size, 0, "resources.%zu.payload_size", i);
}
}