Pytanie:
Dlaczego IDA dodaje instrukcje „db” pomiędzy zdemontowanym kodem
Thomas Perl
2017-08-25 17:13:57 UTC
view on stackexchange narkive permalink

Próbuję przeanalizować plik COM MS-DOS, który napisałem kilka lat temu za pomocą IDA Free 5.0, od tego czasu zmieniłem nazwę segmentu na code_and_data i nazwałam stałe oraz ustawiłem typy danych prawidłowo. Jednak patrząc na demontaż, otrzymuję pseudo-instrukcje db na liście, na przykład:

 code_and_data: 0106 replace_irq_handler:; XREF DANYCH: start + 81ocode_and_data: 0106 clicode_and_data: 0107 push bxcode_and_data: 0108 db 3Ehcode_and_data: 0108 cmp byte ptr ds: 3BEh, 'C'code_and_data: 010E jnz short call_original_dos_interrupt: cmpdata_interrupt: 3bdata_kod: 3bEhc: 'code_and_data: 0116 jnz krótki call_original_dos_interrupt_handlercode_and_data: 0118 db 3Ehcode_and_data: 0118 cmp byte ptr ds: 3C2h' K'code_and_data: 011E jnz krótki call_original_dos_interrupt_handlercode_and_data: 0120 db 3Ehcode_and_data: 0120 cmp byte ptr ds: 3C4h „O'code_and_data: 0126 jnz krótki call_original_dos_interrupt_handlercode_and_data: 0128 db 3Ehcode_and_data: 0128 cmp bajt ptr ds: 3C6h, 'N'code_and_da ta: 012E jnz short call_original_dos_interrupt_handlercode_and_data: 0130 push StartOfIndexTablecode_and_data: 0133 pop bx 

Rozumiem, że nie ma tam żadnych dodatkowych bajtów, ponieważ db i cmp instrukcja po rozpoczęciu od tego samego adresu (patrz lewa kolumna). Dlaczego IDA wyświetla / dodaje te pseudo-instrukcje db ?

Czy istnieje sposób, aby powiedzieć mu, aby ich nie pokazywał, czy też jest powód, dla którego może to być przydatne (mogę się tylko domyślać, że ponieważ ten sam segment jest używany zarówno do kodu, jak i do danych, stara się być „pomocny” i pokaż kod również jako dane)?

Ale jeśli tak, to dlaczego pokazuje tylko pierwszy bajt instrukcji (jeśli spojrzysz ponownie na adresy po lewej stronie, te instrukcje są dłuższe niż 1 bajt).

Czy instrukcja db nie jest sposobem dekompilatora na powiedzenie "Nie mogę tego zrozumieć, prawda?"
Dwa odpowiedzi:
Michael Karcher
2017-08-25 23:14:30 UTC
view on stackexchange narkive permalink

Bajt 3Eh to kodowanie segmentu zastępującego DS: . Obserwujesz to w instrukcji takiej jak

  cmp byte ptr ds: 3BEh, 'C'  

Kodowanie szesnastkowe tej instrukcji to (zrobiłem to ręcznie , część może być błędna)

  3E - prefiks przesłonięcia segmentu 80 - 8-bitowa instrukcja ALU 3E - bajt mod / rm (reg = 7 -> instrukcja to CMP, mod = 0 / rm = 6 - > bezpośredni adres) BE 03 - przesunięcie danych do porównania43 - natychmiastowy bajt danych  

Sekwencja 3E 80 3E BE 03 53 ma długość 6 bajtów, co odpowiada rzeczywista długość instrukcji 6 bajtów ( 010Eh - 0108h ). Jeśli montujesz kod źródłowy asemblera podany przez IDA przy użyciu standardowego asemblera x86 (takiego jak MASM ), prefiks DS: zostanie pominięty, ponieważ tryb adresowania „adres bezpośredni ”jest domyślnie względem segmentu danych. IDA pokazuje dodatkową instrukcję DB , aby powiedzieć ci (lub asemblerowi, który próbuje ponownie złożyć listę), że nadmiarowy, zbędny prefiks segmentu jest w rzeczywistości zakodowany w pliku binarnym. Jeśli chcesz ukryć te informacje, wybierz Opcje -> Ogólne -> Analiza -> "Opcje analizy specyficzne dla procesora" -> "Nie wyświetlaj zbędnych przedrostków instrukcji".

Dzięki, to jest naprawdę szczegółowe. Podane przez ciebie kodowanie szesnastkowe instrukcji jest takie samo jak w moim pliku wejściowym. A ta opcja była tym, czego szukałem, włączenie jej powoduje ukrycie pseudoinstrukcji `db` na liście. Fajne!
Megabeets
2017-08-25 18:23:40 UTC
view on stackexchange narkive permalink

Edytuj: Dziękuję Michał za wyjaśnienie, to nie są wskazówki dotyczące gałęzi, ale prefiksy segmentów. Zachowując odpowiedź jako odniesienie i dla osób pochodzących z wyszukiwarek.


Są to „Wskazówki dotyczące gałęzi” , których celem dać przetwórcy „wskazówkę”, czy istnieje prawdopodobieństwo wystąpienia rozgałęzienia.

Przewidywanie rozgałęzień

Jest używane do optymalizacji, która nazywa się Prognozowanie gałęzi - jest to próba wykonywana przez procesor w celu przewidzenia, którą gałąź zajmie kod. Procesor może kontynuować przetwarzanie, przyjmując założenia dotyczące kierunku rozgałęzienia, zanim warunek zostanie rozwiązany. W przeciwnym razie „siedział” i czekał na rozwiązanie warunku, od którego zależna jest gałąź.

Z Wikipedii:

W architekturze komputerowej predyktor rozgałęzienia to obwód cyfrowy, który próbuje odgadnąć, który sposób, w jaki gałąź (np. struktura if-then-else) pójdzie, zanim będzie wiadomo. Zadaniem predyktora rozgałęzienia jest poprawa przepływu w potoku instrukcji. Predykatory rozgałęzień odgrywają kluczową rolę w osiąganiu wysokiej efektywnej wydajności w wielu nowoczesnych architekturach mikroprocesorów potokowych, takich jak x86.

Wskazówki dotyczące gałęzi

Możesz wskazać procesorowi prawdopodobieństwo, że gałąź zostanie wzięta, używając bajtów podpowiedzi, które są wstawiane przed warunkową instrukcją skoku. Jest to robione za pomocą bajtów wskazujących gałąź, które są wstawiane bezpośrednio przed warunkową instrukcją skoku.

Bajty to 3Eh i 2Eh i odpowiednio mają następujące znaczenie:

2Eh - wskazówka, że ​​gałąź nie będzie występować przez większość czasu.
3Eh - wskazówka, że ​​gałąź będzie występować przez większość czasu.

Więcej informacji:

Więcej o podpowiedziach i optymalizacji gałęzi możesz przeczytać tutaj (zalecane) i tutaj.
Jeśli chcesz przeczytać więcej o Branżowych prognozach, polecam ten artykuł o dynamicznym przewidywaniu gałęzi.

To ma sens, dziękuję - znam koncepcję unikania błędnych przewidywań dotyczących gałęzi z makr GLib `G_LIKELY ()` / `G_UNLIKELY ()`. Ciekawe jest to, że wskazówki dotyczące gałęzi istnieją od tak dawna. Czy jest to więc wada IDA, że nie generuje dla nich pseudo-assemblacji?
odrzucony, ponieważ ta odpowiedź jest pomijana w pytaniu. `2Eh` i` 3Eh` działają tylko jako wskazówki do gałęzi, jeśli poprzedzają instrukcję skoku. W tym przypadku poprzedzają instrukcję pamięci i działają w oryginalny sposób - to znaczy jako prefiksy segmentów.


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...