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

 eXeL@B —› Вопросы новичков —› Помогите разобраться с Оллей,, срочно, плз
Посл.ответ Сообщение

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

Создано: 08 июня 2009 00:27 · Поправил: Dark40000
· Личное сообщение · #1

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

char mes[1024];

MIB_IFROW mbrow = { 0 };
PMIB_IFTABLE pTable = NULL;
DWORD dwSize = 0;
if ( GetIfTable( pTable, &dwSize, FALSE ) == ERROR_INSUFFICIENT_BUFFER )
{
pTable = PMIB_IFTABLE(LocalAlloc(LMEM_ZEROINIT, dwSize));
if ( !GetIfTable( pTable, &dwSize, TRUE ) )
{
sprintf(mes,"Total entries: %d Enumerating...",pTable->dwNumEntries);
Memo1->Lines->Add(mes);

for(unsigned int i = 0; i < pTable->dwNumEntries; ++i)
{
PMIB_IFROW ifRow = &pTable->table[i];
char str[MAXLEN_IFDESCR + 1] = { 0 };
CharToOemA((char*) ifRow->bDescr, (char*) ifRow->bDescr);
sprintf(mes,"- if%d is: %s", i, ifRow->bDescr);
Memo1->Lines->Add(mes);

sprintf(mes,"Address: %02x:%02x:%02x:%02x:%02x:%02x",
ifRow->bPhysAddr[0],
ifRow->bPhysAddr[1],
ifRow->bPhysAddr[2],
ifRow->bPhysAddr[3],
ifRow->bPhysAddr[4],
ifRow->bPhysAddr[5]
);
Memo1->Lines->Add(mes);

}
}
}

Здесь сканируются сетевые карты, если так грубо сказать.

Открываю программу в Олле, ставлю бряк на GetIfTable -> F9 -> останавливаюсь на бряке....

Только у меня другая ситуация,, программа вот таким образом как я понимаю считывает мак адрес сетевухи,, кудато сразу ее сохраняет в памяти, а потом на протяжении всего времени программы время от времени проверяет этот считанный мак адрес.
Мне требуеться после того как GetIfTable( pTable, &dwSize, FALSE ) отработала,, отследить куда в памяти она сохранила этот мак адрес, это число,, и сразу же его заменить на свое. Я незнаю что и как с ним потом делаеться и проверяеться, поэтому мне сразу же вот здесь "на корню' надо заменить его на свое,, и непариться больше где и как оно используеться, сравниваеться, отображаеться и т.п.
Такое возможно? Как это реализовать?? Подскажите плз,, ато я совсем непонимаю что и как в моей ситуации..




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 08 июня 2009 01:00
· Личное сообщение · #2

GetIfTable заполняет две структуры MIB_IFTABL и MIB_IFROW
Code:
  1. typedef struct _MIB_IFROW {
  2.   WCHAR wszName[MAX_INTERFACE_NAME_LEN];
  3.   DWORD dwPhysAddrLen;
  4.   BYTE  bPhysAddr[MAXLEN_PHYSADDR];
  5. }MIB_IFROW, *PMIB_IFROW;


По адресу _MIB_IFROW->bPhysAddr[] хранится физический адрес(MAC) ->
находи структуру в памяти и меняй её.

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




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

Создано: 08 июня 2009 13:45
· Личное сообщение · #3

Coderess пишет:
находи структуру в памяти и меняй её

Так а как это сделать и когда? Ставить бряк на GetIfTable и что потом?? Как найти эту структуру в памяти... подождать пока функция отработает и чтото искать в Dump'е...? или трасировать эту функцию,,(всеравно я ничего ненаблюдаю, что куда записываеться, и где эта структура могла бы проскочить...) .. или как?




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

Создано: 08 июня 2009 18:36
· Личное сообщение · #4

Каждая функция принимает параметры и возвращает, эта не исключение. Поглядите, что за параметры, как они передаются (соглашения о вызовых почитайте, stdcall, cdecl, fastcall), потом ищете в параметрах нужные места и после возвращения результата, правьте.




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 08 июня 2009 19:14
· Личное сообщение · #5

подождать пока функция отработает и чтото искать в Dump'е...

Функция GetIfTable, после выполнения заполняет стуктуры: MIB_IFTABL и MIB_IFROW
просматривать после её исполнения.

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

Давай свой экзешник, на нем будет легче все показать.

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




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

Создано: 08 июня 2009 20:49
· Личное сообщение · #6

Archer пишет:
Каждая функция принимает параметры и возвращает, эта не исключение.

я понимаю,, наблюдал это уже,, допустим должна выполниться строчка 00401BEE E8 85120000 CALL <JMP.&CC3260MT._sprintf> и у этой строчки в стеке лежат параметры которые ей передаются типа 0012ECE8 0012F15C |s = 0012F15C ; 0012ECEC 004035ED |format = "Total entries: %d Enumerating..." ; 0012ECF0 00000005 \<%d> = 5 . я правильно понимаю?
но когда же вызываеться например нужная мне функция GetIfTable - стек пустой, т.е. я непредставляю где что искать...

Coderess пишет:
Давай свой экзешник, на нем будет легче все показать.

буду очень признателен если на нем именно и покажете,, прикрепил ехе выполняющий код из первого моего сообщения
Code:
  1. 004019C6   E8 6D050600      CALL <JMP.&IPHLPAPI.GetIfTable>
  2. 004019CB   83F8 7A          CMP EAX,7A
  3. 004019CE   0F85 F5020000    JNZ Project1.00401CC9
  4. .....
  5. 004019DA   E8 D7060600      CALL <JMP.&KERNEL32.LocalAlloc>
  6. 004019DF   8BF8             MOV EDI,EAX
  7. 004019E1   8D45 C0          LEA EAX,DWORD PTR SS:[EBP-40]
  8. ....
  9. 004019E8   E8 4B050600      CALL <JMP.&IPHLPAPI.GetIfTable>
  10. 004019ED   85C0             TEST EAX,EAX
  11. ...
  12. 004019FD   52               PUSH EDX
  13. 004019FE   68 ED354600      PUSH Project1.004635ED                   ; ASCII "Total entries: %d Enumerating..."
  14. 00401A03   51               PUSH ECX
  15. 00401A04   E8 877C0500      CALL Project1.00459690
  16. ....
  17. 00401A27   E8 FC020600      CALL Project1.00461D28
  18. 00401A2C   FF45 E0          INC DWORD PTR SS:[EBP-20]

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

bf12_08.06.2009_CRACKLAB.rU.tgz - Project1.rar



Ранг: 133.4 (ветеран), 57thx
Активность: 0.110
Статус: Участник

Создано: 08 июня 2009 22:52
· Личное сообщение · #7

004019DA E8 D7060600 CALL <JMP.&KERNEL32.LocalAlloc>
выделяет память под таблицу, смотри, что в eax после нее, там и твои данные недалеко.



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

Создано: 09 июня 2009 00:39 · Поправил: Dark40000
· Личное сообщение · #8

SVLab пишет:
004019DA E8 D7060600 CALL <JMP.&KERNEL32.LocalAlloc>выделяет память под таблицу, смотри, что в eax после нее, там и твои данные недалеко.

при выполнении данной строчки в стеке лежит
0012ED00 00000040 |Flags = LPTR
0012ED04 00003270 \Size = 3270 (12912.)

объясните пожалуйста момент :
здесь получаеться в программе выделяеться столько памяти, сколько будет занимать вся эта таблица с Сетевыми устройтсвами... ? а затем 004019E8 E8 4B050600 CALL <JMP.&IPHLPAPI.GetIfTable> заполняет все эти Size = 3270 (12912.) . и получаеться теперь нам надо найти этот кусок памяти длинной в 3270 символов(бит ?) , в нем лежит вся эта инфа,, и ее уже как заблагорассудиться можно менять, на все что захочешь. я правильно понял..?

только опять непонятно... в каком месте выделино это место длиной 3270.. ? с какого адреса..
после выполнения 004019DA E8 D7060600 CALL <JMP.&KERNEL32.LocalAlloc> EAX = 001602F0, если смотреть в Dumpe - там пусто по этому адресу...



Ранг: 133.4 (ветеран), 57thx
Активность: 0.110
Статус: Участник

Создано: 09 июня 2009 01:29
· Личное сообщение · #9

Первый вызов GetIfTable определяет, сколько памяти нужно, LocalAlloc выделяет память и возвращает в eax адрес начала блока, второй вызов GetIfTable заполняет структуры.
После LocalAlloc там, естественно, будет пусто. После GetIfTable также достаточно много нулей, покрути вниз.


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


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