Jump to content

    

Как добавить в исполняемый 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 --------------------------" - это уже пошел запуск скрипта самой программы тепловизора.

 

Share this post


Link to post
Share on other sites
On 8/1/2019 at 8:15 PM, AndyBig said:

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now