1/******************************* 2******** OBFUSCAPERY ******* 3******************************** 4* Version 1.10 * 5* (c)2011 Lilaea Media LLC * 6******************************** 7************************************************************************************ 8THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 9EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 10OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 11SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 12INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 13TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 14BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 15CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 16ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 17DAMAGE. 18***********************************************************************************/ 19 20 21/***** PUT ME IN YOUR JS INCLUDE FOLDER AND POINT THE HTML SCRIPT SRC TAG AT ME ****/ 22$(document).ready(function(e) { 23 $(document).mousemove(isHuman); // requires a mouse move to load email address 24 $(document).on("touchstart", isHuman()); // Will fire the function on mobile devices, may require jQuery update 25}); 26 27function isHuman(e) { // handles mouse move event, assumes must be human 28 29 $(document).unbind('mousemove'); // unbind mouse event 30 var descriptor = '#obfu_x'; // change this 31 var hex = $(descriptor).text(); 32 33 if (hex != '' && hex != null) { 34 35 var res; 36 $.ajax({ // post back to php to get decrypt key and count 37 /*EDIT ME* CHANGE URL TO THE ACTUAL LOCATION OF THIS INCLUDE ON YOUR SERVER vvv**/ 38 url: 'cch_js/obfuscapery-v2.inc.php', 39 /*EDIT ME* CHANGE URL TO THE ACTUAL LOCATION OF THIS INCLUDE ON YOUR SERVER ^^^**/ 40 data: { 41 token: hex 42 }, // pass token 43 type: 'POST', // only works on post data 44 error: function() { 45 return; 46 }, // bail on error 47 success: function(response) { // get params 48 res = response; 49 }, 50 complete: function() { // gracefully replace each link with mailto link 51 replaceEmailLinks(res); 52 } 53 }); 54 } 55} 56 57function replaceEmailLinks(res) { 58 $.ajax({ 59 url: 'cch_js/resolve_domain.php', 60 data: { 61 host: document.location.host 62 }, 63 type: 'POST', 64 success: function(response) { // get params 65 var dec = xor_dec(res, response).split("\t"); // host must match to decode 66 var secret = dec.shift(); 67 var count = dec.shift(); 68 var prefix = dec.shift(); 69 for (e = 0; e < count; e++) { 70 var email = $('#' + prefix + e).text(); // get encrypted email address from div 71 72 if (email != '' && email != null) { 73 var selector = 'mailto_' + e; 74 email = xor_dec(email, secret).split("\t"); 75 swapMailTo(selector, email[1]); 76 } 77 } 78 }, 79 error: function() { 80 return; 81 } 82 }); 83} 84 85function swapMailTo(selector, email) 86{ 87 /*EDIT ME* MODIFY THIS OUTPUT TO SUIT YOUR NEEDS vvv**/ 88 var mailto = '<a href="mailto:' + email + '">' + email + '</a>'; // customize this 89 /*EDIT ME* MODIFY THIS OUTPUT TO SUIT YOUR NEEDS ^^^**/ 90 $("[id=" + selector + "]").fadeOut('slow', function(e) { $(this).html(mailto).fadeIn('slow'); } ); 91} 92 93function xor_dec(hex, key) 94{ 95 if (hex.length == 0 || key.length == 0) return; // verify input exists 96 while (key.length < hex.length) key += key; // pad key to >= hex 97 var string = ''; // initialize result string 98 for(p = 0; p < hex.length; p += 2) 99 { // iterate through input string two chars at a time 100 var h = hex.charAt(p) + hex.charAt(p + 1); // get next two hex chars 101 var b = parseInt(h, 16); // convert to decimal
102 var k = key.charCodeAt(p / 2); // get ascii value of corresponding key 103 var c = String.fromCharCode(b ^ k); // get ascii char from xor bitwise conversion 104 string += c; // add to result string 105 } 106 return string; 107}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.