Headless
is a project demonstrating how easily the verification scheme of eovendo.com
can be foiled. The project both includes a bot based upon phantomjs
utilizing multi-threading, dispatched by python. And a [chrome extension
](chrome extension) for a more visualized demonstration.
- Minimal bandwidth usage: (currently using less than 600kb pr. account)
- Proxies: Taking advantage of the native proxy flag in
phantomjs
the python dispatcher can take a list of proxy servers and will randomly assign a proxy to each Thread. - currently undetectable, given the data-model sent between the client and the server (more on this in the verification scheme section .
- There are known memory leaks in
phantomjs
, so if you're running the script on something small, say a raspberry pi, then remember to make a swap file to prevent hanging.
The verification scheme for correctly watching a commercial on eovendo.com
is easily reverse engineered given the insight in the javaScript API, and the console output.
- javaScript API:
adplay.js
- structure of a sample "GET" request:
postback.json
.
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:
Below is a pseudo snippet of what could be the validating part of the server, written in javaScript syntax.
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;
}
read more here: [chrome extension
](chrome extension)
read more here: headless.js