[asm] Segment idata - modyfikacja

0

Piszę programy w fasm, chciałbym się temu bardziej przyjrzeć.
Wpisałem takie coś:

section '.idata' import data readable writeable
sekcja:                 ;<- na koncu o tym napisze ;]
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x30, 0x00, 0x00
db 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
db 0x00, 0x00, 0x00, 0x00, 0x55, 0x73, 0x65, 0x72, 0x33, 0x32, 0x2e, 0x64, 0x6c, 0x6c, 0x00, 0x00
db 0x38, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67
db 0x65, 0x42, 0x6f, 0x78, 0x41  

A w segmencie kodu mam tak:

section '.code' code readable executable
        push 0
        push 0
        push 0
        push 0
        db 0xFF, 0x15, 0x30, 0x30, 0x40, 0x00
ret

Program elegancko działa :-)
To znaczy wyskakuje komunikat(ShowMessageA).
0x00403000 to jest adres wirtualny do danych w segmencie .idata
I sie zgadza, bo pod adresem 0x0040300C jest wartość 0x24(załadowana z pliku)
Gdy zmodyfikuje wartość tą to powinnien być błąd przy wykonaniu tej instrukcji
db 0xFF, 0x15, 0x30, 0x30, 0x40, 0x00 (to jest "call ds:[0x00403030]")
A jednak nic się nie dzieje [???]
Próbowałem modyfikować dane "skekcja".
Co robie źle?

0

Zaobserwowałem coś ciekawego:

;fasm
format PE GUI 4.0
entry start

include 'win32a.inc'

section '.data' data readable writeable
db "BRAK DANYCH", 0

section '.code' code readable executable

start:
        mov [0x00403024], byte '#'                       ; <- popsucie nazwy biblioteki
        push 0
        push 0x00403024
        push 0
        push 0
        db 0xFF, 0x15, 0x30, 0x30, 0x40, 0x00
        ret
ret

section '.idata' import data readable writeable
wdata:
db 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x30, 0x00, 0x00
db 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
db 0x00, 0x00, 0x00, 0x00, 0x55, 0x73, 0x65, 0x72, 0x33, 0x32, 0x2e, 0x64, 0x6c, 0x6c, 0x00, 0x00
db 0x38, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67
db 0x65, 0x42, 0x6f, 0x78, 0x41     

Wywala komunikat z nazwą biblioteki "#ser32.dll"
Więc sekcji idata nie da sie edytować tak aby "zastosowały" się zmiany?
Chcę zrobić taki program "dynamiczny" który by sobie importował biblioteki itp.
Tylko nie za pomocą LoadLibrary czy jakoś tak ;-P

0

łolaboga !!!!
Poprzez DD deklarujesz double word czyli 4 bajtową zmienną, przez co kod jest o wiele czytelniejszy.

Sekcja .idata, a w zasadzie import directory (bo nie zawsze IAT siedzi w .idata) zwykle jest tylko do odczytu. Jeżeli chcesz coś w nim zmienić, to musisz zmienić prawa dostępu do sekcji w nagłówku pliku albo zmienić prawa dostępu do załadowanego obszaru pamięci. Tak czy owak taka zabawa nie ma sensu, bo IAT jest analizowany w momencie inicjalizacji programu i nigdy więcej. Co prawda istnieje coś typu delay import ale o tym poczytać sobie możesz więcej w dokumentacji MS, do której linka nieraz już wrzucałem na forum.

Jeżeli chcesz pobrać adres funkcji bibliotecznej / uchwyt modułu, to poprzez TIB możesz dostać się do struktury przechowującej adresy załadowanych modułów.

0

ok, nie mam czasu wykład dotyczący budowy importów... szukajka się zepsuła? Kiedyś o tym pisałem:
http://4programmers.net/Forum/355784#id355784 i tak dalej do końca tematu...

Więc sekcji idata nie da sie edytować tak aby "zastosowały" się zmiany?
Chcę zrobić taki program "dynamiczny" który by sobie importował biblioteki itp.
Tylko nie za pomocą LoadLibrary czy jakoś tak ;-P
OMG, importy są analizowane przez loader podczas składania modułu do kupy w pamięci, jeszcze przed wywołaniem EntryPointu. Potem możesz je nadpisać, jeżeli IAT dasz powiedzmy w sekcji kodu to ew. relokacje i importy możesz dać w ostatniej sekcji i dodać atrybut discardable. W niektórych compo stosowałem sztuczkę polegającą na użyciu katalogu importów jako obszaru na zmienne - po prostu zapisywałem tam co swoje. Katalog Import traci swoje znaczenie w momencie ukończenia inicjowania modułu przez system, eot.

db 0xFF, 0x15, 0x30, 0x30, 0x40, 0x00

[rotfl] człowieku, pod fasm-em możesz napisać spokojnie:

call dword [0x403030]

p.s. jak nie chcesz używać LoadLibrary to na NT możesz użyć LdrLoadDll z ntdll.dll ;P OK, "jak coś" to napisz konkretnie co chcesz osiągnąć bo takie kombinowanie jest pozbawione sensu.

0
deus napisał(a)

Katalog Import traci swoje znaczenie w momencie ukończenia inicjowania modułu przez system, eot.

Prócz tablic zawierających wskaźniki do pobranych funkcji bibliotecznych ;)

0
CyberKid napisał(a)
deus napisał(a)

Katalog Import traci swoje znaczenie w momencie ukończenia inicjowania modułu przez system, eot.

Prócz tablic zawierających wskaźniki do pobranych funkcji bibliotecznych ;)
Tablice wskaźników to już katalog IAT /nie zawsze jest oznaczany ponieważ niektóre wpisy w Import na niego wskazują/, nie Import ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0