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

 eXeL@B —› Вопросы новичков —› Поиск определенного RVA в PE
Посл.ответ Сообщение

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

Создано: 12 апреля 2011 20:17
· Личное сообщение · #1

Допустим у меня есть исходник с чем то таким:
Code:
  1. char hello[256]="Hello World!";
  2. //..............................................
  3. MessageBoxA(0,hello,"",MB_OK);
  4. //..............................................

Нужно в экзешнике не запуская его найти DWORD ,с RVA hello ,передаваемый мессагбоксу.Каким приемчиком это можно осуществить?С исходником для этого можно делать что угодно, главное нужное RVA обнаружить.




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

Создано: 12 апреля 2011 20:50
· Личное сообщение · #2

Вопроса не понял, брать дизасм да искать там, в чём сложность то?



Ранг: 61.7 (постоянный), 12thx
Активность: 0.090.02
Статус: Участник

Создано: 12 апреля 2011 20:54
· Личное сообщение · #3

+1 Archer'у скорее всего решение проще чем сам вопрос.- дизасм/олька всяко поможет. - не запуская- не нуботрой пишешь случаем?



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

Создано: 12 апреля 2011 22:11 · Поправил: yens
· Личное сообщение · #4

Насколько я знаю, системный загрузчик фиксит все RVA в VA.
Поэтому не запуская. Просто базу отнять не выйдет. Потомучто меня интересует статическая TLS переменная.

Если точнее, я пытаюсь понять, как системный загрузчик находит места в коде для втыкания в них VA с TLSной переменной.



Ранг: 57.1 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 12 апреля 2011 22:59
· Личное сообщение · #5

yens
Три раза перечитал и три раза не понял. Можно версию проблемы сформулировать для таких как я, труднопонимающих? )



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

Создано: 13 апреля 2011 00:06
· Личное сообщение · #6

Я хочу увидить DWORD с "адресом" статической TLS переменной,до того как системный загрузчик сделает из него VA.



Ранг: 39.6 (посетитель), 21thx
Активность: 0.020
Статус: Участник

Создано: 13 апреля 2011 05:06 · Поправил: sen
· Личное сообщение · #7

yens
шесть раз перечитал все твои посты, и нихрена не понял. какой tls вдруг вылез ? в головном посте о нем ни полслова, и при чем тут rva в va ?

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

p.s. va = imagebase + rva, и оба ниразу не физическое смещение в файле

p.p.s. посмотрел количество новых тем, весеннее обострение активности младых на новом названии ?




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 13 апреля 2011 10:06
· Личное сообщение · #8

Грубо говоря, нужно двигаться по секции кода в поисках дворда, который бы являлся адресом искомой мессаги. Для этого:
1. Поиском подстроки в строке ищем в ехе требуемую строку.
2. Нашли, на данном этапе имеем её PointerToRawData.
3. Далее переводим PointerToRawData в RVA.
4. Теперь прибавляя ImageBase, получаем то значение, которое нужно искать в кодосекции.
5. Как я понимаю, ищется что-то типа push 00xxxxxx, так вот 00xxxxxx мы поиском по кодосекции находим, далее от адреса, по которому нашли, вычитаем 1 и дизасмим команду по этому адресу. Если получили искомое push 00xxxxxx, так мы найдём адрес, по которому расположена команда заталкивания в стек нужного параметра. Если я нигде не ошибся (а я могу), то как-то так.Но зачем это нужно, ума не приложу.

-----
Stuck to the plan, always think that we would stand up, never ran.


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

Ранг: 39.6 (посетитель), 21thx
Активность: 0.020
Статус: Участник

Создано: 14 апреля 2011 04:59
· Личное сообщение · #9

ARCHANGEL
у тебя нет втыкания в них VA с TLSной переменной, без такого втыкания твой алгоритм не работает




Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 14 апреля 2011 17:31
· Личное сообщение · #10

yens пишет:
Я хочу увидить DWORD с "адресом" статической TLS переменной,до того как системный загрузчик сделает из него VA.


а статическая TLS-переменная - это типа константа, которую тлс-колбэк куда-то пихает? или я совсем не шарю?

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.




Ранг: 57.1 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 14 апреля 2011 17:39
· Личное сообщение · #11

CrawlerARCHANGEL
Ребят, а вам не кажется что вы "гаданием по кофейной гуще" способствуете повышению количества подобных постов с нечетко задаными вопросами?




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 14 апреля 2011 18:24
· Личное сообщение · #12

Ключевое слово: релоки
Проходишься по релокам и проверяешь на попадание в диапазон между StartAddressOfRawData и EndAddressOfRawData структуры IMAGE_TLS_DIRECTORY32

-----
EnJoy!





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

Создано: 14 апреля 2011 19:05
· Личное сообщение · #13

Jupiter а где же TLS переменная?

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





Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 15 апреля 2011 00:34
· Личное сообщение · #14

PE_Kill
у ТС на лету менятся ТЗ, пусть выкладывает реальный пример, тогда и можно будет конкретно говорить, где что.
Из первого сообщения ТС вообще не следует, что речь о TLS.

я ориентировался на это:
yens пишет:
Если точнее, я пытаюсь понять, как системный загрузчик находит места в коде для втыкания в них VA с TLSной переменной.


раз ТС в первом посте привёл кусок сорса, значит может собрать бинарник с релоками - а это сильно упростит дело

-----
EnJoy!




Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 15 апреля 2011 01:54
· Личное сообщение · #15

когда-то читал - мож про это речь
http://www.wasm.ru/print.php?article=tls
и тут цикл статей
http://www.nynaeve.net/?p=190
и до кучи
http://rouse.drkb.ru/winapi.php
http://rouse.drkb.ru/files/pmm.zip



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

Создано: 15 апреля 2011 19:17 · Поправил: yens
· Личное сообщение · #16

Code:
  1. __declspec( thread ) char tls_char[25]="Hello World";
  2. DWORD WINAPI thr(LPVOID lParam)
  3. {
  4.          printf("data VA: %X - %s\n",(DWORD)tls_char,tls_char);
  5.          return 0;
  6. }
  7. int _tmain(int argc, _TCHAR* argv[])
  8. {
  9.          DWORD selfBase=(DWORD)GetModuleHandle(NULL);
  10.          printf("selfbase: %X\ndata VA: %X - %s\n",selfBase,(DWORD)tls_char,tls_char);
  11.          //CreateThread(0,0,&thr,0,0,0);
  12.  
  13.          WaitForSingleObject(CreateThread(0,0,&thr,0,0,0),INFINITE);
  14.  
  15.          CreateThread(0,0,&thr,0,0,0);
  16.          getch();
  17.          return 0;
  18. }

Когда используется WaitForSingleObject,для обоих потоков один и тот же VA с tls_char.А если выполнить оба потока одновременно то VA разный.Я правильно понимаю что загрузчик видя в коде мейджик байт для такой переменной, фиксит код на лету?И пока этот код неначал выполнятся,вместо VA там находится упаковнные в DWORD мейджик байт,индекс переменной в её секции и ещё возможно какая та инфа?
Так как вот как этот DWORD в нефикшенном виде выдрать?




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

Создано: 15 апреля 2011 20:55
· Личное сообщение · #17

Вместо того, чтобы гадать, возьми да погляди в отладчике/дизасме. Скорее всего там будут апи обращения к тлс с магиками без прямых адресов. И тогда адресов нет в принципе, все обращения к переменным делаются через апи.



Ранг: 39.6 (посетитель), 21thx
Активность: 0.020
Статус: Участник

Создано: 16 апреля 2011 08:34 · Поправил: sen
· Личное сообщение · #18

совершенно невозможно понять логику непрофессионала (с)Мюллер, 17 мгновений


yens
код в #1 и #16 это абсолютно разный код, между ними нет ничего общего кроме строки "Hello World".

я сегодня не ленивый и прогнал твой код:

раз:
Code:
  1. //         CreateThread(0,0,&thr,0,0,0);
  2.          WaitForSingleObject(CreateThread(0,0,&thr,0,0,0),INFINITE);
  3.  
  4. selfbase: 400000
  5. data VA: 142FB4 - Hello World
  6. data VA: 14307C - Hello World
  7. data VA: 14307C - Hello World

два:
Code:
  1.          CreateThread(0,0,&thr,0,0,0);
  2. //         WaitForSingleObject(CreateThread(0,0,&thr,0,0,0),INFINITE);
  3.  
  4. selfbase: 400000
  5. data VA: 142FB4 - Hello World
  6. data VA: 14307C - Hello World
  7. data VA: 14307C - Hello World


вывод полностью идеинтичный, что с WaitForSingleObject, что без. Какой VA у тебя разный ?

нет никаких мейджик байт, нет никаких фиксов кода не лету (а также в воде и на земле), читай про локальную память потока.

как только ты написал __declspec(thread) компилятор положит переменную в отдельный раздел, а линкер соберет все такие разделы в одну секцию с именем .tls При загрузке система видя секцию .tls динамически выделяет память для хранения всех статических tls-переменных, поэтому в коде потока для обращения к такой переменной будет обращение из нескольких команд в блок памяти конкретно этого потока, для другого потока система выделит другой блок, каждый поток работает со своими переменными, в другой обратиться он не может.

какой dword и откуда хочешь выдрать ? зачем и что конкретно надо, задай точный вопрос на русском языке (без всяких втыканий и пр.)


Archer
нет там никаких апи, все гораздо проще:
Code:
  1. .00401000: A1749C4000                     mov         eax,[000409C74] -- 1
  2. .00401005: 648B0D2C000000                 mov         ecx,fs:[00000002C]
  3. .0040100C: 8B0481                         mov         eax,[ecx][eax]*4
  4. .0040100F: 8D8004000000                   lea         eax,[eax][4]
  5. .00401015: 50                             push        eax
  6. .00401016: 50                             push        eax
  7. .00401017: 6840704000                     push        000407040 ;'data VA: %X - %s' -- 2
  8. .0040101C: E86F000000                     call       .000401090 -- 3
  9. .00401021: 83C40C                         add         esp,00C
  10. .00401024: 33C0                           xor         eax,eax
  11. .00401026: C20400                         retn        4 ; -^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-
  12. .00401029: 90909090909090                 nop
  13. .00401030: 56                             push        esi
  14. .00401031: 6A00                           push        0
  15. .00401033: FF1504604000                   call        GetModuleHandleA
  16. .00401039: 8B0D749C4000                   mov         ecx,[000409C74] -- 1
  17. .0040103F: 648B152C000000                 mov         edx,fs:[00000002C]
  18. .00401046: 8B0C8A                         mov         ecx,[edx][ecx]*4
  19. .00401049: 8D8904000000                   lea         ecx,[ecx][4]
  20. .0040104F: 51                             push        ecx
  21. .00401050: 51                             push        ecx
  22. .00401051: 50                             push        eax
  23. .00401052: 6854704000                     push        000407054 ;'selfbase: %X' -- 4
  24. .00401057: E834000000                     call       .000401090 -- 3




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

Создано: 16 апреля 2011 13:21
· Личное сообщение · #19

Вывод у меня таки разный,получается что для каждого экземпляра потока память под переменную выделяется отдельно.Нигде описание этого механизма я к сожалению нагуглить несмог





Ранг: 191.8 (ветеран), 46thx
Активность: 0.170
Статус: Участник

Создано: 16 апреля 2011 17:20
· Личное сообщение · #20

Ну просто тогда попробуй почитать
Харт Системное программирование




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

Создано: 16 апреля 2011 18:23
· Личное сообщение · #21

yens а нахрена ты сделал строку TLS переменной?

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



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


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