Сейчас на форуме: Rio (+5 невидимых)

 eXeL@B —› Вопросы новичков —› Как заменить _hread на _hwrite
Посл.ответ Сообщение

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

Создано: 26 июня 2008 00:02
· Личное сообщение · #1

Люди добрые подскажите, как нужно заменить вызов одной функции kernel на другую?

Имеется два куска кода. Первый:

cseg04:345F lea di, [bp-46Ch] ; Load Effective Address
cseg04:3463 push ss
cseg04:3464 push di
cseg04:3465 push 0
cseg04:3467 call @ParamStr$qm6String4Word ; ParamStr(String &,Word)
cseg04:346C lea di, [bp-52h] ; Load Effective Address
cseg04:346F push ss
cseg04:3470 push di
cseg04:3471 push 50h ; 'P'
cseg04:3473 call @$basg$qm6Stringt14Byte ; operator=(String &,String &,Byte)
cseg04:3478 lea di, [bp-52h] ; Load Effective Address
cseg04:347B push ss
cseg04:347C push di
cseg04:347D push 2
cseg04:347F call @FileOpen$q6String4Word ; âèäèìî ïðîâåðêà, ââîäèëñÿ ëè ïàðîëü ðàíåå
cseg04:3484 mov [bp-62h], ax
cseg04:3487 cmp word ptr [bp-62h], 0 ; Compare Two Operands
cseg04:348B jle short loc_11014 ; Jump if Less or Equal (ZF=1 | SF!=OF)
cseg04:348D push word ptr [bp-62h]
cseg04:3490 push 0FFFFh
cseg04:3492 push 0FFF0h
cseg04:3494 push 2
cseg04:3496 call _LLSEEK ; Call Procedure
cseg04:349B push word ptr [bp-62h]
cseg04:349E lea di, [bp-66h] ; Load Effective Address
cseg04:34A1 push ss
cseg04:34A2 push di
cseg04:34A3 push 0
cseg04:34A5 push 4
cseg04:34A7 call _HWRITE ; Call Procedure

Второй:

cseg02:380A 270 lea di, [bp+var_16E] ; Load Effective Address
cseg02:380E 270 push ss
cseg02:380F 272 push di
cseg02:3810 274 push 0
cseg02:3812 276 call @ParamStr$qm6String4Word ; ParamStr(String &,Word)
cseg02:3817 274 lea di, [bp+var_58] ; Load Effective Address
cseg02:381A 274 push ss
cseg02:381B 276 push di
cseg02:381C 278 push 50h ; 'P'
cseg02:381E 27A call @$basg$qm6Stringt14Byte ; operator=(String &,String &,Byte)
cseg02:3823 270 lea di, [bp+var_58] ; Load Effective Address
cseg02:3826 270 push ss
cseg02:3827 272 push di
cseg02:3828 274 push 0
cseg02:382A 276 call @FileOpen$q6String4Word ; FileOpen(String,Word)
cseg02:382F 270 mov [bp+var_5A], ax
cseg02:3832 270 cmp [bp+var_5A], 0 ; Compare Two Operands
cseg02:3836 270 jle short loc_779C ; Jump if Less or Equal (ZF=1 | SF!=OF)
cseg02:3838 270 push [bp+var_5A]
cseg02:383B 272 push 0FFFFh
cseg02:383D 274 push 0FFF0h
cseg02:383F 276 push 2
cseg02:3841 278 call _LLSEEK ; Call Procedure
cseg02:3846 26E mov [bp-108], ax
cseg02:3849 26E push [bp+var_5A]
cseg02:384C 270 lea di, [bp+var_6] ; Load Effective Address
cseg02:384F 270 push ss
cseg02:3850 272 push di
cseg02:3851 274 push 0
cseg02:3853 276 push 4
cseg02:3855 278 call _HREAD ; Call Procedure

Вызов двух последних функций из kernel в шестнадцатиричном виде абсолютно одинаков. Мне необходимо, чтобы во втором куске вместо _HRead было _HWrite. Константы для записи в файл перед FileOpen я изменил на:

cseg02:3828 274 push 2

Также подкорректировал адрес, откуда будут браться данные для записи:

cseg02:384C 270 lea di, [bp+var_60]

Помогите плиз!




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 26 июня 2008 00:42
· Личное сообщение · #2

Вызов, по идее, должен идти через указатель в import table. Тебе просто надо поменять адрес указателя.



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

Создано: 26 июня 2008 11:04
· Личное сообщение · #3

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




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 26 июня 2008 19:34
· Личное сообщение · #4

Посмотри внимательно на "call _HREAD" - IDA, думаю просто тебе красиво отображает этот самый вызов через указатель. Выложи байты инструкции, кликни на сам "_HREAD" - это должет быть указатель в IAT. Или выкладывай саму прогу.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 27 июня 2008 06:52
· Личное сообщение · #5

Там скорее всего call на jmp. Т.е. call _HREAD скорее всего ведет на
jmp dword ptr [_HREAD]

Короче открой в ольке, скопируй call _HWRITE и вставь на место call _HREAD - 10 секунд работы

-----
Yann Tiersen best and do not fuck





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 27 июня 2008 17:03
· Личное сообщение · #6

Меня пугает адресация, cseg02:3855, не уверен, что это ПЕ-файл, в данном случае олька неприменима, надо в иде смотреть адрес в гексах.


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


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