mirror of
https://github.com/thunderbrewhq/binana.git
synced 2025-12-12 09:52:28 +00:00
feat(profile): binana x64dbg-gen now generates a types file from C source headers
This commit is contained in:
parent
e3ec21ecec
commit
5d5630a6cb
19 changed files with 2961 additions and 354 deletions
66
go/profile/x64dbg_generate_database.go
Normal file
66
go/profile/x64dbg_generate_database.go
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
package profile
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/thunderbrewhq/binana/go/symfile"
|
||||
"github.com/thunderbrewhq/binana/go/x64dbg"
|
||||
)
|
||||
|
||||
func hex_address(u uint64) string {
|
||||
return fmt.Sprintf("0x%x", u)
|
||||
}
|
||||
|
||||
func (profile *Profile) generate_x64dbg_database(module_name string, base_address uint64) (err error) {
|
||||
// Convert symbol table into x64dbg database
|
||||
var dd x64dbg.Database
|
||||
|
||||
for _, entry := range profile.SymbolTable.Entries {
|
||||
relative_start_address := entry.StartAddress - base_address
|
||||
relative_end_address := relative_start_address
|
||||
|
||||
if entry.EndAddress != 0 {
|
||||
relative_end_address = entry.EndAddress - base_address
|
||||
// for x64dbg, the end address is the last instruction.
|
||||
// for us, the end address is the address immediately after the last instruction.
|
||||
relative_end_address -= 1
|
||||
}
|
||||
|
||||
if relative_end_address < relative_start_address || relative_end_address-relative_start_address >= 10000 {
|
||||
fmt.Printf("Strange symbol %s %08x %08x (offset %d)\n", entry.Name, relative_start_address, relative_end_address, relative_end_address-relative_start_address)
|
||||
}
|
||||
|
||||
// create label
|
||||
var label x64dbg.Label
|
||||
label.Manual = true
|
||||
label.Address = hex_address(relative_start_address)
|
||||
label.Text = entry.Name
|
||||
label.Module = module_name
|
||||
dd.Labels = append(dd.Labels, label)
|
||||
|
||||
if entry.Kind == symfile.Function {
|
||||
var fn x64dbg.Function
|
||||
fn.Manual = true
|
||||
fn.Start = hex_address(relative_start_address)
|
||||
fn.End = hex_address(relative_end_address)
|
||||
|
||||
fn.Module = module_name
|
||||
|
||||
fn.InstructionCount = hex_address(0)
|
||||
fn.Parent = hex_address(relative_start_address)
|
||||
|
||||
dd.Functions = append(dd.Functions, fn)
|
||||
}
|
||||
}
|
||||
|
||||
// save database
|
||||
dd_path := filepath.Join(profile.Directory, "x32dbg", "game.dd32")
|
||||
if err = x64dbg.SaveDatabase(dd_path, &dd); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Println("database generated!", dd_path)
|
||||
|
||||
return
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue