Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
Malukunn
HV vaatleja
liitunud: 18.06.2006
|
20.05.2010 12:56:50
Exe programmi manipuleerimine programmeerimiskeele abil |
|
|
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 |
|
 |
HacaX
HV Guru

liitunud: 22.01.2004
|
20.05.2010 18:30:57
|
|
|
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 |
|
 |
inzinz
HV kasutaja
liitunud: 26.01.2005
|
21.05.2010 09:17:48
|
|
|
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 |
|
 |
maxorator
HV kasutaja
liitunud: 30.08.2006
|
21.05.2010 10:14:31
|
|
|
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...
|
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
 |
andresv
HV kasutaja
liitunud: 06.12.2004
|
21.05.2010 15:18:42
|
|
|
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 |
|
 |
Supiplex
HV veteran

liitunud: 11.12.2002
|
21.05.2010 15:23:59
|
|
|
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
_________________ 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 |
|
 |
blinx
HV vaatleja
liitunud: 28.11.2009
|
21.05.2010 20:03:21
|
|
|
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 |
|
 |
HacaX
HV Guru

liitunud: 22.01.2004
|
23.05.2010 21:20:24
|
|
|
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...  |
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 |
|
 |
THNS
HV vaatleja
liitunud: 12.05.2010
|
|
tagasi üles |
|
 |
aht0
HV veteran
liitunud: 14.10.2003
|
|
Kommentaarid: 82 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
71 |
|
tagasi üles |
|
 |
Bssldr
HV kasutaja
liitunud: 05.12.2009
|
03.06.2010 15:57:48
|
|
|
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 |
|
 |
XYZ
HV Guru

liitunud: 05.11.2001
|
03.06.2010 16:24:57
|
|
|
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 |
|
 |
Bssldr
HV kasutaja
liitunud: 05.12.2009
|
03.06.2010 19:31:15
|
|
|
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 |
|
 |
mark11
HV vaatleja
liitunud: 28.01.2006
|
03.06.2010 22:52:53
|
|
|
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. , 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 |
|
 |
blinx
HV vaatleja
liitunud: 28.11.2009
|
04.06.2010 00:28:52
|
|
|
aga mis funktsiooni siis GetProcAddress kutsub kui HMODULEi saab
_________________ 'Just buy everything then you're safe' |
|
tagasi üles |
|
 |
mark11
HV vaatleja
liitunud: 28.01.2006
|
04.06.2010 10:10:43
|
|
|
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 |
|
 |
THNS
HV vaatleja
liitunud: 12.05.2010
|
|
tagasi üles |
|
 |
Malukunn
HV vaatleja
liitunud: 18.06.2006
|
11.07.2010 13:18:03
|
|
|
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 |
|
 |
Hazar
Kreisi kasutaja

liitunud: 24.08.2004
|
11.07.2010 18:07:33
|
|
|
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 |
|
 |
aht0
HV veteran
liitunud: 14.10.2003
|
12.07.2010 16:47:43
|
|
|
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 |
|
 |
|