Перейти к содержанию
    

Как добавить в исполняемый ELF дополнительную загружаемую секцию?

Ковыряю дизассемблером исполняемую программу из недорогого тепловизора HT-1A. Производитель сильно облегчил это дело, оставив всю отладочную информацию в программе :)

Ковыряю для того, чтобы немного улучшить и изменить интерфейс. И столкнулся с тем, что в некоторых моментах мне нужно не просто изменить байты в теле программы, а добавить их. Естественно, просто вставить их нельзя - полетят к чертям все ссылки на код и данные. Поэтому пришла мне в голову мысль добавить в конец файла килобайт 10, добавить в таблицу заголовков программы еще один, загружаемый в из этих 10 кб, и в этих 10 кб уже дописывать какие-то свои моменты, при необходимости прыгая на них из оригинального кода.

Можно ли это сделать и если можно, то как? Что-то все мои попытки приводят к неработоспособности файла. Пока я пытался изменить заголовок NOTE на LOAD, пытаясь загрузить небольшой кусок этого файла в память по адресу, следующему за последним используемым программой :( Пока я не назначаю ему тип LOAD и не определяю адреса загрузки - файл работает, даже если я меняю его на NULL. То есть сам этот заголовок NOTE файлу для работы не нужен, как и секции, определенный в его адресах - .note.ABI-tag и .note.gnu.build-id

При запуске измененного файла ОС тепловизора просто выдает сообщение Killed без подробностей. Системные логи, насколько я понял, не ведутся.

[root@dragonboard ]# /work/app/ht-a1 -v 2
Killed
[root@dragonboard ]#

Система основана на Busybox v1.22.1.

Вот лог загрузки, если это может помочь:

Spoiler

HELLO! BOOT0 is starting!
boot0 version : 3.1.0
reg_addr 0x01f00100 =0x00000000
reg_addr 0x01f00104 =0x00000000
reg_addr 0x01f00108 =0x00000000
reg_addr 0x01f0010c =0x00000000
reg_addr 0x01f00110 =0x00000000
reg_addr 0x01f00114 =0x00000000
DRAM DRIVE INFO: V1.5
DRAM CLK =552 MHZ
DRAM simple test OK.
dram size =512
card boot number = 2
card no is 2
sdcard 2 line count 0
[mmc]: mmc driver ver 2014-07-07 16:54
[mmc]: ***Try SD card 2***
[mmc]: mmc 2 cmd 8 timeout, err 0x00000100
[mmc]: mmc 2 cmd 8 err 0x00000100
[mmc]: mmc 2 send if cond failed
[mmc]: mmc 2 cmd 55 timeout, err 0x00000100
[mmc]: mmc 2 cmd 55 err 0x00000100
[mmc]: mmc 2 send app cmd failed
[mmc]: ***Try MMC card 2***
[mmc]: MMC ver 4.5
[mmc]: SD/MMC Card: 4bit, capacity: 3728MB
[mmc]: vendor: Man 0x0090014a Snr 0x011932c4
[mmc]: product: H4G2a
[mmc]: revision: 1.1
[mmc]: ***SD/MMC 2 init OK!!!***
sdcard 2 init ok
The size of uboot is 0x000bc000.
sum=0x0ccccd69
src_sum=0x0ccccd69
set_mmc_para,sdly 50M 0
set_mmc_para,sdly 25M 0
Succeed in loading uboot from sdmmc flash.
Ready to disable icache.
Jump to secend Boot.
[      0.335]

U-Boot 2011.09-rc1 (Jun 19 2018 - 20:01:23) Allwinner Technology

[      0.343]version: 1.1.0
[      0.428]pmbus:   ready
[      0.430]PMU: AXP221
[      0.432]PMU: AXP22x found
[      0.436]PMU: dcdc3 1200
[      0.439]PMU: pll1 1008 Mhz,PLL6=600 Mhz
AXI=336 Mhz,AHB=200 Mhz, APB1=100 Mhz
set power on vol to default
dcdc1_vol = 3000
dcdc2_vol = 1100
dcdc3_vol = 1200
dcdc4_vol = 0
dcdc5_vol = 1500
aldo2_vol = 2500
aldo3_vol = 3000
dldo1_vol = 3300
dldo2_vol = 3300
eldo1_vol = 3300
eldo2_vol = 3300
find power_sply to end
only battery exist, limit to dc
fel key old mode
run key detect
no key found
no key input
dram_para_set start
dram_para_set end
[      0.494]DRAM:  512 MiB
relocation Offset is: 15b11000
[PWM]backlight_bright=150,period_ns=20000,duty_ns=11718
smcl's set manager is NULL
workmode = 0
MMC:     2
[      0.697][mmc]: mmc driver ver 2014-07-15 17:16:00
[      0.702][mmc]: get sdc_2xmode ok, val = 1
[      0.706][mmc]: get sdc_f_max fail,use default sdc_f_max 50000000
[      0.712][mmc]: get card_line ok, card_line = 4
[      0.717][mmc]: get sdc_ex_dly_used fail,use default dly
[      0.722][mmc]: SUNXI SD/MMC: 2
[      0.726][mmc]: mmc 2 2xmode config clk
[      0.739][mmc]: ************Try SD card 2************
[      0.744][mmc]: mmc 2 cmd 8 timeout, err 100
[      0.749][mmc]: smc 2 err, cmd 8,  RTO
[      0.754][mmc]: mmc 2 mmc cmd 8 err 0x00000100
[      0.758][mmc]: mmc send if cond failed
[      0.762][mmc]: mmc 2 cmd 55 timeout, err 100
[      0.766][mmc]: smc 2 err, cmd 55,  RTO
[      0.772][mmc]: mmc 2 mmc cmd 55 err 0x00000100
[      0.776][mmc]: send app cmd failed
[      0.779][mmc]: ************Try MMC card 2************
LCD_panel_init
[      1.065][mmc]: mmc 2 2xmode config clk
[      1.079][mmc]: mmc 2 2xmode config clk
[      1.089][mmc]: mmc 2 2xmode config clk
[      1.098][mmc]: MID 000090 PSN 1932c44b
[      1.101][mmc]: PNM H4G2a -- 0x48-34-47-32-61-11
[      1.106][mmc]: PRV 0.1
[      1.109][mmc]: MDT m-8 y-2018
[      1.112][mmc]: MMC ver 4.5
[      1.115][mmc]: ---------------mmc->clock 50000000-----------
[      1.120][mmc]: ---------------mmc->bus_width 4--------------
[      1.126][mmc]: SD/MMC Card: 4bit, capacity: 3728MB
[      1.131][mmc]: boot0 capacity: 4000KB,boot1 capacity: 4000KB
[      1.137][mmc]: ************SD/MMC 2 init OK!!!************
[      1.144]sunxi flash init ok
In:    serial
Out:   serial
Err:   serial
--------fastboot partitions--------
-total partitions:7-
-name-        -start-       -size-
boot-res    : 1000000       1000000
env         : 2000000       1000000
boot        : 3000000       1000000
rootfs      : 4000000       20000000
data        : 24000000      1000000
sdcard      : 25000000      c0000000
UDISK       : e5000000      0
-----------------------------------
base bootcmd=run setargs_nand boot_normal
bootcmd set setargs_mmc
key 0
recovery key high 5, low 3
cant find fstbt value
no misc partition is found
misc_message->command = 0
to be run cmd=run setargs_mmc boot_normal
mount part name boot-res
cant open script.bin, maybe it is not exist
WORK_MODE_BOOT
board_status_probe
[      1.232]key trigger
sunxi_bmp_logo_display
[      1.250]Hit any key to stop autoboot:  0
bootcmd:run setargs_mmc boot_normal
mmc_pnm:PNM H4G2a
SanDisk EMMC is not detect!
--power_sply--
dcdc1_vol
read boot or recovery all
[      3.532]sunxi flash read :offset 3000000, 13887093 bytes OK
no signature
[      3.543]ready to boot
para err in disp_ioctl, cmd = 0xa,screen id = 1
[      3.552][mmc]: mmc exit start
[      3.556][mmc]: mmc 2 2xmode config clk
[      3.565][mmc]: mmc 2 2xmode config clk
[      3.579][mmc]: mmc 2 cmd 8 timeout, err 100
[      3.585][mmc]: smc 2 err, cmd 8,  RTO
[      3.591][mmc]: mmc 2 mmc cmd 8 err 0x00000100
[      3.595][mmc]: mmc send if cond failed
[      3.599][mmc]: mmc 2 cmd 55 timeout, err 100
[      3.605][mmc]: smc 2 err, cmd 55,  RTO
[      3.611][mmc]: mmc 2 mmc cmd 55 err 0x00000100
[      3.615][mmc]: send app cmd failed
[      3.628][mmc]: mmc 2 exit ok
[      3.631]
Starting kernel ...

<4[    0.755713] this module is used not!
[    0.908200] Bluetooth: get ap6xxx ap6xxx_bt_wake gpio failed
[    0.908206]
[    0.916164] Bluetooth: get ap6xxx ap6xxx_bt_host_wake gpio failed
[    0.916171]
[    0.961970] otg_wakelock_init: No USB transceiver found
[    0.967848] ths_fetch_sysconfig_para: type err  device_used = 1.
[    0.975445] fetch C0_LV_count from sysconfig failed
--------------------------------------------------------
--------------------- profile --------------------------
--------------------------------------------------------
--------------------------------------------------------
--------------------------------------------------------
--------------------------------------------------------
Init display
Init keyboard
Init camera
Init temp sensor
Init led
Init rtc
Init io
2018/02/11-01:00:01
[root@dragonboard ]# Firmware Version:2
ParasResume
ImgsMngInit
mount success!
Sd card is mounted
/work/sh/init_usb.sh /dev/mmcblk0p9
ImgsMngSyncPre
can not open /work/imgs/imgs_mng!
can not open /work/imgs/imgs_mng!
g_ImgsIndex:0,g_ImgsNull:1
mount success!
/work/cali/ir_cali_data is not access,create it
unmount sucess!
Cali data is exist but invalid,clear it
Init offset:0
Init point0@0:(0,0)
Init point1@0:(0,0)
Init point2@0:(0,0)
Init point3@0:(0,0)
Init point4@0:(0,0)
Init point5@0:(0,0)
Init point6@0:(0,0)
Init point7@0:(0,0)
open /dev/io_func ok!
Got 1 camera devices.
Press Control-C to exit...
camera thread is running
Model: 1
ModelNumber: 2406
Manufacture Date: 1/24/2019 1:05:26 PM
SerialNumber: 2417Z2C4CD95
Width: 206
Height: 156
FirmwareVersion: 13.8.1.17
SDK version: 2.10.0.0
LIB version: 2.5.3.12
THERM version: 4
seek thread is running
Temp-3:85.0
MsgId:31
WM_HBKWIN:1
MsgId:15
intensity:1
lcd brightness:60%
Temp-2:26.1
Set ambient inter:4.6,exter:26.1
Temp-1:26.1

Начиная со строки "--------------------- profile --------------------------" - это уже пошел запуск скрипта самой программы тепловизора.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/1/2019 at 8:15 PM, AndyBig said:

добавить в конец файла килобайт 10, добавить в таблицу заголовков программы еще один, загружаемый в из этих 10 кб, и в этих 10 кб уже дописывать какие-то свои моменты, при необходимости прыгая на них из оригинального кода.

Здравствуйте, возможно это вам поможет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы оставил оригинальный исполняемый файл без изменений, а попробовал бы загрузить его из своей программы в память и там пропатчить нужные места и далее передать ему управление

https://stackoverflow.com/questions/39486061/load-elf-file-into-memory

Изменено пользователем ruslan21083i

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...