XOOX. Cilvēks. ([info]xoox) rakstīja [info]koderi kopienā,
@ 2006-05-29 12:09:00

Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Kādam no cienītajiem kolēģiem ir idejas, kā nomainīt string jeb virkni jau nokompilētā EXE failā? Virkne ir garāka nekā jau esošā. EXE failā virkni atrast var, mēģināju nomainīt uz garāko, bet programma pēc tam vairs nedarbojas. Jāmeklē checksumma? Bet kur?
Nu jā, un virkne nav kā daļa no resursiem (resource string), tā parādās tikai kā pliks teksts EXE, līdz ar to API funkcijas UpdateResource u.c. neder.
Googles tante ātru risinājumu nepiedāvā, bet mēģināt iebraukt PE formāta jaukumos par maz laika.


(Ierakstīt jaunu komentāru)


[info]ergaster
2006-05-29 12:44 (saite)
Esmu "tikpat gudrs" kā Tu šajā jautājumā, tāpēc arī atbildu no šādas pozīcijas:

1. Pamēģini nomainīt ar tikpat garu, nevis garāku. Tā Tu uzzināsi, vai tiek lietotas čeksummas. Tālākais strādās tikai tad, ja ne...

2. Man ir aizdomas, ka drīzāk vaina būs koda adresācijas nobīdē. Visu kodu kopumā vajadzētu bez problēmām bīdīt pa adresu telpu, bet ne tā atsevišķas daļas vienu attiecībā pret otru. Risinājums - teksta rindiņu ierakstīt "overwrite", nevis "insert" modē - tādējādi pārrakstot pa virsu daļai koda. Cietušo koda (ja tas patiešām viss ir kods) daļu pārvieto kaut kur citur (varbūt faila, vai koda segmenta, ja tur tāds ir, beigās) uz kurieni jāpāradresē visi tā izsaukumi (sorry, cerams, ka to nav daudz, ideāli, ja viens). Beigās, savukārt, ieliek "jmp" atpakaļ uz atlikušo daļu, ja tāda, protams, ir. Bez PE izpētes diez vai iztiksi...
Ar vārdu sakot, neapskaužu Tevi (un tik gudrs jau Tu pats arī biji, man tikai gribējās izteikties ;)) )

Otrs, drusku jēdzīgāks (bet ne vieglāks) variants - vispirms atrast atsauces uz šo tekstu kodā (ja to nav daudz) - neprasi kā (debugger is your friend) un uz beigām pārcelt teksta rindiņu, nevis kodu...

Abos gadījumos "the tricky part" ir atrast (pie tam visas) atsauces uz pārvietojamo fragmentu.
Neesmu pārliecināts, ka pastāv kāds trešais un vieglākais ceļš... :/

Pēc manām domām (tā kā Tu saki, ka maz laika), vienīgais praktiskais risinājums Tavā situācijā ir - atkratīties no šī darbiņa...

(Atbildēt uz šo) (Diskusija)


[info]ergaster
2006-05-29 12:47 (saite)
...tas ir - ja nekādi nav iespējams saīsināt jauno tekstu (varbūt tomēr var, ko?).

(Atbildēt uz šo) (Iepriekšējais) (Diskusija)


[info]xoox
2006-05-29 12:58 (saite)
Paldies par atbildi. Lieta tāda, ka mani hosteri nomainījuši FTP servera login vārdu, kas aplikācijā ielikts kā konstante, līdz ar to nojaucot update procesu kādām 40 aplikācijām visā LV. Mainīt atsakās. Pamēģināju pahakot ar HEX editoru, bet nu izskatās, ka nesanāks, līdz ko baits par daudz, tā EXE vairs netiek atpazīta, nojūk visas VersionInfo utml.

Vēl viens quick and dirty variants bija updeitot HOSTS failu uz klienta datora ar norādi uz citu FTP serveri, kuram login parametri ir vecie, bet izrādās ka arī šis variants neder, ja ir proxy serveris, firewall bla bla bla.

Vēl jau ir iespēja laist kādu papildprocesu, kas palaižas kopā ar pamatprogrammu un atmiņā maina to nelaimīgo konstanti. Vai tas ir iespējams, nezinu. Kaut ko miglaini atceros, ka Win2K un WinXP katrs process palaidās savā adresu telpā.

(Atbildēt uz šo) (Iepriekšējais) (Diskusija)


[info]ergaster
2006-05-29 13:12 (saite)
Tad atliek rakstīt pakešu filtru, kurš zvejo attiecīgās FTP paketes un tās pāradresē... Nekad neko tādu neesmu darījis, brrrr... :/

(Atbildēt uz šo) (Iepriekšējais)


[info]ergaster
2006-05-29 12:56 (saite)
...un vēl viena piebilde - labojot ir vērts zināt, kādas teksta virknes tiek lietotas - "C" vai "Pascal" style. Vienas beigas norāda "\0" simbols, otrai ir skaitītājs sākumā...

(Atbildēt uz šo) (Iepriekšējais) (Diskusija)


[info]xoox
2006-05-29 12:59 (saite)
VB-style. Ar skaitītāju sākumā!

(Atbildēt uz šo) (Iepriekšējais)


[info]laacz
2006-05-29 15:45 (saite)
A nāksies. http://elfz.laacz.lv/ms_exe_spec.html

(Atbildēt uz šo)


[info]tidliibums
2006-05-29 18:31 (saite)
Kas tas par kodu, kuru Tev jākopj, bet izejas tekstu nav??

anyway, labāk netērē laiku ar hexeditoriem, tad jau drīzāk kāds dizasembleris te varētu līdzēt.

(Atbildēt uz šo) (Diskusija)


[info]xoox
2006-05-29 20:03 (saite)
Dažiem klientiem ir vecākas aplikācijas versijas. Jaunajās versijās atkal papildu fīčas, bet par papildu samaksu, jo negribas na haļavu atdot. Source control ar iepriekšējām aplikācijas versijām nav, ko ļoti nožēloju.

(Atbildēt uz šo) (Iepriekšējais) (Diskusija)


[info]ergaster
2006-05-29 20:12 (saite)
Nu, tad gan man atliek tikai citēt [info]laacz - "a nāksies!" - tas attiecībā uz otro teikumu. Jo jebkurš cits risinājums tanī putrā, ko esi pats ievārījis, Tev maksās vairāk, kā tā atdotā haļava - vai nu zaudēsi klientus, vai laiku un nervus, bet visticamāk - visus trīs...

Ja nu vienīgi veikli izdodas atrast tiešām kvalitatīvu dekompilatoru - tad vari uzskatīt, ka Tev (nepelnīti! ;P) paveicies... :)

(Atbildēt uz šo) (Iepriekšējais)


[info]neons
2006-05-29 19:20 (saite)
Nav jāmeklē nekāda "checksuma". Lieta tāda, ka Tu nevari ierakstīt garāku virkni, ja tam nav atstāta vieta, jo tūlīt aiz tās virknes seko nākamie dati vai kods, līdz ar to, ierakstot garāku virkni, tu notīri nākamos datus, kā rezultātā programma var nefunkcionēt. Vienīgais veids, kā varētu mēģināt, būtu ierakstot to virkni (garāko) kaukur citur failā, un tad meklēt visas vietas kodā, kas referencējas uz to oriģinālo virkni, un tur nomainīt adresi. Otrs veids būtu programmas dizasemblēšana, virknes nomaiņa un tad pārveršana atpakaļ ekzešņikā ar asemblera palīdzību.

(Atbildēt uz šo) (Diskusija)


[info]ergaster
2006-05-29 19:59 (saite)
(disklaimeris (balstīts iepriekšējā bēdīgā virtuālās komunicēšanas pieredzē ar nepazīstamiem cilvēkiem): šis nav uzbrauciens, vienkārši atsauca atmiņā diezgan pasenu darbošanos ar pieminēto tehnoloģiju) - Pēdējais ieteikums būtu bezmaz ideāls, ja vien tas dizasembleris strādā absolūti korekti, kam es diez ko negribu ticēt. A, ja pēc tam ar pirkstu jāvelk līdz un ar roku ģenerētais asemblera kods jālabo, tad laikam paņēmiens tikpat "labs" kā visi pārējie iepriekš minētie.

Ar vārdu sakot, man šķiet, ka drīzāk šie te varētu būt noderīgāki (vismaz pēc tam labojamā ģenerējamā koda apjoms varētu būt mazāks un paskats - saprotamāks). Ja vien, protams, augšminētie verķi strādā daudz maz kvalitatīvi.

(Atbildēt uz šo) (Iepriekšējais) (Diskusija)


[info]neons
2006-05-30 07:46 (saite)
Nav bijusi darīšana ar Windows disasembleriem, bet ar normālu DOSisku viss būtu elementāri. Mums tiktu uztaisīts viens liels .asm fails norādītajā formātā (MASM/TASM), kurā ar Search/Replace visprastākajā teksta redaktorā būtu jānomaina mūs interesējošā teksta virkne un tad ar to pašu MASM/TASM vienkārši no jauna jāuzģenerē ekzešņiks. Pieņemu, ka ar Windozes rīkiem ir līdzīgi.

Dizasemblers nevar strādāt īpaši nekorekti, vienīgā problēma varētu būt, ka viņš varētu kaukur saputrot datus ar kodu (nesaprast, kas šī baitu virkne īsti ir). Bet pamatā gudrs dizasemblers redz, ka kods kaukur vēršas pie noteiktās adreses kā pie datiem un līdz ar to attiecīgo vietu kodā pieraksta kā datus.

(Atbildēt uz šo) (Iepriekšējais)


Neesi iežurnalējies. Iežurnalēties?