Kilka pytań odnośnie programowania

Wszystko dla programistów. C++, Delphi, Java, PHP, SQL
Cześć :)

Kilka doprecyzowań / wyjaśnień

1. Metody o których mówisz nie wykrywają debuggera w dosłownym znaczeniu, tylko umożliwiają wykrycie pewnego rodzaju zachowań debuggera, a konkretniej trybu krokowego, oraz breakpointów sprzętowych (ale to ostatnie tylko w teorii ;>)

2. Na 16 bicie jest flaga RF, Resume Flag, która jest używana do wyłączenia (ważne) hardware exceptions na czas jednej instrukcji.
Czyli, teoretycznie masz rację - można by wykryć czy w danym miejscu (mówimy tutaj o rozdzielczości typu jedna instrukcja, więc jest to mało użyteczne) został ztriggerowany hardware exception, a następnie debugger powrócił. Teoretycznie można by taką pułapkę przygotować instrukcją PUSHFD, która wrzuci wszystkie flagi na stos, a potem byśmy mogli sprawdzić czy na stosie jest zapalony bit 16.
Albo lepiej! Teoretycznie moglibyśmy w miarę często ustawiać za pomocą POPFD flagę RF, tak aby hardware breakpointy nie działały!

Ale niestety, jak to zwykle bywa, diabeł tkwi w szczegółach.
Cytat z manuala Intela (tom 2B):
[quote="Intel o PUSHFD"]When copying the entire EFLAGS register to the stack, the VM and RF flags (bits 16 and 17) are not copied; instead, the values for these flags are cleared in the EFLAGS

Czyli, instrukcji PUSHFD sobie nie użyjemy do zapiasnia RF na stosie, więc z pułapki numer jeden nici.

Drugi cytat z manuala Intela (tym razem tom 3B):
[quote="Intel o RF"](Note that the POPF, POPFD, and IRET instructions do not transfer the RF image into the EFLAGS register.)

Uu, czyli nici i z ustawiania flagi RF.
Jedyna instrukcja na x86 która ustawia flagę RF to IRETD, która btw jest dostępna tylko w kernel-mode.

Tak na prawdę pozostaje jeszcze jedna opcja - exceptiony!
No i kolejny cytat.
[quote="Intel o RF"]The processor sets the RF flag automatically prior to calling an exception handler for any fault-class exception except a debug exception that was generated in response to an instruction breakpoint.

Czyli, zakładając nawet że system grzecznie poda cały context exception handlerowi w user mode, to dla większości exceptionów sam CPU zapala flagę RF - czyli zaburza pomiar.

Ale zostaje debug exception, czyli hardware breakpoint, który przecież chcemy sprawdzić właśnie czy był czy nie był wywołany i który i tak by najpierw debugger dostał w swoje ręce. Więc wracamy do punktu wyjścia.

Podsumowując, RF nam się do tego nie przyda...

3. Natomiast wykrywanie flagi TF działa bardzo dobrze w twoim kodzie ;>
[quote="gdb"](gdb) break *(_start+1)
Breakpoint 1 at 0x8048081
(gdb) r
Starting program: /home/gynvael/t2
Failed to read a valid object file image from memory.

Breakpoint 1, 0x08048081 in _start ()
(gdb) si
0x08048082 in _start ()
(gdb)
0x08048083 in _start ()
(gdb)
0x08048088 in _start ()
(gdb)
0x0804808d in _start ()
(gdb)
0x08048099 in dbg ()
(gdb)
0x0804809e in dbg ()
(gdb)
0x080480a3 in dbg ()
(gdb)
0x080480a8 in dbg ()
(gdb)
0x080480ad in dbg ()
(gdb)
Debugger jest włączony
0x080480af in dbg ()
(gdb)
0x0804808f in powrot ()
(gdb) q
The program is running. Exit anyway? (y or n) y

Po prostu pamiętaj że flaga TF jest zapalana przez debugger tylko i wyłącznie w trybie single step / trace / etc, a nie jest zapalona przez cały czas. Czyli jeżeli reverser wpadnie tracem na pułapkę testującą flagę TF, to zostanie wykryty, a jeżeli korzysta np. tylko z breakpointów, lub stepuje daleko od pułapki, to pozostanie nieuchwytny ;>

Możesz natomiast próbować w drugą stronę, tj ustawić flagę TF, i sprawdzić czy poleci wyjątek czy debugger to obsłuży (powinien polecieć wyjątek, chociaż dobre debuggery to wyemulują).


OK, jedziemy dalej
[quote]Czy da się, żeby w krokowym debuggowaniu gdb wyświetlał nie tylko adres aktualny a także disassembling aktualnej instrukcji? Mało wygodne jest ciągłe disassemble i wyszukiwanie instrukcji

Tak, można:
display/x $eip
Możesz sobie to w jakieś .gdbinit wrzucić ;>

[quote]
Czytałem też o zrzucaniu programu z pamięci do pliku (z videoartów G. ColdWinda), np. żeby ominąć szyfrowanie i spakowanie. Chciałbym to zrobić np. w gdb, ale znalazłem tylko dump binary from to, dump memory from, to, generate-core-file

GDB niestety nie został stworzony do reversowania, tylko do source-level debugging (stąd pokaźne wsparcie dla C/C++).
Z tego co wymieniłeś, generate-core-file jest najbliższe zrzutowi pamięci, tyle że potem z pliku core trzeba exeka wydobyć. Były do tego jakieś automaty, ale szczerze to nie pamiętam jakie. Na pewno można ręcznie wydobyć ten plik (np. znaleźć początek nagłówka elf w pliku core od exeka i go za pomocą polecenia dd wyextraktować).

[quote]Problem jest w tym, że generate-core-file np. dla programu kadu zrzuciło ok. 120 MB, no takiej wielkości to cały kadu nie ma
Mam pytanie co więc zrzuca?
Rzuć sobie okiem hexedytorem w ten plik. Znajdziesz tam m.in. wszystkie liby, zaalokowaną pamięć, etc.

[quote]A jeżeli dump binary to nie wiem ile danych kopiować (rozmiar pliku?)?
Rozmiar image'a w pamięci. Nie wiem jak z korektą sekcji potem będzie.

[quote]RET znajduje się w ebp+4 ? (ret ponoć znajduje się nad zrzutem aktualnego esp)?
To zależy. Jeżeli jesteś w funkcji w której był stworzony stack frame (czyli na początku funkcji było push ebp; mov ebp, esp), to tak, RET jest na [EBP+4].
Natomiast jeżeli nie było stack frame'a, to RET jest 'gdzieś na stosie', i to zależy wyłącznie od twojej pozycji w kodzie, i od tego ile operacji na stosie (push, pop, add esp, sub esp, etc) było wykonanych, w jakiej kolejności, etc, czyli musisz wyliczyć o ile ESP się zmieniło od początku funkcji, odjąć tą delte od ESP, i tam będziesz miał RET.

[quote]Co zrobić jeżeli aplikacja jest zaszyfrowana, olldbg sam to wykrywa, a podczas debuggowania wysypuje się Segmentation fault, na gdb też. Raczej to jest zabezpieczenie więc co mogę z tym fantem zrobic?
Odszyfrować!
Rzuć okiem na reversecrafty o dumpowaniu (ale z tego co widzę już rzucałeś okiem), pomyśl czy by OEP nie przywrócić, odbudować importy, etc.
Ewentualnie przeanalizuj krok po kroku jak loader deszyfruje sekcje. W pewnym momencie skrystalizuje ci się co zrobić.

Ad ostatnie pytanie.
Wystaw plik z resami, trudno to testować.
Z tego co skompilowałem to u mnie wyświetla OK, albo Open albo Save As.
Btw, flaga OFN_FILEMUSTEXIST nie może w Save występować wg dokumentacji.

OK tyle,
[color=#0080FF]gynvael.coldwind[/color]//[color=#00FF00]vx[/color]
http://gynvael.coldwind.pl
Gynvael Coldwind
Przyjaciel
Avatar użytkownika
Posty: 1633
Dołączył(a): N lip 25, 2004 17:08
Podziękował: 53 razy
Podziękowano: 184 razy
Reputacja: 23041
Góra

Spokojnie - to tylko reklama - zniknie po zalogowaniu :)

Pani Reklama
Automat
Posty:
Dołączył(a): ab aeterno
Lokalizacja: UW-Zaloga

Powrót do Programowanie

Kto przegląda forum

Użytkownicy przeglądający ten dział: Bing [Bot], Exabot [Bot], Google [Bot] i 1 gość