2012-04-15 11 views
7

Mamy DLL, w którym zgubiliśmy źródło, więc próbuję dowiedzieć się, jak to działa przez IDA Dissembler. Jednak nie wydaje się być funkcja, że ​​nie można uzyskać dostępu, bo pojawia się następujący błąd:IDA - dodatnia wartość sp została znaleziona błąd

Decompilation failure: 
46AFAF: positive sp value has been found 

Patrząc na stronie internetowej ARP to do powiedzenia:

The stack pointer at the specified address is higher than the initial stack pointer. 
Functions behaving so strangely can not be decompiled. If you see that the stack 
pointer values are incorrect, modify them with the Alt-K (Edit, Functions, Change 
stack pointer) command in IDA. 

http://www.hex-rays.com/products/decompiler/manual/failures.shtml#04

Rejestracja Jestem nowy w całej scenie Dissembling, każdy może dostarczyć więcej informacji na temat tego, co powoduje, że wskaźnik stosu jest wyższy niż początkowy wskaźnik stosu i czy można go naprawić. Dziękujemy za poświęcony czas

Odpowiedz

15

Zwykle dzieje się tak, gdy funkcja ma wiele zwrotów, a ida tego nie zauważyła. Rozwiązaniem jest użycie alt-k, aby zmienić offset odsadzenia stosu z powrotem na żądaną wartość.

Przykładem z kodem ARM:

.text:00012A10     MOV  R0, #1   ; -0xd0 + 0 
.text:00012A14     ADD  SP, SP, #0xC8 ; -0xd0 + 0xc8 
.text:00012A18     LDMFD SP!, {R4,PC} ; -0x08 - 0xc8 <<< modified 
.text:00012A1C ; --------------------------------------------------------------------------- 
.text:00012A1C 
.text:00012A1C loc_12A1C        ; CODE XREF: sub_129E4+20j 
.text:00012A1C     MOV  R3, #0   ; -0xd0 + 0 

W komentarzach pisałem wartości alt-K. Przy 0x12A18 przesunięcie SP zostało ponownie ustawione na -0xd0

+0

Dzięki, że było bardzo pomocne –

+12

Wskazówka: w * Opcje *> * Ogólne *, możesz włączyć opcję * Wyświetl wskaźnik stosu * po lewej stronie każdej instrukcji , co ułatwia zobaczenie, gdzie się zmienia i jak, szczególnie w trybie graficznym. – DCoder

Powiązane problemy