Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Exe programmi manipuleerimine programmeerimiskeele abil märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
Malukunn
HV vaatleja

liitunud: 18.06.2006




sõnum 20.05.2010 12:56:50 Exe programmi manipuleerimine programmeerimiskeele abil vasta tsitaadiga

Tere,

üritan lahendada järgmist probleemi. Mul oleks vaja ühe .exe töö automatiseerida. Tegu on energiaarvutusi teostava exe.ga, millel on sisseehitatud mõned keerukamat tüüpi arvutused (seega ilma selle programmita ei suudaks ma neid arvutusi ise luua). Inputiks saab aga anda programmile tekstifaili ja ka output-i saab tekstifailiks salvestada. Sooviksin optimeerimise jaoks programmi tsüklisse lasta - muutes vastavalt saadud outputile inputi teksti faili ja jooksutades programmi uuesti.

Kuna olen suhteliselt uustulnuk programmeerimisel ja olen seni ainult VBA-d kasutanud siis üritasingi selle abil probleemi lahendada. Jõudsin aga sinnani, et saan programmi avatud ja teoreetiliselt peaks ka sendkey põhimõttega saama osasid toiminguid programmis teostada (F1, enter nooled jne) aga nendest ei piisa kuna pean ka fail-open ja save as tegema, millel pole shortcut nuppe. Pealegi see sendkey meetod ei tundu eriti töökindel olevat ja ei ole sedagi korralikult tööle saanud.

Kas keegi oskab soovitada mingit meetodit/kuidas seda veel teostada saaks (arvestades, et tegu pole professionaalse programmeerijaga aga siiski piisavalt õppimistahtelise iskuga).

Jaksu,

M.
Kommentaarid: 1 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
HacaX
HV Guru
HacaX

liitunud: 22.01.2004




sõnum 20.05.2010 18:30:57 vasta tsitaadiga

Windowsi programm? Siis peaks andma ka otse GUI elementidele käske saata (olid ju mingid windows messageid).
Klahvivajutuste saatmisel oli IIRC põhiline see et fookus oleks just antud aknal, s.o. enne tegutsemist tuleks uuesti fookus seada või siis veenduda et fookus on jätkuvalt sinu aknal.

_________________
IMO & GPLed
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 22
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
inzinz
HV kasutaja

liitunud: 26.01.2005




sõnum 21.05.2010 09:17:48 vasta tsitaadiga

Kas sellel programmil faili avamine on ülevalt menüü ribast stiilis "File" => "Open" ja "File" => "Save" ? Kui jah siis peaks fookuse saama sinna menüüriba peale kui saata "ALT" keypress, seejärel allanoolega menüü lahti, nooleklahvidega õigesse kohta liikuda ja siis enter key saata. Avanenud file open/save dialoogile peaks ka saama erinevaid keypresse saata.

Vajadusel saab ka hiire evente saata progele ette, aga ma ei mäleta hetkel kas koordinaadid pidid olema ekraani või programmi ülemise vasaku nurga või suhtes.

Aga kõige selle juures tuleb silmas pidada sedasama asja mida ka HacaX mainis, see aken kuhu neid evente saadad, peab parasjagu fookuses olema (winapi käsk SetForegroundWindow(intptr)), kuna muidu ei jõua eventid kohale, ehk siis samal ajal selle masina taga sa ise ei saa midagi muud teha peale ekraani vaatamise.

_________________
Upload.ee - eestimaine failiupload
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
maxorator
HV kasutaja

liitunud: 30.08.2006




sõnum 21.05.2010 10:14:31 vasta tsitaadiga

HacaX kirjutas:
Windowsi programm? Siis peaks andma ka otse GUI elementidele käske saata (olid ju mingid windows messageid).

Teise programmi GUI elementidele ei saa otse käske anda message'tega. Aga alati on muidugi võimalik ennast teise programmi sisse kuidagi haakida... icon_lol.gif
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
andresv
HV kasutaja

liitunud: 06.12.2004



Autoriseeritud ID-kaardiga

sõnum 21.05.2010 15:18:42 vasta tsitaadiga

Selleks otstarbeks peaks vast sobima mingi automaatestimise programm nt. TestComplete.
Seal siis teed selle tegevuse ühe korra läbi, millest siis genereeritakse mingi skript (VBA laadne) mida siis saad ise mudida ja täiendada.

Võimalik, et see lahendus on natu overkill aga lahendus sellegipoolest.
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
Supiplex
HV veteran
Supiplex

liitunud: 11.12.2002




sõnum 21.05.2010 15:23:59 vasta tsitaadiga

Kui tegemist on interaktiivse programmiga (st ootab kasutajalt millegi sisestamist või nupu vajutamist) siis selle jooksutamiseks on erivahendid. Sarnased soovid nagu sinul (et vaja mingit programmi - kas GUI või käsurea - jooksutada kontrollitud keskkonnas, skriptida lihtsat või keerulist kasutajapoolset sisendit ja uurida väljundit) on ka automaat-testimise juures. Soovitan uurida automaattesti tarkvara, näiteks TestComplete (http://www.automatedqa.com/products/testcomplete) ja teised (http://en.wikipedia.org/wiki/Test_automation#Popular_Test_Automation_Tools). Ma pole erilist uurimistööd teinud, aga TestComplete lubab muu hulgas testistsenaariume VBScriptis progeda - näiteks kirjutad VB skripti mis paneb sinu exe käima ja näpib seda nii kuidas soovid (muu hulgas simuleerib kasutaja nupuvajutusi ja tekstisisendit), ka tsüklis kui vaja. Väljundi kontrollimiseks loed oma tekstifaili sisse ja analüüsid, kas tuli see mida tarvis.

Heh, andresv jõudis kiiremini icon_smile.gif

_________________
The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions.
Kommentaarid: 38 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 34
tagasi üles
vaata kasutaja infot saada privaatsõnum
blinx
HV vaatleja

liitunud: 28.11.2009




sõnum 21.05.2010 20:03:21 vasta tsitaadiga

Ma ei tea kas sa user32.dll-i saad kasutada. Aga seal pead ikka samamoodi menudes ringi käima.
Näeb välja umbes nii: http://pastebin.com/nnuwUjZ4

_________________
'Just buy everything then you're safe'
tagasi üles
vaata kasutaja infot saada privaatsõnum
HacaX
HV Guru
HacaX

liitunud: 22.01.2004




sõnum 23.05.2010 21:20:24 vasta tsitaadiga

maxorator kirjutas:
HacaX kirjutas:
Windowsi programm? Siis peaks andma ka otse GUI elementidele käske saata (olid ju mingid windows messageid).

Teise programmi GUI elementidele ei saa otse käske anda message'tega. Aga alati on muidugi võimalik ennast teise programmi sisse kuidagi haakida... icon_lol.gif
Võimalik et ajan asjad segamini, aga Win peaks ise pakkuma calle leidmaks teise protsessi kasutatava akna handle´it. Ja kui see on käes siis saab WinAPI SendMessage()´iga ka käske saata. See pole küll just hea tava aga peaks toimima ning ei tohiks ka päris "sissehaakimiseks" kvalifitseeruda.
_________________
IMO & GPLed
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 22
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
THNS
HV vaatleja

liitunud: 12.05.2010




sõnum 26.05.2010 11:12:03 vasta tsitaadiga

Saab teha Win32 SendMessaget kasutades ja PostMessaget kasutades. Kuid sellisel juhul pead täpselt teadma mis Messageid see teine programm sul loeb. Loodetavasti ikkagi mingeid Windowsi defaulte.

Uuri neid kahte linki.

http://msdn.microsoft.com/en-us/library/ms644950(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms633499(VS.85).aspx
tagasi üles
vaata kasutaja infot saada privaatsõnum
aht0
HV veteran

liitunud: 14.10.2003




sõnum 03.06.2010 07:53:02 vasta tsitaadiga

AutoIT3
http://www.autoitscript.com/autoit3/index.shtml
foorum on suht asjalik ja kui ise huvi näitad asja vastu ja üritad siis aidatakse ka reaalse koodiga..

näide
http://www.autoitscript.com/autoit3/docs/tutorials/notepad/notepad.htm

põhimõtteliselt võid kirjutada terve eraldiseisva programmi mis sinu proge GUI-d iseseisvalt manipuleerib, suht VBA laadne
Kommentaarid: 82 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 71
tagasi üles
vaata kasutaja infot saada privaatsõnum
Bssldr
HV kasutaja

liitunud: 05.12.2009




sõnum 03.06.2010 15:57:48 vasta tsitaadiga

Kas on võimalik ka programmi enda funktsioone välja kutsuda?

Näiteks võiks mingil console appil olla selline funktsioon.

void blah()
{
     cout << "blah" << endl;
}


On seda võimalik programmi töö ajal väljaspoolt kutsuda?
Kommentaarid: 9 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 8
tagasi üles
vaata kasutaja infot saada privaatsõnum
XYZ
HV Guru
XYZ

liitunud: 05.11.2001




sõnum 03.06.2010 16:24:57 vasta tsitaadiga

Bssldr kirjutas:
Kas on võimalik ka programmi enda funktsioone välja kutsuda?

Näiteks võiks mingil console appil olla selline funktsioon.

void blah()
{
     cout << "blah" << endl;
}


On seda võimalik programmi töö ajal väljaspoolt kutsuda?
Need funktsioonid peavad olema algusest peale vormistatud väliselt väljakutsutavatena. Sellised on näiteks .dll-des peidus olevad funktsioonid.
Kommentaarid: 81 loe/lisa Kasutajad arvavad:  :: 3 :: 12 :: 56
tagasi üles
vaata kasutaja infot saada privaatsõnum
Bssldr
HV kasutaja

liitunud: 05.12.2009




sõnum 03.06.2010 19:31:15 vasta tsitaadiga

XYZ kirjutas:
Bssldr kirjutas:
Kas on võimalik ka programmi enda funktsioone välja kutsuda?

Näiteks võiks mingil console appil olla selline funktsioon.

void blah()
{
     cout << "blah" << endl;
}


On seda võimalik programmi töö ajal väljaspoolt kutsuda?
Need funktsioonid peavad olema algusest peale vormistatud väliselt väljakutsutavatena. Sellised on näiteks .dll-des peidus olevad funktsioonid.


Pole WinAPI-t uurinud, aga kas oleks võimalik selles teises protsessis uus thread alustada ja anda ette funktsiooni pointer?
Kommentaarid: 9 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 8
tagasi üles
vaata kasutaja infot saada privaatsõnum
mark11
HV vaatleja

liitunud: 28.01.2006




sõnum 03.06.2010 22:52:53 vasta tsitaadiga

inzinz kirjutas:
Kas sellel programmil faili avamine on ülevalt menüü ribast stiilis "File" => "Open" ja "File" => "Save" ? Kui jah siis peaks fookuse saama sinna menüüriba peale kui saata "ALT" keypress, seejärel allanoolega menüü lahti, nooleklahvidega õigesse kohta liikuda ja siis enter key saata. Avanenud file open/save dialoogile peaks ka saama erinevaid keypresse saata.

Vajadusel saab ka hiire evente saata progele ette, aga ma ei mäleta hetkel kas koordinaadid pidid olema ekraani või programmi ülemise vasaku nurga või suhtes.

Aga kõige selle juures tuleb silmas pidada sedasama asja mida ka HacaX mainis, see aken kuhu neid evente saadad, peab parasjagu fookuses olema (winapi käsk SetForegroundWindow(intptr)), kuna muidu ei jõua eventid kohale, ehk siis samal ajal selle masina taga sa ise ei saa midagi muud teha peale ekraani vaatamise.


hiirekordinaadid kasutades WM_ evente on siiski suhtes selle programmi aknaga, ehk "HWND"'iga.
on ka olemas GetCursorPos mis siis toimetab hetkeliselt aktiivsel desktopil..

ning misasja, aken peab olema fookuses, et evente saata ? see on küll jama jutt. vabalt saab hiire klikke saata programmile kui aken ise on ebaaktiivne.

seda asja lahendada hiireklõpsimisega on halb, väikene muudatus GUI's ning kogu programm lendab õhku mis toimetab 'klikkide genereerimisega'..

kuigi jah SendMessage on viis kuidas sellele läheneda. tuleks tõmmata mingisugune API monitor ning teha paar klikki ise ja vaadata millised eventid on triggeritud ja neid siis saata enda programmis.



Bssldr kirjutas:
XYZ kirjutas:
Bssldr kirjutas:
Kas on võimalik ka programmi enda funktsioone välja kutsuda?

Näiteks võiks mingil console appil olla selline funktsioon.

void blah()
{
     cout << "blah" << endl;
}


On seda võimalik programmi töö ajal väljaspoolt kutsuda?
Need funktsioonid peavad olema algusest peale vormistatud väliselt väljakutsutavatena. Sellised on näiteks .dll-des peidus olevad funktsioonid.


Pole WinAPI-t uurinud, aga kas oleks võimalik selles teises protsessis uus thread alustada ja anda ette funktsiooni pointer?

kui su programm kasutab funktsiooni mis on DLL teegist pärit siis sa saad seda funktsiooni kutsuda antud protsessis küll.

selleks pead käima üle kõik IAT elemendid[import address table] ning otsima üles õige nimega funktsiooni ning selle järgi vaatama tema hetkelise aadressi olemasoleva protsessi mälus.

siis saad kasutada funktsiooni VirtualAllocEx & WriteProcessMemory, et omale tellida mälu ning sinna kirjutada väikene funktsioonikene mis siis vastavalt kutsub selle "protsessis oleva funktsiooni", ning oma väikest funktsioonikest mis kutsub õiget funktsiooni välja saab kutsuda CreateRemoteThread'iga.
.muidugi, saab ka rämedamalt lihtsamalt. icon_wink.gif, samas selle lihtsama meetodi õigsuses ma pole kindel nii, et ei igaks juhuks siin midagi rohkemat kirjutadama.
Assembleri teadmine on vajalik.

Üks lihtsam viis:
lihtsalt tekita omale DLL fail, sinna sisse tee vastav funktsiooni viit ning sätesta see aadressile mis on protsessis oleva funktsiooni aadres, selle saamiseks pead väikest debugimist tegema ja lihtsalt kasuta mõnda kuulsamat DLL injectioni viisi, et see DLL'ike panna protsessi mällu. edasine on juba suhteliselt loogiline(kutsud välja funktsiooni kui oled saanud DLL käest signaali, et injection on toimunud).. miinus on siin see, et asi on staatiline, nii pea kui ümber kompileerid oma protsessi, siis võivad offsetid nihkuda ja õige aadress on läinud.
see meetod sobib ka DLL funktsioonide kutsumiseks, enda DLL faili pane miskit
Funktsiooni pointer = GetProcAddress(GetModuleHandle("DLL fail"), "funktsiooni nimi"); ja see DLL siis injecti protsessi. põhimõtteliselt on see sama nagu IAT aga lugemine on tehtud automaatseks funktsioonide abil.


ps! et teha dünaamilist funktsiooni leidjat siis sa pead skännima jooksvat protsessi ning otsima spetsiifilist biti patternit. kind of nagu AV töötavad. kui selle leidnud siis edasine on ikka sama.
Kommentaarid: 1 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
blinx
HV vaatleja

liitunud: 28.11.2009




sõnum 04.06.2010 00:28:52 vasta tsitaadiga

aga mis funktsiooni siis GetProcAddress kutsub kui HMODULEi saab
_________________
'Just buy everything then you're safe'
tagasi üles
vaata kasutaja infot saada privaatsõnum
mark11
HV vaatleja

liitunud: 28.01.2006




sõnum 04.06.2010 10:10:43 vasta tsitaadiga

blinx kirjutas:
aga mis funktsiooni siis GetProcAddress kutsub kui HMODULEi saab

kui ma nüüd õigesti aru sain siis GetProcAddress ei kutsu mingit funktsiooni..

ta käib läbi protsessi IAT'i kus on kõik DLL'ide funktsioonide nimed/mis failis nad asuvad ja nende funktsioonide asumis paik antud protsessis ning tagastab siis selle funktsiooni aadressi.
Kommentaarid: 1 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
THNS
HV vaatleja

liitunud: 12.05.2010




sõnum 04.06.2010 15:29:37 vasta tsitaadiga

GetProcAddress annab sulle funktsiooni pointeri mille kaudu saad funktsiooni välja kutsuda.

http://msdn.microsoft.com/en-us/library/ms683212(VS.85).aspx

Scrolli natuke alla poole seal on hea puust ja punaseks tehtud näide.
tagasi üles
vaata kasutaja infot saada privaatsõnum
Malukunn
HV vaatleja

liitunud: 18.06.2006




sõnum 11.07.2010 13:18:03 vasta tsitaadiga

Tere ja aitäh kõigile vastajatele,

suure hilinemisega küll vastan siia aga kasutasin lõpuks AutoIT v3. Esialgu proovisin ka sellise programmiga nagu WinAutomation aga kuna sellega ei hakanud see lahendus jooksma tõrgeteta siis läksin Auto It-le üle, mis pealegi veel vabavara. Selle programmiga siis asi suhteliselt lihtne ka algajale kuna seal on võimalik iga akna tunnuste järgi kõiki aknal olevaid nuppe manipuleerida või ka akna servadest teatud kaugusel olevaid kordinaate vajutada. Jooksutan seda programmi Excelist VBA abil kasutades ka bat faile tekstifailide kujul olevate input ja output failide manipuleerimiseks (mitme faili kokku liitmine jne).
Kommentaarid: 1 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
Hazar
Kreisi kasutaja
Hazar

liitunud: 24.08.2004




sõnum 11.07.2010 18:07:33 vasta tsitaadiga

getprocaddress töötab ainult programmisiseselt seega kui tahad kuskil teises programmis vajamineva funkti handle kätte saada pead leidma dlli target programmis, endale sama dlli sisse laadima, enda programmis dlli leidma ja siis aadress=endaprogrammifunktaadress-endaprogrammidllaadress+targetprogrammiddlaadress

palju lihtsam oleks lihtsalt DLLi enda seest lendu lasta sendmessage kus näiteks lparam on (LPARAM)Sinufunktsiooninimi ja kõik
Kommentaarid: 29 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 28
tagasi üles
vaata kasutaja infot saada privaatsõnum
aht0
HV veteran

liitunud: 14.10.2003




sõnum 12.07.2010 16:47:43 vasta tsitaadiga

Malukunn kirjutas:
Tere ja aitäh kõigile vastajatele,

suure hilinemisega küll vastan siia aga kasutasin lõpuks AutoIT v3. Esialgu proovisin ka sellise programmiga nagu WinAutomation aga kuna sellega ei hakanud see lahendus jooksma tõrgeteta siis läksin Auto It-le üle, mis pealegi veel vabavara. Selle programmiga siis asi suhteliselt lihtne ka algajale kuna seal on võimalik iga akna tunnuste järgi kõiki aknal olevaid nuppe manipuleerida või ka akna servadest teatud kaugusel olevaid kordinaate vajutada. Jooksutan seda programmi Excelist VBA abil kasutades ka bat faile tekstifailide kujul olevate input ja output failide manipuleerimiseks (mitme faili kokku liitmine jne).

norm..
ainus millest Autoit-s puudust tunnen on korralik "ImageSearch" funktsioon (eksisteerib custom UDF-ina aga seni tundus suht bugine) nagu on olemas AutoHotkeys.. muidu mõnus vabavaraline soft "pühapäeva" skriptijale..
Kommentaarid: 82 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 71
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Exe programmi manipuleerimine programmeerimiskeele abil
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.