From f13a3c1bcd6e60d9d9543aed3e69be999dfe6cc5 Mon Sep 17 00:00:00 2001 From: Discountrobot Date: Tue, 24 Dec 2013 13:48:12 +0100 Subject: [PATCH] working with adplay?v=pag__PH1OvUU4OQqdUvv6vbm8Mv2Mnnjko3WFPB7J141 --- Gruntfile.js | 38 ++ LICENSE | 20 + README.md | 64 ++++ chrome extension/README.md | 21 ++ chrome extension/background.js | 15 + chrome extension/icon-24.png | Bin 0 -> 1846 bytes chrome extension/manifest.json | 37 ++ chrome extension/popup.html | 36 ++ chrome extension/popup.js | 37 ++ chrome extension/scripts/home.js | 186 ++++++++++ chrome extension/scripts/signup.js | 83 +++++ chrome extension/scripts/userData.js | 25 ++ headless/README.md | 13 + headless/checkLogins.py | 25 ++ headless/createAccount.py | 43 +++ headless/docs/adplay.js | 463 +++++++++++++++++++++++ headless/docs/postback.json | 53 +++ headless/docs/scheme.png | Bin 0 -> 5956 bytes headless/headless.js | 529 +++++++++++++++++++++++++++ headless/headless.py | 74 ++++ headless/json/firstnames.json | 161 ++++++++ headless/json/lastnames.json | 60 +++ headless/json/logins_template.json | 22 ++ 23 files changed, 2005 insertions(+) create mode 100644 Gruntfile.js create mode 100644 LICENSE create mode 100644 README.md create mode 100644 chrome extension/README.md create mode 100644 chrome extension/background.js create mode 100644 chrome extension/icon-24.png create mode 100644 chrome extension/manifest.json create mode 100644 chrome extension/popup.html create mode 100644 chrome extension/popup.js create mode 100644 chrome extension/scripts/home.js create mode 100644 chrome extension/scripts/signup.js create mode 100644 chrome extension/scripts/userData.js create mode 100644 headless/README.md create mode 100644 headless/checkLogins.py create mode 100644 headless/createAccount.py create mode 100644 headless/docs/adplay.js create mode 100644 headless/docs/postback.json create mode 100644 headless/docs/scheme.png create mode 100644 headless/headless.js create mode 100644 headless/headless.py create mode 100644 headless/json/firstnames.json create mode 100644 headless/json/lastnames.json create mode 100644 headless/json/logins_template.json diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..8c72466 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,38 @@ +module.exports = function(grunt) { + + grunt.initConfig({ + + jshint: { + options: { + curly: true, + eqeqeq: true, + eqnull: true, + browser: true, + undef: false, + sub: true, + globals: { + jQuery: true + }, + }, + + files: { + src: ['headless/*.js', 'chrome extension/*.js', 'chrome extension/*/*.js'] + }, + }, + + jsonlint: { + sample: { + src: [ 'headless/json/*.json' ] + } + }, + + }); + + grunt.loadNpmTasks('grunt-contrib-jshint'); + grunt.loadNpmTasks('grunt-jsonlint'); + + grunt.registerTask('default', [ + 'jsonlint', + 'jshint' + ]); +}; \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..03d88f3 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +Copyright 2013 Discountrobot + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b661662 --- /dev/null +++ b/README.md @@ -0,0 +1,64 @@ +## Headless +`Headless` is a project demonstrating how easily the verification scheme of [`eovendo.com`](http://eovendo.com) can be foiled. The project both includes a bot based upon [`phantomjs`](http://phantomjs.org/) utilizing multi-threading, dispatched by python. And a [`chrome extension`](chrome extension) for a more visualized demonstration. + +#### Features +1. Minimal bandwidth usage: + (currently using less than 600kb pr. account) +2. Proxies: Taking advantage of the native proxy flag in [`phantomjs`](http://phantomjs.org/) the python dispatcher can take a list of proxy servers and will randomly assign a proxy to each Thread. +3. currently undetectable, given the data-model sent between the client and the server (more on this in the [verification scheme](#verification-scheme) section . + +#### Limitations +1. There are known memory leaks in [`phantomjs`](https://code.google.com/p/phantomjs/issues/detail?id=979), so if you're running the script on something small, say a raspberry pi, then remember to make a swap file to prevent hanging. + +### Verification Scheme +The verification scheme for correctly watching a commercial on [`eovendo.com`](http://eovendo.com) is easily reverse engineered given the insight in the javaScript API, and the console output. + +1. javaScript API: [`adplay.js`](headless/docs/adplay.js) +2. structure of a sample "GET" request: [`postback.json`](headless/docs/postback.json). + +#### Time validation +Verification happens through validating the time and that it has changed correctly. +We can describe this scheme with a formula. +`R` = requestTime = the time of the request +`S` = startTime = the time stamp given when starting the commercial +`E` = endTIme = the time stamp given when finishing the commercial +`mediaDuration` = the runtime of the commercial + +we describe the formula as `R < (S + mediaDuration) <= E` which can also be visualized as: + +

+ +

+ +#### Possible pesudo server code +Below is a pseudo snippet of what could be the validating part of the server, written in javaScript syntax. + +```javascript +if ( + // timestamp + client.RequestTime === server.RequestTime && + client.StartTime > client.RequestTime && + client.EndTime >= client.SartTime + server.Campaign.MediaDuration && + + // values that needs to be set accordingly + client.AdStatus.value === 'Completed' && + client.Campaign.IsViewed === true && + + // other values that needs to be set (correct by default) + client.id === server.id && + client.UserId === server.UserId && + client.Tag === server.Tag && + client.RequestIpAddress === server.RequestIpAddress && + client.Campaign.CampaignId === server.Campaign.CampaignId && +) { + return true; +} +``` +### Installation +#### Chrome Extension +read more here: [`chrome extension`](chrome extension) +#### Phantomjs bot +read more here: [`headless.js`](headless) + +### License +[MIT](LICENSE) diff --git a/chrome extension/README.md b/chrome extension/README.md new file mode 100644 index 0000000..da4c55c --- /dev/null +++ b/chrome extension/README.md @@ -0,0 +1,21 @@ +### Demonstration +A video demonstration can be found on youtube + + +### Features +1. Generation of random Danish names, passwords and emails on the sign-up page. + +### Sign up parameters. +To extend the generated data at the sign up page, edit the respective arrays in [`signup.js`](scripts/signup.js) + +### Settings +There are currently 2 settings for the chrome extension + +1. temporarily activate/deactivate the extension +2. Run automatically on load + +![settings picture](http://i.imgur.com/jm9uHBB.png) + +### Installation +Install by adding the folder as an "unpacked extension" in the `chrome://extensions` tab \ No newline at end of file diff --git a/chrome extension/background.js b/chrome extension/background.js new file mode 100644 index 0000000..679ce46 --- /dev/null +++ b/chrome extension/background.js @@ -0,0 +1,15 @@ +// add the page action, if we're on the right domain. +chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { + if (tab.url.indexOf('eovendo.com') !== -1) { + chrome.pageAction.show(tabId); + } +}); + +// return localStorage data upon request. +chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { + if (request.method === "getLocalStorage") { + sendResponse({data: localStorage[request.key]}); + } else { + sendResponse({}); + } +}); \ No newline at end of file diff --git a/chrome extension/icon-24.png b/chrome extension/icon-24.png new file mode 100644 index 0000000000000000000000000000000000000000..0103327de8765a17245d78abc43ccb5d287f1591 GIT binary patch literal 1846 zcmV-62g&$}P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qRNAp5A000K1Nkl0ieYQYh0xBd<(hj{4m8KgNk^!`G`L> zPXd3|K;dRk!FzZw+eoIvFRjl}1iTdGGXGe*&kB@Y-wAbw7kUcM1FFk_@{)8_g#y)A zfST{oQ{+#3yv1I&VO!>qs0Odm1dRQ`ZuWa=J}WxdDU=~-%Q=dMLj8HJxnOl)Mk+_rE~J12YY_pi^~&?z^Bi=1YPtYNB^R6}f|8h2ra`sEja2W%w4c zpKY0gxtNo=B^S>YFz%MqT<4Y~4?M|qM|-PW6S%dws+AA7p*qqU)loaeRT*K0)@&cje+Zf% z9Uc%6vkPUvnjKF6QJ`WgjC6n3#5Ig=noBGOi^uk!Sk+BgXg8yt_sDk(d)}+JfCP5~8a94t%Q{X34qBp) ziZH0NebE@l0{SB`&;>$3gasSG*Hc-54OZ7nkV zRw3iuYGj`K1exbQC44537i^58Yg_2w??rRsL3HGvq8T7VL&6>;A6tl|Ba8GCkoL_= z@OzU-w}+SKm5^2PFqqB zij?qZPWN4gB+o@?PH~|KEYwdxb+`jM@_dm(sYpIzgt9Pmntqg1%6B~#U~P;YwU*Rg zDovkP(VP&|FOnuF9ZCgP)*{i<5UD4ZQ!0E>decl#0bBzoms0M%MCdDjv8DDg5M+5l z>ripqO0-se9Cb*X9qJTxCdAr^PAIvt3E2UwMD!Be4N-NAin&aNrj)%%Ild6ddZj?8 z2GkiI=q;g;Q!&;>AHd_wn~_1k$@kAj?14F2+}~=A;1BDO?!5+up;Ux1&QeN>&Z1gw zh0K3c1Jq8f)NXCrCn*2th*%~)gy=vv4G1Lgl@a_w7p268PQ!n(2AV|;IMHz7!9=5$ zrXvrbYI+_BoYtpxF7S?Yy)>ig|EU3)jsOt}jevf{*~S7^71xyIo zG0XRn*D@-c=coal2uP4p5~O>N1q=~!oiBG#d{ca%cj6*3ceF%7~tGmArh6>=tkIqw9 z&YEbFaM-Bpk=Ig`-`q-rAn#}P2Y0uoaC>Mh|ZqdZU1Gu(0meQbcNFw~Fb@!c_+*~+w{7M522XpED zYNosR#qw1Glkof99D)&H31OKoE==j}=Bf{x(%wtoc`w_r?F+q}4qaTF9KzQKZxDEz k4F~>>_wZglUe7V+FBhAz+15)&j{pDw07*qoM6N<$g6g+R_W%F@ literal 0 HcmV?d00001 diff --git a/chrome extension/manifest.json b/chrome extension/manifest.json new file mode 100644 index 0000000..d7484c8 --- /dev/null +++ b/chrome extension/manifest.json @@ -0,0 +1,37 @@ +{ + "name": "EovendoHeadless", + "version": "0.6", + "manifest_version": 2, + "icons": { + "48" : "icon-24.png", + "128" : "icon-24.png" + }, + "page_action": { + "default_name": "EovendoHeadless", + "default_icon": "icon-24.png", + "default_popup": "popup.html" + }, + "permissions" : [ + "tabs" + ], + "background" : { + "scripts": ["background.js"] + }, + "content_scripts": [ + { + "matches": ["*://www.eovendo.com/Signup"], + "js": ["scripts/signup.js"], + "run_at": "document_idle" + }, + { + "matches": ["*://www.eovendo.com/Home"], + "js": ["scripts/home.js"], + "run_at": "document_idle" + }, + { + "matches": ["*://www.eovendo.com/UserData"], + "js": ["scripts/userData.js"], + "run_at": "document_idle" + } + ] +} \ No newline at end of file diff --git a/chrome extension/popup.html b/chrome extension/popup.html new file mode 100644 index 0000000..e247cad --- /dev/null +++ b/chrome extension/popup.html @@ -0,0 +1,36 @@ + + + + + + + +
+ + +
+
+ + +
+ + \ No newline at end of file diff --git a/chrome extension/popup.js b/chrome extension/popup.js new file mode 100644 index 0000000..23e0907 --- /dev/null +++ b/chrome extension/popup.js @@ -0,0 +1,37 @@ +chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { + if (request.method === "getLocalStorage") { + sendResponse({data: localStorage[request.key]}); + } + else { + sendResponse({}); + } +}); + +window.onload = function(){ + + var $evhActive = document.querySelector('#evhActive'); + var $evhAutomatic = document.querySelector('#evhAutomatic'); + var evh = JSON.parse(localStorage['evheadless'] || "{}"); + + if(evh.active) { $evhActive.click(); } + if(evh.automate) { $evhAutomatic.click(); } + + $evhActive.addEventListener('change', function(){ + evh.active = this.checked; + localStorage['evheadless'] = JSON.stringify(evh); + + chrome.tabs.getSelected(null, function(tab) { + chrome.tabs.reload(tab.id); + }); + }); + + $evhAutomatic.addEventListener('change', function(){ + evh.automate = this.checked; + localStorage['evheadless'] = JSON.stringify(evh); + + chrome.tabs.getSelected(null, function(tab) { + chrome.tabs.reload(tab.id); + }); + }); + +}; diff --git a/chrome extension/scripts/home.js b/chrome extension/scripts/home.js new file mode 100644 index 0000000..9e02362 --- /dev/null +++ b/chrome extension/scripts/home.js @@ -0,0 +1,186 @@ +home = function() { + + evhStop = false; + + getMoney = function () { + + $goPro.css({'opacity': '0.5'}).prop('onclick', null); + + this.playCoinSound = function() { + var sound = document.createElement('audio'); + sound.setAttribute("type", "audio/ogg"); + sound.setAttribute("src","data:audio/mpeg;base64, SUQzAwAAAAAHdlRDT04AAAANAAAB//5PAHQAaABlAHIAR0VPQgAAACYAAAEAAAD//lMAZgBNAGEAcgBrAGUAcgBzAAAADAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+1LArQALMNVRhiELaV8kKLySjXEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/7UsCyAAsU2SGHoGtAAAAlwAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw="); + sound.play(); + }; + + document.title = "initializing ..."; + + var totalAds = parseInt($('#spnTotalAds').text()), + adsLeft = totalAds - parseInt($('#spnWatchedAds').text()), + balance = parseFloat($('#lblBalance').text().replace(',','.')); + + this.done = function() { + document.title = "Done! balance: " + balance + 'kr,-'; + $overlay.fadeOut(); + document.dispatchEvent(new Event('adPlayCompletedEvent')); + }; + + this.run = function() { + + $.ajax({ + type: "GET", + url: "/api/adblockapi", + dataType: "json" + }).done(function(abm){ + + // the returned data block will be null if no ads are left + // we'll end the script that is the case. + if (!abm) { + + done(); + return false; + + } + + // these are the values required for verification + abm.Campaign.isViewed = true; + abm.AdStatus.value = "Completed"; + // abm.StartTime > abm.RequestTime + abm.StartTime = abm.Campaign.StartTime = (new Date()).toISOString(); + + var randomEndTime = Math.round(Math.random() * (10 - 2) + 2), + countDown = abm.Campaign.MediaDuration + randomEndTime, + titleTimer = setInterval(function(){ + + if (countDown <= 1) { clearInterval(titleTimer); } + + var msg = 'Ad ' + (totalAds - adsLeft) + '/' + totalAds + ' has ' + countDown + "s left .."; + document.title = msg; + $info.text(msg); + + countDown --; + + }, 1000); + + var timeout = setTimeout(function(){ + // abm.EndTime >= abm.SartTime + abm.Campaign.MediaDuration + abm.EndTime = abm.Campaign.EndTime = (new Date()).toISOString(); + + // post the updated abm object. + $.ajax({ + type: "POST", + url: "/api/adblockapi", + data: JSON.stringify(abm), + contentType: "application/json", + dataType: "json" + }).done(function(){ + adsLeft --; + playCoinSound(); + updateUserBalance(); + checkAdStatus(); + $('#lblBalance').text(balance); + run(); // recursive step + }); + + }, (countDown) * 1000); + + var stopEvh = setInterval(function() { + if (evhStop) { + + clearTimeout(timeout); + clearInterval(titleTimer); + done(); + + } + }); + + }); + }; + + this.run(); + + }; + + $('#popupReferrerClose').click(); + + + var $overlay = $('
') + .css({ + 'width': $(window).width(), + 'height': $(window).height(), + 'zIndex': 10000, + 'background': 'rgba(0,0,0,0.5)', + 'position': 'absolute', + 'top': 0, + 'transition': 'background-color 0.5s ease' + }) + .appendTo('body'); + + var $handler = $('

Eovendo Headless

') + .css({ + 'padding': 10, + 'position': 'absolute', + 'top': 10, + 'left': 10, + 'backgroundColor': 'white', + 'border': '1px solid #888', + 'borderRadius': '3px' + }) + .appendTo($overlay); + + var $info = $('
') + .appendTo($handler); + + var $goPro = $('Begynd') + .appendTo($handler); + + var $cancel = $('luk') + .appendTo($handler); + + $('.evh_btn').css({ + 'textAlign': 'center', + 'fontWeight': 'bold', + 'color': 'white', + 'background': 'none' + }); + + $('#evh_handler a').css({ + 'marginRight': 10, + 'float': 'left' + }); + + var currentVersion = 'pag__PH1OvUU4OQqdUvv6vbm8Mv2Mnnjko3WFPB7J141', + version = $('script[src*="adplay"]').prop('src'), + v = version.indexOf('v='); + version = version.substr(v + 2, version.length); + + if (version !== currentVersion) { + + $('#evh_warn').text('Player version changed, beware!'); + + } + +}; + +// due to the sandboxed nature of chrome extensions, we inject the script via. a