Dodanie do IAT wlasnej Dll'ki

Dodanie do IAT wlasnej Dll'ki
0

witam
Poszukuje artykulu lub przykladowego kodu przedstawiajacego sposob dodawania do tabeli importow nowej dll'ki.
Przyklad jaki znalazlem http://sandsprite.com/CodeStuff/iat_hook.zip
niestety nie pokazuje w jaki sposob tablica importow zostala zmodyfikowana.
Pozdrawiam

CK
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 2 lata
  • Postów:2692
0

Znaczy się chcesz aby loader załadował dodatkową bibliotekę podczas ładowania całego programu?

Jeśli tak to pomocna Ci będzie dokumentacja Microsoftu na temat formatu PE i COFF

http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx

dzejo
  • Rejestracja:ponad 18 lat
  • Ostatnio:prawie 12 lat
  • Postów:787
0

0

Mhm thx za info.
"Znaczy się chcesz aby loader załadował dodatkową bibliotekę podczas ładowania całego programu?"
Dokladnie tak.Takze jak by ktos mial kod zrodlowy aplikacji o takim dzialania to byl bym wdzieczny.

dzejo
  • Rejestracja:ponad 18 lat
  • Ostatnio:prawie 12 lat
  • Postów:787
0

niestety nie pokazuje w jaki sposob tablica importow zostala zmodyfikowana.

Nie została zmodyfikowana .

Przykład zawiera dwa programy , bez dołączonej biblioteki Hook i z Hook_IAT.
Biblioteka Hook_IAT została dołączona do programu w trakcie kompilacji .
W trakcie uruchamiania programu następuje ładowanie MSVCRT.dll , następnie
ładowanie Hook_IAT.dll . Uruchomienie Hook_IAT.dll powoduje zamianę adresu
'strcmp' oryginalnego na adres funkcji w Hook_IAT.dll.

Adres w tablicy przekierowania do 'strcmp' jest uzyskany po deasemblacji oryginalnego
kodu programu , jmp , i tam jest wpisywany adres funkcji m_strcmp z biblioteki Hook_IAT.dll.
Czyli jest to zrobione na piechotę .

Teraz trzeba się zastanowić jak to zrobić w sposób dynamiczny .
czyli załadowac Hook_IAT.dll do pierwszej wersji programu i wykonać kod m_strcmp .
Nie jest to proste zadanie .

Resztę muszę przemyśleć .. [green]


0

Zeby sprawa byla jasna, chcĘ uzyskac taka sama funkcjonalosc jak LordPE w tym tutku
http://www.craigheffner.com/tute/tute3.html

dzejo
  • Rejestracja:ponad 18 lat
  • Ostatnio:prawie 12 lat
  • Postów:787
0

:-D No niezłe jaja , to może być trochę kodu , napisz maila niech przyśle żródła .
To stary Haker , myślisz że ten problem można rozwiązać postami na forum ?

Może ktoś poda linki , bo temat jest morderczy i za rozwlekły .

Ja bym spróbował inaczej , załadować program Hook-owany własnym programem i spróbować
wcisnąć bibliotekę do jego przetrzeni adresowej , to masa kombinacji .. może mi się zechce,
nie robiłem jeszcze takich wynalazków.
To bardziej mi się podoba , bo jak pomyslę o przebudowie gotowego .exe to robi mi się słabo .
Zresztą Lord napisał już taki program :-D .


0

Z wstrzyknieciem dllki do procesu nie ma problemu :-) ,chcialem po prostu przetestowac sposob ktory prezentuje autor tego artykulu.No ale of course bez uzycia LordPE ;-) .

dzejo
  • Rejestracja:ponad 18 lat
  • Ostatnio:prawie 12 lat
  • Postów:787
0

Yhy , ale i tak nie obedzie się bez dokładnego grzebania w PE nawet z poziomu uruchomionego
procesu , niestety z mojej strony były by to na razie eksperymenty okupione czasem spędzonym
na kodowaniu , ciekawy temat ale na razie nie sądzę abym mógł to wykonac w jakimś określonym czasie ,
tak że pozdrowienia i
miłego czekania na propozycje .

Właściwie to spróbuję przerobić podany przez ciebie przykład na "dynamiczny" .. ale nie wiem ile
zajmie to czasu .Tzn podstawienie własnej biblioteki do programu i podpięcie się pod funkcję
systemową .
Kontynuacja :

http://4programmers.net/Forum/viewtopic.php?id=104080

Idzie się zarypać :-D , cos może wymyślę , ale fajnie by było jak by ktos jeszcze
wrzucił jakieś propozycje ...
Pozdro [green]

Ale nie na ch.. się mordowac .
Jeśli interesują Cię te tematy to przejrzyj Ziny z tej strony

http://www.ctrl-d.prv.pl

W jednym jest o dodaniu funkcji zabezpieczjącej program , czyli zmiana Punktu
Wejścia do .exe dołączenie własnej .dll , wykonanie kodu i powrót do programu (o ile pamiętam ).
Zależy jaką funkcjonalność chcesz uzyskać .
Bo wygodniej jest dodać nową sekcję do .exe a nie grzebać sie w jego przebudowie .


0

Oj zmian dokonywanych przez LordPE nie jest zbyt wiele.Wrzuc sobie zmienionego notepada i orginalenego np do HexWorkshop'a i porownaj ;-)

dzejo
  • Rejestracja:ponad 18 lat
  • Ostatnio:prawie 12 lat
  • Postów:787
0

Domyślam się że nie ale luknij tu :
Moja strona :
http://win32prog.republika.pl/asm/asm.html

http://win32prog.republika.pl/

I na 4programmers

http://4programmers.net/Forum/viewtopic.php?id=104575

to zobaczysz w jakie g.. sie pakujesz .

Na razie nie dokończyłem rozważań na temat PE i zanim dojdę do importów to miną
miesiące [green]

Namiar na Ziny który Ci podałem jest OK . Sciągnij wszystko i przejrzyj , jest trochę
grzebania , ale mysle że znajdziesz coś ciekawego.

Zresztą widze Deusa on posiada więcej wiedzy na ten temat ...
Pozdro


deus
  • Rejestracja:prawie 21 lat
  • Ostatnio:ponad 12 lat
0
dzejo napisał(a)

Zresztą widze Deusa on posiada więcej wiedzy na ten temat ...

widać, rzucam się w oczy [rotfl]
OK, przejdę może do rzeczy: w C ostatnio piszę rzadko, do tego temat jest bardziej hm... niskopoziomowy więc będę się wspierał asmem.

W plikach PE występuje sporo różnych katalogów /a konkretnie to w nagłówku/, m. in. importów. Zanim przejdę do jego omówienia wspomnę czym jest RVA. RVA to mówiąc łopatologicznie adres liczony względem początku modułu. Mały przykład: powiedzmy, że nasz program znajduje się w pamięci pod adresem 0x400000 /standardowy IMAGE_BASE dla plików exe, IMAGE_BASE to też uchwyt do modułu... tak, w tym przypadku uchwyt jest wskaźnikiem/ natomiast jakaś_funkcja jest pod adresem 0x4010FF /czyli od bajtu 0xFF pierwszej sekcji... chyba, że adres pierwszej sekcji będzie niestandardowy/. RVA tej funkcji wynosi więc 0x4010FF - 0x400000 czyli 0x10FF. Należy pamiętać, że RVA nie zawsze jest równe offsetowi w pliku binarnym - sekcje mogą mieć inny /większy/ rozmiar w pamięci niż w pliku, np. sekcja '.bss' zawierająca wyłącznie dane niezainicjowane nie istnieje fizycznie w pliku - istnieje tylko wpis w nagłówku określający jej charakterystykę i rozmiar w pamięci.
Po dokładny opis wszystkich struktur i pól odsyłam na msdn, opiszę tylko to, co jest nam potrzebne do podstawowych operacji na tablicy importów /forwardowanie chyba sobie odpuszczę/. Katalog importów to tablica struktur składających się z 5 dwordów. Pierwsze 3 pola w sumie nas nie interesują /charakterystyki, info o czasie i forwardowaniu/. Pole 4 to RVA nazwy modułu, zaś 5 to również RVA/w sumie jak wszystkie adresy w strukturach PE/, który wskazuje na tablicę struktur IMAGE_THUNK_DATA /chyba tak to się nazywało... nie chce mi się sprawdzać... po padnięciu dysku nawet Lorda nie mam/. Katalog importów /jak każdy inny/ musi być wyrównany do 0x20, kończy go zaś pusty wpis - wszystkie 5 dwordów wyzerowane /ew. -1.../. Tyle jest wymagane do działania samego katalogu.
Teraz kolejna tablica /czy też może tablice/ wskazywana przez 5 dword katalogu. Jej zawartość to dwordy, sama również kończy się pustym /zerowym/ dwordem. Każdy wpis można interpretować na 3 sposoby, jako adres nazwy forwardowanej funkcji /to nas nie obchodzi aktualnie/, jako numer funkcji z pliku dll /ordinal, każda exportowana funkcja ma przypisany przy eksportowaniu numer/, bądź jako wskaźnik na... kolejną strukturę zawierającą hint /word, w sumie zbędny... zwykle 0/ i nazwę funkcji. Wskaźniki jak się pewnie domyślacie to RVA, ordinal zaś ma wartość 0x80000000 + numer_funkcji /czyli najwyższy bit dworda ustawiony - znacznik ordinala/. Thunki są podmieniane przez systemowy loader na adresy importowanych funkcji. Dobra, trochę namieszałem... Mały przykład w asm /pod fasma/:

Kopiuj
format PE Console

section '.deus' code readable executable

entry $
        jmp     $

        align   0x20
  data import   ; oznacz adres jako poczatek katalogu importow
        dd      0, 0, 0, RVA _nazwa_liba1, RVA _thunki_liba1
        dd      0, 0, 0, RVA _nazwa_liba2, RVA _thunki_liba2
        dd      0, 0, 0, 0, 0  ; pusty wpis - koniec
  end data      ; oznacz jako koniec

_nazwa_liba1    db 'libek1.dll', 0
_nazwa_liba2    db 'jakis_inny_libek.dll', 0

_thunki_liba1:
Proc_1_z_liba   dd RVA __Proc1_z_liba1  ; import porzez nazwe
Proc_2_z_liba   dd RVA 0x80000020       ; import poprzez ordinal funcji o numerze 0x20
                dd 0                    ; koniec wpisow dla tej biblioteki
_thunki_liba2:
inna_procka     dd RVA __inna_procka
                dd 0

__Proc1_z_liba1 dw 0                    ; hint - podpowiedz dla loadera /ordinal/
                db 'jakas_procka_z_libek1', 0
__inna_procka   dw 0
                db 'insza_procka_z_inszego_liba', 0

ok, omawiamy... a jest co omawiać? Wszystko zgadza się z tym co napisałem wcześniej, ale co tam... W katalogu importów widzimy 3 wpisy /3 jest pusty - koniec katalogu/. Zbędne dla nas pola są wyzerowane. Pierwszy wpis powoduje załadowanie biblioteki o nazwie 'libek1.dll' /jak widzimy nazwa dll'a to zwykły ansi string zakończony nullem/. Z 'jakis_inny_libek.dll' jest podobnie. Tablica _thunki_liba1 zawiera 2 wpisy + terminator. Pierwszy wskazuje na strukturę costam_IMPORT_BY_NAME /nie chce mi się szukać ;P/, drugi dword to ordinal - najwyższy bit ustawiony oznacza, że niższy word jest numerem, z jakim dana funkcja została wyeksportowana i wedle którego na zostać zaimportowana /w tym wypadku 0x20/. Teraz ostatni element układanki czyli IMPORT_BY_NAME - word na początku /hint/ sugeruje jaki ordinal ma dana funkcja, ale to tylko podpowiedź /aby system najpierw sprawdził czy funkcja o tym ordinalu jest poszukiwaną zamiast przeszukiwać wszystko po kolei... zwykle i tak musi ;P/ , znaczenie ma tutaj nazwa zapisana po nim. Wielkość liter ma znaczenie! I tu może wtrącę małą uwagę: autor tematu się myli - IAT to tablica adresów importowanych funkcji, nie katalog importów. W naszym przypadku IAT to obszar od _thunki_liba1 do __Proc1_z_liba1. OK, może teraz jakiś działający program?

Kopiuj
format PE GUI

        push    0
        push    0
        push    _info
        push    0
        call    [MessageBoxA]
        push    0
        call    [ExitProcess]

_info   db 'Mam recznie zbudowana tabele importow!?', 0
        align   0x20
  data import   ; oznacz adres jako poczatek katalogu importow
        dd      0, 0, 0, RVA _kernel32, RVA ExitProcess
        dd      0, 0, 0, RVA _user32, RVA MessageBoxA
        dd      0, 0, 0, 0, 0  ; pusty wpis - koniec
  end data      ; oznacz jako koniec

_kernel32       db 'kernel32.dll', 0
_user32         db 'user32.dll', 0

; poczatek IAT
ExitProcess     dd RVA _ExitProcess
                dd 0
MessageBoxA     dd RVA _MessageBoxA
                dd 0
; koniec IAT
_ExitProcess    dw 0 ; hint - i tak w kazdej wersji dlla sa inne ordinale
                db 'ExitProcess' ; za nulla robi hint z _MessageBoxA
_MessageBoxA    dw 0
                db 'MessageBoxA'

W przypadku braku informacji o entry poincie fasm ustawia na poczatek pierwszej sekcji. Jeżeli sekcja nie jest zdefiniowana fasm tworzy sekcję '.flat' o uniwersalnych atrybutach /ERW/. Co robi nasz programik? Wyświetla messageboxa i kończy proces /można też wrócić do kernela poprzez ret jeżeli jest to jedyny wątek/. Jak już pisałem loader windowsowy podmienia wpisy w thunkach /IAT/ na adresy importowanych funkcji. W sumie to to są dla mnie oczywiste rzeczy ale większość pewnie nie wie, gdzie góra a gdzie dół więc pytać :-) Jak widać IAT i katalog importów nie są zbyt skomplikowane /exporty są 'ciekawsze'/. Jak dodać własny wpis do katalogu - dll'kę? Można sprawdzić czy za katalogiem nie ma przypadkiem 20 bajtów /czyli jeden wpis/ wolnej przestrzeni... ale można sobie odpuścić - jeszcze nie widziałem execa /może za wyjątkiem tych cudów z borland'ów/, który miałby tam odpowiednio luźno, zwykle są 'tam' za wąskie ;P. Co nam pozostaje? Najprościej to będzie powiększyć ostatnią sekcję i na jej koniec przenieść katalog powiększony o jeden wpis... ale sam katalog, z powyższego kodu chyba jasno wynika, że thunków ruszać nie wolno /no... prawie, bo dać się da wszystko/. Ew. można też zobaczyć czy na końcu wspomnianej sekcji nie ma odpowiedniej liczby zer. Trzeba sprawdzić, czy rozmiar w pamięci nie jest większy od fizycznego - "takie niby .bss", dopisanie czegoś mogłoby spowodować różne dziwne zachowania programu jeżeli autor zapomniał o inicjowaniu - program zamiast 0 może odczytać np. fragment nazwy naszego liba... a jak tam miał być wskaźnik to się wysypie :>. Jedyne wyjście to dodanie nowej sekcji /kiedyś można było umieścić katalog w nagłówku pliku, ale teraz to już raczej nie trybi/. I tu znów trzeba na uważać - Overlay czyli doklejenie danych na końcu execa, często stosowane przez samorozpakowywacze i inne takie - w nagłówku pliku jest pole SizeOfImage określające rozmiar obrazu wykonywalnego, wszystko co 'wystaje' jest przez system ignorowane i może być potem przez program wygodnie wczytywane. Dobra, tyle teoretyzowania. Jakieś podstawy podałem, potem napiszę mały programik dodający nowy wpis. W sumie to temat jest bardzo rozległy /jeżeli chodzi o budowę plików PE/, to co napisałem jest niezrozumiałe bez podstawowej wiedzy o PE... żeby tą wiedzę podać musiałbym napisać ze 4x więcej i opisać kilkanaście struktur... to już innym razem. OK, piszcie czego nie rozumiecie, ja się zajmę swoimi sprawami a jak będę miał chwilę to rzucę kawałkiem kodu /może nie na wszystkie metody, ale.../.


I nie udawaj, że rozumiesz.
dzejo
  • Rejestracja:ponad 18 lat
  • Ostatnio:prawie 12 lat
  • Postów:787
0

IAT to tablica adresów importowanych funkcji

Tak właśnie działał przykład zamieszczony przez "przechodzień" .A biblioteka nie była
dodawana lecz wkompilowana w .exe . Modyfikowany był tylko wpis dotyczący 'strcmp' poprzez
bibliotekę .

Więc zapytam dla pewności , wystarczy jedynie aby program załadował .dll
i wykonał kod z niego , bez mieszania w importach .

@Deus
Pytanie ignoranta .
Czy koniecznie trzeba zamieszczać nazwy funkcji zawartych w dodanym .dll ,
czy wystarczy dodać tylko informację o nazwie biblioteki a resztę olać .
I czy jest szansa że wtedy wykona się kod inicjujący bibliotekę , bo to chyba by wystarczyło .
Wystarczyło ... to się kurcze rozlazie wszystko bo nie ma miejsca .. :|
Ale bez szczegółów , Tak - czy Nie :-D

Nie grzebałem na razie tak dokładnie w Importach ,z tąd pytanie .
na razie przeryłem budowę PE , sekcje , dodawanie kodu , i takie tam pierdoły
wątek wyprzedził trochę to co do tej pory przeanalizowałem.
Biorę się za lekturę bo mnie to zaciekawiło...


deus
  • Rejestracja:prawie 21 lat
  • Ostatnio:ponad 12 lat
0

Musi być co najmniej jeden import. Ale całość można zmieścić w 28 bajtach+lib:

  • 20 bajtów - wpis
  • 2 thunki /ordinal + null/
  • nazwa
    Ordinala można spisać dowolnego /ważne, żeby taki być w bibliotece/. Mnie jeszcze nigdy ord = 2 nie zawiódł ;P
    Hmmm... na Windows Server 2003 wystarczy tylko pusty thunk :| Z tego co pamiętam to większość wersji Win wymaga jednak pojedynczego wpisu - zawsze się jeden zostawia w packerach ze statycznym ładowaniem bibliotek /wszystkie liby ładowane przez oryginalne importy są zawarte w importach unpackera/.
    czyli na 2k3 przejdzie takie coś:
Kopiuj
dd 0, 0, 0, RVA $ + 28, RVA $ + 4
dd 0, 0, 0, 0, 0
db 'lib.dll', 0

czyli pierwszy dword wpisu jest jednocześnie jedynym thunkiem a nazwa jest za ostatnim wpisem. 20 bajtów + nazwa :>

@poniższy post - dll to Dynamic Link Library, więc brak exportów mija się z celem przy ładowaniu statycznym /przez tablicę importów/.

p.s. piszcie mnie z małej litery :>


I nie udawaj, że rozumiesz.
dzejo
  • Rejestracja:ponad 18 lat
  • Ostatnio:prawie 12 lat
  • Postów:787
0

No dobra , trochę dziwne bo biblioteka wcale nie musi udostępniać jakichś funkcji
dla .exe , może zostać załadowana wykonać swój kod i podziękować .

p.s. piszcie mnie z małej litery

A niby czego ? , nie bądz taki skromny w SPACJA końcu można się dowiedzieć paru reczy
z tego co piszesz :-D .


0

Moge tylko polecac ten link http://www.tuts4you.com/blogs/download.php?list.30
:D naprawde wiele dobrych tutoriali :-) .Bardzo przejrzyscie i elegancko, sposob dodania nowej sekcji do kodu pokazuje "Manually Adding A Section", goraco polecam. :-P

dzejo
  • Rejestracja:ponad 18 lat
  • Ostatnio:prawie 12 lat
  • Postów:787
0

Przeprowadziłem procedurę ze strony LordaPE dodania dll do Notepad .
Niestety nie mam co dalej wnikać w ten sposób bo program po modyfikacji
wywala się na ryja , czyli do niczego .Nie jest tak cudownie jakby się wydawało .
Dodaje sekcję do pliku , przebudowuje importy - ale Notepad po odpaleniu nie działa
zmiana Entry Point na wszelkie inne nie pomogła , lipa....

A dlaczego ? może dla tego :

Ponieważ Notepad w wersji XP ( jak i inne pliku wchodzące w skład ) zawiera tzw. Bound Import .
Utrudnia to wszelkie manipulacje na pliku bo wpisy w katalogach są zablokowane
nazwami Bibliotek i wszelkie manipulacje na pliku kończą się źle .
Czyli zamiast sekcji import pliki .exe zawierają wpisy ( bo to nawet nie sekcja) o bibliotekach
jakich program używa .

Nie można do takiego pliku dodać żadnej dodatkowej sekcji ,fizycznie można ale nie da się jej
uruchomić , bo nie ma miejsca przez
ten cholerny Bound Import na dodanie wpisu-katalogu o nowej sekcji , dodanie takiego
katalogu uszkadza plik .
Natknąłem się kiedyś na ten problem pisząc wirusa PE , dodającego sekcję do pliku .
Musiał on ostatecznie rozpoznać pliki z Bound Import i odpuścić je sobie .
No chyba że jest jakaś metoda aby to ominąć .
Ale z tego co oglądałem w Hex edytorze , to Notepad po zabiegu LordemPE jest
po prostu zrypany .

Nasuwa się więc inne rozwiązanie , do plików które nie zawierają Bound Import ,
można go dodać z wpisem o bibliotece którą chcemy załadować , spróbuję właśnie
tak ...


deus
  • Rejestracja:prawie 21 lat
  • Ostatnio:ponad 12 lat
0

oj dzejo, dzejo... a próbowałeś może usunąć katalog Bound Import z pliku? Ustaw offset i rozmiar na 0 i wtedy spróbuj dodać, boundy są opcjonalne... Na moje oko obszar Bound Import po wyzerowaniu i wyrównaniu adresu do 0x20 świetnie nadaje się do umieszczenia katalogu importów. W każdym razie Notepad z WinServ2k3 sp1/identyczny - albo prawie - jak w XP sp2/ po takiej operacji ładuje dodatkowy pakuneczek aż miło... /normalnie, bez usunięcia boundów faktycznie się sypał/ :>


I nie udawaj, że rozumiesz.
dzejo
  • Rejestracja:ponad 18 lat
  • Ostatnio:prawie 12 lat
  • Postów:787
0

Ale jeśli są , to są brane pod uwagę przy ładowaniu pliku .
Miełem jednak nadzieję że dodanie bound będzie łatwiejszym sposobem na załadowanie
biblioteki ,
dodałem więc ręcznie dane o bibliotece , ale dupa , i tak musi być jeszcze powiązanie
z symbolami w importach i na razie utknąłem .
Idę odpocząć bo mi oczy zgwożdziały od tych Hexów 8-O .


deus
  • Rejestracja:prawie 21 lat
  • Ostatnio:ponad 12 lat
0

Ale jeśli są , to są brane pod uwagę przy ładowaniu pliku .

właśnie, jeżeli są - wywal wpis o katalogu bound z nagłówka - katalog importów zawiera wszystkie informacje potrzebne do załadowania modułu... a przynajmniej taki mi się wydaje... SOA#1: u mnie działa ;P


I nie udawaj, że rozumiesz.
dzejo
  • Rejestracja:ponad 18 lat
  • Ostatnio:prawie 12 lat
  • Postów:787
0

Tu jest problem , grzebanie w importach na piechotę nie bardzo mi się uśmiecha,
chciałem ominąć to dziadostwo jak najmniejszym kosztem , No bo jak LordPE się na tym wyp.. to może być trudniej
niż myslałem :-D .


deus
  • Rejestracja:prawie 21 lat
  • Ostatnio:ponad 12 lat
0

najpierw bierzesz lordem wpisy o katalogu bound zerujesz, zapis, edycja importów, zapis... chodzi ;P


I nie udawaj, że rozumiesz.
dzejo
  • Rejestracja:ponad 18 lat
  • Ostatnio:prawie 12 lat
  • Postów:787
0

No chodzi , walnąłem się przy przróbce calla .
Sory Lord ;-( .
Jednak ta metoda mnie przerasta , właściwie trzeba importy zrobić od nowa ..

Właściwie to ja bym się tak nie męczył , łatwiej dodać kod ładujący bibliotekę ( LoadLibrary )
ustawić nowy entry point i z głowy . Tą metodę jestem wstanie "ogarnąć" , ale
nic pomęcze się jeszcze trochę [rotfl] .

Rzeczywiście można spokojnie wywalić Bound Import i nic się nie dzieje , a szkoda :-D .


deus
  • Rejestracja:prawie 21 lat
  • Ostatnio:ponad 12 lat
0

ok, wpadłem na ciekawy pomysł - jak zmniejszyć, 'usunąć' thunk :>

Kopiuj
dd      0, 0x80000000+numer, 0, RVA _nazwa, RVA $-0x0c 

timestamp może przecież przyjmować dowolną wartość - może także ordinala oznaczać, następny dword zaś robi za terminator :> Sprawdzone - działa. Może zabiorę się za implementację odpowiednich funkcji do dodawania bibliotek, coraz ciekawsze się to robi.


I nie udawaj, że rozumiesz.
dzejo
  • Rejestracja:ponad 18 lat
  • Ostatnio:prawie 12 lat
  • Postów:787
0

Pan Lord PE ustawia adres w katalogu Import symbols na
nową dodaną sekcję , jednak opis w katalogu Virtuall Address różni
się od opisu w sekcji .
Po dodaniu biblioteki do Notepad w katalogu jest
Virtuall Address (Import symbol nowa sekcja ) == 1301F
a w Opisie sekcji dodanej
VirtualAddress jest == 13000 ????
Co jest ?
Zrzut z RHead.exe
http://www.win32prog.republika.pl/winapp/rhead.zip

Kopiuj
    Sekcja numer : 3                                           War.Hex    IntelHex
 0258-025F   0170-0177   00-07       BYTE    Name[8]            .Katja
 0260-0263   0178-017B   08-0B     union{DWORD PhysicalAddress,
					DWORD VirtualSize}Misc   0000-1000   0010-0000
 0264-0267   017C-017F   0C-0F     DWORD VirtualAddress          0001-3000   0030-0100
 0268-026B   0180-0183   10-13     DWORD SizeOfRawData           0000-00FB   FB00-0000
 026C-026F   0184-0187   14-17     DWORD PointerToRawData        0001-0600   0006-0100
 0270-0273   0188-018B   18-1B     DWORD PointerToRelocations    0000-0000   0000-0000
 0274-0277   018C-018F   1C-1F     DWORD PointerToLinenumbers    0000-0000   0000-0000
 0278-0279   0190-0191   20-21     WORD  NumberOfRelocations       00-00       00-00
 027A-027B   0192-0193   22-23     WORD  NumberOfLinenumbers       00-00       00-00
 027C-027F   0194-0197   24-27     DWORD Characteristics         C000-0040   4000-00C0
Kopiuj
Import Symbols:

                            War.Hex    IntelHex
IMAGE_DATA_DIRECTORY 1
    VirtualAddress  DWORD  0001-301F   1F30-0100
    Size  DWORD            0000-00C8   C800-0000

deus
  • Rejestracja:prawie 21 lat
  • Ostatnio:ponad 12 lat
0

z tego co widzę Lord umieszcza na początku sekcji nazwę nowej biblioteki, thunki i dopiero tablice importów... Hm, dziwne, że tablica nie jest wyrównana do 0x20. Swoją drogą Lord nie potrafi obliczyć adresów danych umieszczonych za tablicą, żeby takie dziwne konstrukcje stosować!?


I nie udawaj, że rozumiesz.
dzejo
  • Rejestracja:ponad 18 lat
  • Ostatnio:prawie 12 lat
  • Postów:787
0

Faktem jest że to jednak działa , kolejnym to że biblioteka zaszczepka musi
zawierać przynajmniej jedną fun, moż być nie używana ( tak jak opisałeś wcześniej).

Jeszcze wspomnę o boundach :
Oryginalny plik Notepad :
1.Zawiera katalog Bound Import
2.Nie zawiera wpisów o Sekcji ?? importów
3.Lecz zawiera tylko wpis w katalogu Import symbol.

Po dodaniu Biblioteki przez LordPE

Katalog Import symbols zawiera wskazanie ( trochę nietrafione )
na sekcję dodaną "Katja" [ to pewnie jego laska :-D ]

Oraz plik zawiera pełny opis sekcji "Katja" .

W oryginalnym Notepad więc loader musi po usunięciu Bound
czytać informację z katalogu , bo o sekcji nie ma danych .

Ciekawe jaka jest kolejność zbierania danych o Sekcjach przy ładowaniu .

Moje nadzieje na podpięcie się pod Bounda się trochę rozwiały.
Biblioteki ładowane w ten sposób nie mogą "zachodzić na siebie adresami bazowymi + rozmiar
bibl. w przestrzeni adresowej procesu " ,
poza tym i tak musi być dodany jakiś symbol do importów.. na razie się wywala..
Kontrolowany jest także przez Loader "DateTimeStamp" to można uzupełnić
ale i tak wyskakuje bład " inicjalizacja aplikacji się nie powiodła" , Loader odnalazł
bibliotekę - czyli wpis jest prawidłowy ( brak komunikatu o braku biblioteki )


deus
  • Rejestracja:prawie 21 lat
  • Ostatnio:ponad 12 lat
0

sekcje w sumie służą tylko określeniu atrybutów obszarów pamięci - jak widziałeś w podanym przeze mnie przykładzie cały program może zawierać się w jednej sekcji.

p.s. u mnie nowa sekcja nazywa się '.Silvana', hm, obrotny facet, nie ma co ;P


I nie udawaj, że rozumiesz.
dzejo
  • Rejestracja:ponad 18 lat
  • Ostatnio:prawie 12 lat
  • Postów:787
0

Niestety w takim przypadku zostają mu Lachony na max 8-em liter :-)
Oj 7-em , zapomniałem o '.' .
Kropka to punkt wejścia do () , muszę zmienić imię swojej żony , złe nie śpi ,
na razie mam go tylko w komputerze , ale jak zapuka do drzwi ... :d
..
Odnośnie sekcji przyjęcie opcji dodania nowej sekcji przy zmianie importów
może wynikac z braku możliwości modyfikacji oryginału ,
Być może na wyrost , z obawy przed przekroczeniem rozmiaru nowych danych
wynikających z zaokrąglenia (SectionAlignment) ..
Dodanie nowej sekcji jest bezpieczniejsze , w przypadku dodawania danych do sekcji
gdy jej rozmiar( jest bliski - >równy] "wyrównania danych w pliku " modyfikacja nie powiodła by się .


0

Kolejny arykul godny polecenia:
"Understanding RVAs and Import Table"
http://people.freenet.de/sun-shine/tut_rvait.zip
Dzieki niemu juz wiem dokladnie jak LordPE zmodyfikowal importy :-)

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)