DLL szerkesztése

DLL szerkesztése
2013-09-08T11:45:45+02:00
2013-09-09T11:07:53+02:00
2022-07-19T07:56:18+02:00
bigyusz
Sziasztok!
Van egy DLL, mely mindig kidob egy messagebox-ot, ha hozzáfér egy program. Semmi jogtalan dolgot nem akarok, csak valahogy kiszedni a DLL-ből ezt a szövegdoboz megjelenítést.
HEX editorral lehet is látni, hogy hol helyezkedik el a szövegdoboz szövege (a csatolt képen pirossal jelöltem). Gondolom az a dllevent rész a felelős a szövegdobozért.
Na de itt elakadtam.
(Csak saját célra használnám a dll-t, tehát senkinek nem adom tovább, és semmilyen bevétel nem származna belőle.)
Előre is köszönöm a választ!

Szerk.: nem a társalgóban akartam témát nyitni, hanem a tudástárban, nagyon szépen megköszönném egy moderátornak, ha átrakná.
Mutasd a teljes hozzászólást!
Csatolt állomány
Próbáld meg ezekkel a bájtokkal felülírni a 404202-től kezdődő 7 bájtot:

83 C4 0C 31 C0 B0 01

Ez a következő assembly kód gépi kódja:
add esp, 12 xor eax, eax mov al, 1

Az első utasítás azt a veremtakarítást szimulálja, amit a MessageBoxA hívás csinált volna (lásd stdcall hívási konvenció), illetve csak majdnem, mert egy PUSH utasítást felülírtunk, ezért csak 12 bájtot kell takarítani a veremről, nem 16-ot. A második és a harmadik azt utánozza, hogy a MessageBoxA az OK gomb lenyomása esetén 1-re állítja az EAX regisztert. (Ha nem OK gomb van, hanem valami mást kell megnyomni a folytatáshoz, akkor más konstans kell az utolsó bájtra.)

Ez így elég kezdetleges patch, a teljes kód ismeretében lehetne elegánsabbat is gyártani, de a célnak talán így is megfelel.
Mutasd a teljes hozzászólást!

  • Leszedtem a "PE Explorer" programot, de ez nekem még új, gondolom kell egy másik program, mellyel újra bírom fordítani az átírt DLL-t (ha majd egyszer sikerül). Egyébként úgy néz ki, hogy Delphiben írták a DLL-t, ami jó hír, mert abban programozgatok.
    Mutasd a teljes hozzászólást!
  • Semmi jogtalan dolgot nem akarok, csak valahogy kiszedni a DLL-ből ezt a szövegdoboz megjelenítést.


    Én ebben nem lennék annyira biztos. A zárt forrású szoftverek licenszében általában benne szokott lenni a visszafejtés és a módosítás tilalma, amit értelemszerűen akkor is megszegsz, ha a változtatott binárist nem adod tovább.

    Egyébként ha jobban megvakargatjuk a dolgot, neked ugyan bevételed nem származna belőle, de az eredeti fejlesztőnek származna bevételkiesése. (Nyilván nem viccből rakta be azt a popup ablakot, hanem azért, hogy a popup nélküli változatért pénzt tudjon elkérni.) A legális megoldás az, hogy vagy kifizeted a DLL-t annak rendje és módja szerint, vagy keresel olyan alternatívát, aminek a licenszfeltételei jobban megfelelnek neked.
    Mutasd a teljes hozzászólást!
  • Annak idején írtam is emailt (többet is) a weboldalon feltüntetett helyre (hova kell utalni), de semmi válasz nem volt. Azóta már évek teltek el. Ezért bátorkodtam feltenni a kérdést.
    Mutasd a teljes hozzászólást!
  • Ja, vagy úgy. Ha az eredeti szerző nem törődik vele, hogy beszedje a pénzt, akkor tényleg nincs sok választás.

    Ahhoz, hogy módosítani tudd a DLL-t, kelleni fog egy kis alapszintű x86 assembly ismeret - DLL-ből Delphi kódot nem fogsz tudni visszanyerni, de disassembler segítségével assembly kódot igen. Én az IDA freeware változatát szoktam használni, mert elég ügyes analízist tud végezni a binárison, és automatikusan megcsinál egy rakás hasznos dolgot.

    Én az IDA-val kezdenék egy új projectet, a DLL-t használva forrásként. Megkeresném a szöveget (Alt+B, és idézőjelben megadod a keresett szöveget). Jó esetben fog találni a szövegre egy kereszthivatkozást (jobb szélen egy "DATA XREF" komment), ami alapján meg tudod találni, hogy melyik kódrészlet jeleníti meg a szöveget. Ha szerencséd van, akkor ez csak egy mezei MessageBox hívás lesz, amit NOP-okkal felülírva már kész is vagy. (Csak ne felejtsd a paramétereket lerakó PUSH-okat is kikommentezni, különben elcsúszik a verem, és összeomlik a program.) Az IDA-ban direktben nem fogsz tudni semmit átírni, mert ő csak disassembler, de alul a státuszsorból ki tudod keresni a binárison belüli offszetet, és egy hexeditorral tudod elvégezni a módosítást.

    A fenti persze csak akkor működik, ha nincsen semmi másolásvédelem vagy anti-debug trükk a binárisban. Ha ilyesmi is van benne, akkor igazán hozzáértő ember kell a módosításához.
    Mutasd a teljes hozzászólást!
  • Köszönöm a választ!
    Nemsokára neki is állok, majd valószínűleg még lesznek kérdéseim.
    Mutasd a teljes hozzászólást!
  • w32dasm egyszerűbb megoldásnak tűnik.
    de nop helyett szerintem érdemes megcserélni a feltételeket je/jne/jmp, hogy mikor is jelenjen meg az a messagebox.
    én a messagebox-ra raknék egy breakpoint-t és megnézném, honnan lett meghívva az adott msgbox.

    régebben winxp-n még ment a softice, azzal is viszonylag gyorsan megoldaható ez a nag probléma.
    Mutasd a teljes hozzászólást!
  • HOOK-olni kell, de nem egyszerű.
    hook
    Mutasd a teljes hozzászólást!
  • Miért is kéne itt hookolni?
    Az a lehető legbonyolultabb és legcsúnyább megoldás erre. (Akkor már lehetne egy service-t is írni, amelyik figyeli a képernyőt és ha megjelenik a felirat, akkor fölémozgatja az egeret és lenyomja az OK gombot )
    Mutasd a teljes hozzászólást!
  • Őszintén szólva a jelenlegi megoldást le is írtad.
    Mert eddig úgy van, hogy fut egy szkript (amit még régen összeollóztam), ami "küld egy entert" az ablaknak, ha megjelenik. Ami működik is, csak nem a legelegánsabb megoldás...

    Szerk.: köszönöm a többieknek is a hozzászólásokat!
    Mutasd a teljes hozzászólást!
  • Kipróbáltam azt, hogy a messageboxot meghívó címre raktam egy 6 byte-os NOP-ot, de az nem tetszik a programnak.
    Szerk.: ó perszehogy nem, muszáj oda ugrania. Egyre mélyebbre és mélyebbre kell bemenni a susnyásba...
    Mutasd a teljes hozzászólást!
  • A Hiew-ben mik azok a számok, melyek mellet van egy nyíl is (bekarikáztam) ? Ha görgetem a kódot, akkor nőnek/csökkenek ezek a számok. Gondolom valamit jelölnek, de mit?
    Mutasd a teljes hozzászólást!
  • Hogy bírok futtatni breakpointtal (debuggolni)?
    Mutasd a teljes hozzászólást!
  • Ja, csak másképpen nem fog működni normálisan.
    Beleírni DLL-be?
    Mutasd a teljes hozzászólást!
  • Nem csatoltál semmit, hol karikáztál?

    Egyébként ha megmutatnád a kódot, amiben NOP-olni akarsz, többet tudnánk segíteni.
    Mutasd a teljes hozzászólást!
  • Nem hook kell, hanem DLL inject
    Mutasd a teljes hozzászólást!
  • Upsz, tényleg, este volt már..
    Na itt csatolom.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Próbáld meg ezekkel a bájtokkal felülírni a 404202-től kezdődő 7 bájtot:

    83 C4 0C 31 C0 B0 01

    Ez a következő assembly kód gépi kódja:
    add esp, 12 xor eax, eax mov al, 1

    Az első utasítás azt a veremtakarítást szimulálja, amit a MessageBoxA hívás csinált volna (lásd stdcall hívási konvenció), illetve csak majdnem, mert egy PUSH utasítást felülírtunk, ezért csak 12 bájtot kell takarítani a veremről, nem 16-ot. A második és a harmadik azt utánozza, hogy a MessageBoxA az OK gomb lenyomása esetén 1-re állítja az EAX regisztert. (Ha nem OK gomb van, hanem valami mást kell megnyomni a folytatáshoz, akkor más konstans kell az utolsó bájtra.)

    Ez így elég kezdetleges patch, a teljes kód ismeretében lehetne elegánsabbat is gyártani, de a célnak talán így is megfelel.
    Mutasd a teljes hozzászólást!
  • Átírtam, működik!
    Nagyon szépen köszönöm!
    Mutasd a teljes hozzászólást!
abcd