Сейчас на форуме: cppasm, asfa (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Mips разное значение hex
Посл.ответ Сообщение

Ранг: 3.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 июня 2016 21:38
· Личное сообщение · #1

Здравствуйте. Ковыряя модуль ядра под mips , обнаружил, что некоторые команды в hex почему-то разные. К примеру,

text:00001C04 la $v0, loc_7B34 в IDA в hex выглядит как 00001C04 3C 02 00 00 24 42 7B 34

если же взять HxD или что-то другое и залезть в файл, то картина будет такая:

3C 02 00 00 24 42 C7 F0 , то есть отличие в последних двух байтах. Почему это так ?

IDa Version 6.8.150423 (64-bit) Win7 64-bit

Спасибо




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 12 июня 2016 21:51
· Личное сообщение · #2

исходный файл предоставьте



Ранг: 3.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 июня 2016 21:55
· Личное сообщение · #3

Вот

a05a_12.06.2016_EXELAB.rU.tgz - ath9k.ko




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 12 июня 2016 22:19
· Личное сообщение · #4

это ида патчит релок

https://www.onlinedisassembler.com/odaweb/lC4CVTQz/0
FFFFFFFFFFFFC7F0 (-14352)

Code:
  1. .text:00001C00                 addu    $a3, $zero, $zero
  2. .text:00001C04                 lui     $v0, (loc_7B34 >> 16)                        ; 3C 02 00 00
  3. .text:00001C08                 addiu   $v0, $v0, (loc_7B34 & 0xFFFF)          ; 24 42 7B 34
  4. .text:00001C0C                 sw      $v0, 0x60($s3)
  5. .text:00001C10                 addiu   $v0, $zero, (loc_7C+3)
  6. .text:00001C14                 sw      $v0, 0x110($s3)
  7.  
  8.  
  9. .text:00001C00                 move    $a3, $zero
  10. .text:00001C04                 la      $v0, loc_7B34                 ; 3C 02 00 00 24 42 7B 34
  11. .text:00001C0C                 sw      $v0, 0x60($s3)
  12. .text:00001C10                 la      $v0, 0x7F
  13. .text:00001C14                 sw      $v0, 0x110($s3)


| Сообщение посчитали полезным: YellowKlen

Ранг: 3.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 июня 2016 22:47
· Личное сообщение · #5

Спасибо. Я не совсем силён в этом, что такое релок? Зачем IDa патчит? Не совсем понял, почему всё это происходит.




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 12 июня 2016 23:04 · Поправил: plutos
· Личное сообщение · #6

YellowKlen пишет:
что такое релок?


Для начала нужно изучить PE file format. (ссылок полно, уроки Iczelion'a)
Потом глянуть ну хотя бы тут: http://stackoverflow.com/questions/17436668/how-are-pe-base-relocations-build-up
или тут: http://www.codeproject.com/Articles/12532/Inject-your-code-to-a-Portable-Executable-file#ImplementRelocationTable7_2

-----
Give me a HANDLE and I will move the Earth.


| Сообщение посчитали полезным: YellowKlen


Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 12 июня 2016 23:33
· Личное сообщение · #7

plutos пишет:
Для начала нужно изучить PE file format

PE может легче и доступней, но конкретно здесь лучше сразу ELF посмотреть. А видел ещё где-то хорошее сравнение ELF и PE, они в чём-то похожи... но в принципах и не боле

-----
IZ.RU





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 12 июня 2016 23:59
· Личное сообщение · #8

вообще у меня сомнения это релок или это значение

.text:00001C04 la $v0, loc_7B34 ??? может там и значение должно быть а ида запатчила как релок
.text:00001C0C sw $v0, 0x60($s3)
.text:00001C10 li $v0, 0x7F # ''
.text:00001C14 sw $v0, 0x110($s3)
.text:00001C18 lui $a1, (asc_11DAC >> 16) # "      "
.text:00001C1C li $v0, 0x64 # 'd'
.text:00001C20 sw $s0, 0x64($s3)

Добавлено спустя 8 минут
есть соурс от этого модуля ? это процедура ath9k_init_misc в ней там инициализация бмака и перед эти 7F это #define ATH_RSSI_DUMMY_MARKER 127

memcpy(common->bssidmask, ath_bcast_mac, ETH_ALEN);
?????????
common->last_rssi = ATH_RSSI_DUMMY_MARKER;

а вот что перед эти хз

Добавлено спустя 8 минут
адрес там или число




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 14 июня 2016 09:01 · Поправил: DenCoder
· Личное сообщение · #9

Писал писал тогда, но день новый настал - 13е, и сначала интернет отвалился, а потом и exelab лёг...

Старая привычка копировать текст в буфер перед отправкой спасла текст. Делаю репост. Но исследований почти больше не проводил, оставляю так, как написал 13го в первом часу.

Ключ ко всему в $s3, что есть указатель на структуру. Что там по смещению 0x60?

Code:
  1. 770 struct ath_hw {
  2. 771         struct ath_ops reg_ops; //интерфейс, размер 0x20
  3. 772 
  4. 773         struct device *dev; //0x20
  5. 774         struct ieee80211_hw *hw; //0x24
  6. 775         struct ath_common common; //0x28
  7. 776         struct ath9k_hw_version hw_version;
  8. 777         struct ath9k_ops_config config;
  9. 778         struct ath9k_hw_capabilities caps;
  10. 779         struct ath9k_channel channels[ATH9K_NUM_CHANNELS];
  11. 780         struct ath9k_channel *curchan;
  12. 781 
  13. 782         union {
  14. 783                 struct ar5416_eeprom_def def;
  15. 784                 struct ar5416_eeprom_4k map4k;
  16. 785                 struct ar9287_eeprom map9287;
  17. 786                 struct ar9300_eeprom ar9300_eep;
  18. 787         } eeprom;
  19. 788         const struct eeprom_ops *eep_ops;
  20. 789 
  21. 790         bool sw_mgmt_crypto_tx;
  22. 791         bool sw_mgmt_crypto_rx;
  23. 792         bool is_pciexpress;
  24. 793         bool aspm_enabled;
  25. 794         bool is_monitoring;
  26. 795         bool need_an_top2_fixup;
  27. 796         u16 tx_trig_level;
  28. 797 
  29. 798         u32 nf_regs[6];
  30. 799         struct ath_nf_limits nf_2g;
  31. 800         struct ath_nf_limits nf_5g;
  32. 801         u16 rfsilent;
  33. 802         u32 rfkill_gpio;
  34. 803         u32 rfkill_polarity;
  35. 804         u32 ah_flags;
  36. 805 
  37. 806         bool reset_power_on;
  38. 807         bool htc_reset_init;
  39. 808 
  40. 809         enum nl80211_iftype opmode;
  41. 810         enum ath9k_power_mode power_mode;
  42. 811 
  43. 812         s8 noise;
  44. 813         struct ath9k_hw_cal_data *caldata;
  45. 814         struct ath9k_pacal_info pacal_info;
  46. 815         struct ar5416Stats stats;
  47. 816         struct ath9k_tx_queue_info txq[ATH9K_NUM_TX_QUEUES];
  48. 817 
  49. 818         enum ath9k_int imask;
  50. 819         u32 imrs2_reg;
  51. 820         u32 txok_interrupt_mask;
  52. 821         u32 txerr_interrupt_mask;
  53. 822         u32 txdesc_interrupt_mask;
  54. 823         u32 txeol_interrupt_mask;
  55. 824         u32 txurn_interrupt_mask;
  56. 825         atomic_t intr_ref_cnt;
  57. 826         bool chip_fullsleep;
  58. 827         u32 modes_index;
  59. 828 
  60. 829         /* Calibration */
  61. 830         u32 supp_cals;
  62. 831         struct ath9k_cal_list iq_caldata;
  63. 832         struct ath9k_cal_list adcgain_caldata;
  64. 833         struct ath9k_cal_list adcdc_caldata;
  65. 834         struct ath9k_cal_list *cal_list;
  66. 835         struct ath9k_cal_list *cal_list_last;
  67. 836         struct ath9k_cal_list *cal_list_curr;
  68. 837 #define totalPowerMeasI meas0.unsign
  69. 838 #define totalPowerMeasQ meas1.unsign
  70. 839 #define totalIqCorrMeas meas2.sign
  71. 840 #define totalAdcIOddPhase  meas0.unsign
  72. 841 #define totalAdcIEvenPhase meas1.unsign
  73. 842 #define totalAdcQOddPhase  meas2.unsign
  74. 843 #define totalAdcQEvenPhase meas3.unsign
  75. 844 #define totalAdcDcOffsetIOddPhase  meas0.sign
  76. 845 #define totalAdcDcOffsetIEvenPhase meas1.sign
  77. 846 #define totalAdcDcOffsetQOddPhase  meas2.sign
  78. 847 #define totalAdcDcOffsetQEvenPhase meas3.sign
  79. 848         union {
  80. 849                 u32 unsign[AR5416_MAX_CHAINS];
  81. 850                 int32_t sign[AR5416_MAX_CHAINS];
  82. 851         } meas0;
  83. 852         union {
  84. 853                 u32 unsign[AR5416_MAX_CHAINS];
  85. 854                 int32_t sign[AR5416_MAX_CHAINS];
  86. 855         } meas1;
  87. 856         union {
  88. 857                 u32 unsign[AR5416_MAX_CHAINS];
  89. 858                 int32_t sign[AR5416_MAX_CHAINS];
  90. 859         } meas2;
  91. 860         union {
  92. 861                 u32 unsign[AR5416_MAX_CHAINS];
  93. 862                 int32_t sign[AR5416_MAX_CHAINS];
  94. 863         } meas3;
  95. 864         u16 cal_samples;
  96. 865         u8 enabled_cals;
  97. 866 
  98. 867         u32 sta_id1_defaults;
  99. 868         u32 misc_mode;
  100. 869 
  101. 870         /* Private to hardware code */
  102. 871         struct ath_hw_private_ops private_ops;
  103. 872         /* Accessed by the lower level driver */
  104. 873         struct ath_hw_ops ops;
  105. 874 
  106. 875         /* Used to program the radio on non single-chip devices */
  107. 876         u32 *analogBank6Data;
  108. 877 
  109. 878         int coverage_class;
  110. 879         u32 slottime;
  111. 880         u32 globaltxtimeout;
  112. 881 
  113. 882         /* ANI */
  114. 883         u32 aniperiod;
  115. 884         enum ath9k_ani_cmd ani_function;
  116. 885         u32 ani_skip_count;
  117. 886         struct ar5416AniState ani;
  118. 887 
  119. 888 #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
  120. 889         struct ath_btcoex_hw btcoex_hw;
  121. 890 #endif
  122. 891 
  123. 892         u32 intr_txqs;
  124. 893         u8 txchainmask;
  125. 894         u8 rxchainmask;
  126. 895 
  127. 896         struct ath_hw_radar_conf radar_conf;
  128. 897 
  129. 898         u32 originalGain[22];
  130. 899         int initPDADC;
  131. 900         int PDADCdelta;
  132. 901         int led_pin;
  133. 902         u32 gpio_mask;
  134. 903         u32 gpio_val;
  135. 904 
  136. 905         struct ar5416IniArray ini_dfs;
  137. 906         struct ar5416IniArray iniModes;
  138. 907         struct ar5416IniArray iniCommon;
  139. 908         struct ar5416IniArray iniBB_RfGain;
  140. 909         struct ar5416IniArray iniBank6;
  141. 910         struct ar5416IniArray iniAddac;
  142. 911         struct ar5416IniArray iniPcieSerdes;
  143. 912         struct ar5416IniArray iniPcieSerdesLowPower;
  144. 913         struct ar5416IniArray iniModesFastClock;
  145. 914         struct ar5416IniArray iniAdditional;
  146. 915         struct ar5416IniArray iniModesRxGain;
  147. 916         struct ar5416IniArray ini_modes_rx_gain_bounds;
  148. 917         struct ar5416IniArray iniModesTxGain;
  149. 918         struct ar5416IniArray iniCckfirNormal;
  150. 919         struct ar5416IniArray iniCckfirJapan2484;
  151. 920         struct ar5416IniArray iniModes_9271_ANI_reg;
  152. 921         struct ar5416IniArray ini_radio_post_sys2ant;
  153. 922         struct ar5416IniArray ini_modes_rxgain_5g_xlna;
  154. 923         struct ar5416IniArray ini_modes_rxgain_bb_core;
  155. 924         struct ar5416IniArray ini_modes_rxgain_bb_postamble;
  156. 925 
  157. 926         struct ar5416IniArray iniMac[ATH_INI_NUM_SPLIT];
  158. 927         struct ar5416IniArray iniBB[ATH_INI_NUM_SPLIT];
  159. 928         struct ar5416IniArray iniRadio[ATH_INI_NUM_SPLIT];
  160. 929         struct ar5416IniArray iniSOC[ATH_INI_NUM_SPLIT];
  161. 930 
  162. 931         u32 intr_gen_timer_trigger;
  163. 932         u32 intr_gen_timer_thresh;
  164. 933         struct ath_gen_timer_table hw_gen_timers;
  165. 934 
  166. 935         struct ar9003_txs *ts_ring;
  167. 936         u32 ts_paddr_start;
  168. 937         u32 ts_paddr_end;
  169. 938         u16 ts_tail;
  170. 939         u16 ts_size;
  171. 940 
  172. 941         u32 bb_watchdog_last_status;
  173. 942         u32 bb_watchdog_timeout_ms; /* in ms, 0 to disable */
  174. 943         u8 bb_hang_rx_ofdm; /* true if bb hang due to rx_ofdm */
  175. 944 
  176. 945         unsigned int paprd_target_power;
  177. 946         unsigned int paprd_training_power;
  178. 947         unsigned int paprd_ratemask;
  179. 948         unsigned int paprd_ratemask_ht40;
  180. 949         bool paprd_table_write_done;
  181. 950         u32 paprd_gain_table_entries[PAPRD_GAIN_TABLE_ENTRIES];
  182. 951         u8 paprd_gain_table_index[PAPRD_GAIN_TABLE_ENTRIES];
  183. 952         /*
  184. 953          * Store the permanent value of Reg 0x4004in WARegVal
  185. 954          * so we dont have to R/M/W. We should not be reading
  186. 955          * this register when in sleep states.
  187. 956          */
  188. 957         u32 WARegVal;
  189. 958 
  190. 959         /* Enterprise mode cap */
  191. 960         u32 ent_mode;
  192. 961 
  193. 962 #ifdef CONFIG_ATH9K_WOW
  194. 963         struct ath9k_hw_wow wow;
  195. 964 #endif
  196. 965         bool is_clk_25mhz;
  197. 966         int (*get_mac_revision)(void);
  198. 967         int (*external_reset)(void);
  199. 968         bool disable_2ghz;
  200. 969         bool disable_5ghz;
  201. 970 
  202. 971         const struct firmware *eeprom_blob;
  203. 972 
  204. 973         struct ath_dynack dynack;
  205. 974 
  206. 975         bool tpc_enabled;
  207. 976         u8 tx_power[Ar5416RateSize];
  208. 977         u8 tx_power_stbc[Ar5416RateSize];
  209. 978 };


другая большая подструктура
Code:
  1. 147 struct ath_common {
  2. 148         void *ah; // 0
  3. 149         void *priv; // 4
  4. 150         struct ieee80211_hw *hw; // 8
  5. 151         int debug_mask; // 0xC
  6. 152         enum ath_device_state state; //0x10
  7. 153         unsigned long op_flags; //0x14
  8. 154 
  9. 155         struct ath_ani ani; //0x18 size 0x2C
  10. 156 
  11. 157         u16 cachelsz;
  12. 158         u16 curaid;
  13. 159         u8 macaddr[ETH_ALEN];
  14. 160         u8 curbssid[ETH_ALEN] __aligned(2);
  15. 161         u8 bssidmask[ETH_ALEN];
  16. 162 
  17. 163         u32 rx_bufsize;
  18. 164 
  19. 165         u32 keymax;
  20. 166         DECLARE_BITMAP(keymap, ATH_KEYMAX);
  21. 167         DECLARE_BITMAP(tkip_keymap, ATH_KEYMAX);
  22. 168         DECLARE_BITMAP(ccmp_keymap, ATH_KEYMAX);
  23. 169         enum ath_crypt_caps crypt_caps;
  24. 170 
  25. 171         unsigned int clockrate;
  26. 172 
  27. 173         spinlock_t cc_lock;
  28. 174         struct ath_cycle_counters cc_ani;
  29. 175         struct ath_cycle_counters cc_survey;
  30. 176 
  31. 177         struct ath_regulatory regulatory;
  32. 178         struct ath_regulatory reg_world_copy;
  33. 179         const struct ath_ops *ops;
  34. 180         const struct ath_bus_ops *bus_ops;
  35. 181         const struct ath_ps_ops *ps_ops;
  36. 182 
  37. 183         bool btcoex_enabled;
  38. 184         bool disable_ani;
  39. 185         bool bt_ant_diversity;
  40. 186 
  41. 187         int last_rssi;
  42. 188         struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
  43. 189 };


и одна маленькая, в которой в структуре timer_list сохраняется это значение
Code:
  1.  38 struct ath_ani {
  2.  39         bool caldone; //0
  3.  40         unsigned int longcal_timer; // 4
  4.  41         unsigned int shortcal_timer; // 8
  5.  42         unsigned int resetcal_timer; // 0xC
  6.  43         unsigned int checkani_timer; // 0x10
  7.  44         struct timer_list timer; // 0x14 size 0x18, 0x30, 0x48
  8.  45 };//size 0x2C, 0x44, 0x5C


-----
IZ.RU





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 14 июня 2016 09:03
· Личное сообщение · #10

Code:
  1.  12 struct timer_list {
  2.  13         /*
  3.  14          * All fields that change during normal runtime grouped to the
  4.  15          * same cacheline
  5.  16          */
  6.  17         struct list_head entry; // 0
  7.  18         unsigned long expires; // 4
  8.  19         struct tvec_base *base; // 8
  9.  20 
  10.  21         void (*function)(unsigned long); // 0xC
  11.  22         unsigned long data;// 0x10
  12.  23 
  13.  24         int slack; // 0x14
  14.  25         //size 0x18
  15.  26 #ifdef CONFIG_TIMER_STATS
  16.  27         int start_pid; // 0
  17.  28         void *start_site; // 4
  18.  29         char start_comm[16]; //8
  19.  30 #endif //size 0x18
  20.  31 #ifdef CONFIG_LOCKDEP
  21.  32         struct lockdep_map lockdep_map;
  22.  33 #endif //size 0x18
  23.  34 };


Если структура была б в точности такая же хотя б до смещения 0x60, то
0x7B34 был бы адрес функции, void (*function)(unsigned long), ath_hw::common.ani.timer.function.
Но похоже, структура изменена и догадаться как - можно по функциям, использующим структуру.
С исходником лучше

структуры нашёл здесь
http://lxr.free-electrons.com/source/drivers/net/wireless/ath/ath9k/main.c?v=4.1#L730

Судя по найденному, и по названию - это имеет какое-то отношение к драйверу wi-fi?

-----
IZ.RU


| Сообщение посчитали полезным: YellowKlen


Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 14 июня 2016 15:41
· Личное сообщение · #11

конечно это драйвер wifi атероузовский
понять что там в 60 смещени можно только если все разбирать, а так лень угадывать

| Сообщение посчитали полезным: YellowKlen

Ранг: 3.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 14 июня 2016 21:53
· Личное сообщение · #12

Спасибо большое всем. Да, это драйвер wifi это OpenWrt.

вот кусочек кода того места. (кстати как тут красиво код вставить..)

static void ath9k_init_misc(struct ath_softc *sc)
{
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
int i = 0;

setup_timer(&common->ani.timer, ath_ani_calibrate, (unsigned long)sc);

sc->last_rssi = ATH_RSSI_DUMMY_MARKER;
sc->config.txpowlimit = ATH_TXPOWER_MAX;
memcpy(common->bssidmask, ath_bcast_mac, ETH_ALEN);
sc->beacon.slottime = ATH9K_SLOT_TIME_9;

for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++)
sc->beacon.bslot[i] = NULL;

if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB)
sc->ant_comb.count = ATH_ANT_DIV_COMB_INIT_COUNT;

sc->spec_config.enabled = 0;
sc->spec_config.short_repeat = true;
sc->spec_config.count = 8;
sc->spec_config.endless = false;
sc->spec_config.period = 0xFF;
sc->spec_config.fft_period = 0xF;
}

0x7B34 в место этого там когда-то стояло вызов колбэка anicalibrate. Я делал попытку убить таймер, но это не удалось. Получилось только подменить вызов колбэка на другую сабрутину. В этом состоянии модуль нормально подгружается и не падает. Правил руками в файле, к сожелению вызываться стала не та сабрутина, которую я планировал, но она тоже решила поставленную задачу. Я конечно надеюсь, что читая это вы тихо прётесь, но мне просто некуда было деваться. Я не вводил в заблуждение, но лазая по коду при помощи IDa , я нашёл ещё несколько мест где значение хекса в IDE не соответсвует хексу в файле, вот и решил спросить в чём штука. В оле я такого не замечал. Но оля не работает с файлами такого типа.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 14 июня 2016 22:57
· Личное сообщение · #13

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

а какой смысл убивать таймер ? берите сорус и пересобирайте под себя, зачем этот секс в бинари правками

| Сообщение посчитали полезным: DenCoder

Ранг: 3.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 15 июня 2016 08:32
· Личное сообщение · #14

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


 eXeL@B —› Вопросы новичков —› Mips разное значение hex
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати