Playing with Acme::Eyedrops

Today I had some fun with Perl code obfuscation Acme::EyeDrops module makes it ridiculously simple to add new obfuscation shapes to your code. Basically all it involves is creating a file with a extension  *.eye and use it to obfuscate your code. There are around 95 existing shapes to choose from to obfuscate your code including the popular Camel shape. There are a few country specific maps as well e.g. one for Canada. I used a image to ascii converter to convert the map of India into two formats. One where the map is the overlay and another where everything except the map is on overlay. I have pushed my .eye files upstream so you might be able to use it as soon as the dev’s accept my pull request. If you are impatient you can download the India specific .eye files from my github repository and manually copy them over. Here is my first result from a “Hello World” perl script obfuscated with my eye map:   Shape => ‘india_map’ eval eval '"'. +( '['^'+'). ('['^')').('`'|')'). ('`'|'.').('['^'/').( '{'^'[').'\\'.'"'.("`"| '"').('`'|',').('`'|'!') . ("`"| '(').('{'^'[').('`'|'"').('`'| ',').(('`')| '!').('`'|'(').'\\'.'"'.';'.('!'^'+').('['^'+' ).('['^')').('`'|')').('`'|'.').('['^"\/").( '{'^'[').'\\'.'"'.('`'|'"').('`'|',').('`' |'!').('`'|'(').('{'^'[').('`'|'"').('`'|',' ).('`'|'!').('`'|'(').'\\'.'"'.';'.('!'^'+' ).('['^'+').('['^')').('`'|')').('`'|'.') .('['^'/').('{'^'[').'\\'.'"'.('`'|'"'). ('`'|',').('`'|'!').('`'|'(').("\{"^ '[').('`'|'"').('`'|',').('`'|'!').( '`'|'(').'\\'.'"'.';'.('!'^'+').("\["^ '+').('['^')').('`'|')').('`'|('.')).( '['^'/').('{'^'[').'\\'.'"'.('`'|'"' ).('`'|',').('`'|'!').('`'|'('). ('{'^'[').('`'|('"')).( ( '`')|',').('`'|'!').(('`')| '(').'\\'.'"'.';'.('!'^'+').( '['^'+').('['^')').('`'|"\)").( '`'|'.').('['^'/').('{'^'[').'\\' .'"'.('`'|'"').('`'|',').('`'|('!')).( '`'|'(').('{'^'[').('`'|'"').('`'|(',')).( '`'|'!').('`'|'(').'\\'.'"'.';'.('!'^'+').('[' ^'+').('['^')').('`'|')').('`'|'.').('['^'/').('{' ^'[').'\\'.'"'.('`'|'"').('`'|',').('`'|'!').('`' |'(').('{'^'[').('`'|'"').('`'|',').('`'|'!').( '`'|'(').'\\'.'"'.';'.('!'^'+').('['^'+').("\["^ ')'). (('`')| ')').('`'|'.').('['^'/').('{'^'[').'\\'.'"'.("`"| '"').('`'|"\,").( '`'|'!').('`'|'(').('{'^'[').('`'|'"').('`'|',').('`'| '!').('`'|'(').('\\'). '"'.';'.('!'^'+').('['^'+').('['^')').('`'|')').('`'|'.'). ('['^'/').('{'^'[').'\\'. '"'.('`'|'"').('`'|',').('`'|'!').('`'|'(').('{'^'[').('`'|'"') . ('`'|',').('`'|'!').('`'|"\("). '\\' .'"'.';'.('!'^'+').('['^'+').('['^')').('`'|')').('`'|'.').('['^('/')).( ('{')^ '[').'\\'.'"'.('`'|'"').('`'|',').( '`'|'!').('`'|'(').('{'^'[').('`'|'"').('`'|',').('`'|'!').('`'|'(').'\\'.'"'.';'.( '!'^'+' ).('['^'+').('['^')').('`'|')').('`'| '.').('['^'/').('{'^'[').'\\'.'"'.('`'|'"').('`'|',').('`'|'!').('`'|'(').('{'^'[').('`'|('"')).( ('`')| ',').('`'|'!').('`'|'(').'\\'.('"'). ';'.('!'^'+').('['^'+').('['^')').('`'|')').('`'|'.').('['^'/').('{'^'[').'\\'.'"'.('`'|'"').("`"| (',')).( '`'|'!').('`'|'(').('{'^'[').('`'| '"').('`'|',').('`'|'!').('`'|'(').'\\'.'"'.';'.('!'^'+').('['^'+').('['^')').('`'|')').('`'|'.').(('[')^ '/').('{'^'[').'\\'.'"'.('`'|'"').('`'|',').('`'|'!' ).('`'|'(').('{'^'[').('`'|'"').('`'|',').('`'|'!').('`'|'(').'\\'.'"'.';'.('!'^'+').('['^'+').('['^')').('`'|')') .('`'|'.').('['^'/').('{'^'[').'\\'.'"'.('`'|'"'). ('`'|',').('`'|'!').('`'|'(').('{'^'[').('`'|'"').('`'|',').('`'|'!').('`'|'(').'\\'.'"'.';'.('!'^'+').('['^'+').('['^')').('`'|')').('`'|'.').('['^'/').('{'^'[') .'\\'.'"'.('`'|'"').('`'|',').('`'|'!').('`'|'(').('{'^'[').('`'|'"').('`'|',').('`'|'!').('`'|'(').'\\'.'"'.';'.("\!"^ '+').('['^'+').('['^')').('`'|')').('`'| '.').('['^'/').('{'^'[').'\\'.'"'.('`'|'"').('`'|',').('`'|'!').('`'|'(').('{'^'[').('`'|'"').('`'|',').('`'|'!').('`'| ( '(')).'\\'.'"'.';'.('!'^'+').("\["^ '+').('['^')').('`'|')').('`'|'.').('['^'/').('{'^'[').'\\'.'"'.('`'|'"').('`'|',').('`'|'!').('`'|'(').('{'^'[').('`' |'"').('`'|',').('`'|'!').('`'|'(') .'\\'.'"'.';'.('!'^'+').('['^'+').('['^')').('`'|')').('`'|'.').('['^'/').('{'^'[').'\\'.'"'.('`'|'"').('`'|',').("`"| '!').('`'|'(').('{'^'[').('`'|'"' ).('`'|',').('`'|'!').('`'|'(').'\\'.'"'.';'.('!'^'+').('['^'+').('['^')').('`'|')').('`'|'.').('['^'/').('{'^'['). ( ( ( (( '\\'))))).('"').( '`'|'"').('`'|',').('`'|'!').('`'|'(').('{'^'[').('`'|'"').('`'|',').('`'|'!').('`'|'(').'\\'.'"'.';'.('!'^'+'). ('['^'+').(('[')^ (( ')' ))).('`'|')').('`'|'.').('['^'/').('{'^'[').'\\'.'"'.('`'|'"').('`'|',').('`'|'!').('`'|'(').('{'^'[').('`'|'"').(('`')| ',').('`'|"\!").( '`'|'(').'\\'.'"'.';'.('!'^'+').('['^'+').('['^')').('`'|')').('`'|'.').('['^'/').('{'^'[').'\\'.'"'.('`'|'"').('`'|',').('`'|'!'). ('`'|'(').('{'^'[').( '`'|'"').('`'|',').('`'|'!').('`'|'(').'\\'.'"'.';'.('!'^'+').('['^'+').('['^')').('`'|')').('`'|'.').('['^'/').('{'^'[').'\\'."\"".( '`'|'"').('`'|"\,").( '`'|'!').('`'|'(').('{'^'[').('`'|'"').('`'|',').('`'|'!').('`'|'(').'\\'.'"'.';'.('!'^'+').('['^'+').('['^')').('`'|')').('`'|'.').( '['^'/').(('{')^ '[').'\\'.'"'.('`'|'"').('`'|',').('`'|'!').('`'|'(').('{'^'[').('`'|'"').('`'|',').('`'|'!').('`'|'(').'\\'.'"'.';'.('!'^'+').("\["^ '+').( '['^')'). ('`'|')').('`'|'.').('['^'/').('{'^'[').'\\'.'"'.('`'|'"').('`'|',').('`'|'!').('`'|'(').('{'^'[').('`'|'"').('`'|',').('`'|('!')).( '`'|...

Playing with OpenCV Vision Library on Ubuntu 14.04 x86_54

I have been starting to play with OpenCV as a part of my work for security systems. I haven’t found any Perl libraries for this except Image::Resize::OpenCV, Cv::* and Image::ObjectDetect which I might look at later, for now I will start with python libraries. At a later stage I might decide to write a Perl binding for OpenCV library. No commitments yet. It depends on my needs 🙂 For starters, here is what I do: sudo apt-get install libavformat-dev libcv2.4 libhighgui2.4 python-opencv opencv-doc libcv-dev libcvaux-dev libhighgui-dev there are a few examples for python in /usr/share/doc/opencv-doc/examples/python and in /usr/share/doc/opencv-doc/examples/python2 I will start off by trying...

Setting up ArchLINUX on BeagleBone Black – Part 3 – Setting up I2C and PWM controller

This Article is a placeholder for work in progress and I will log my success as I go forward. ArchLINUX has proven to be the lightest of all the distros that I have installed yet on Beaglebone Black. I have already got all the basics up and running and now I am setting up my perl stack and I2C and PWM interfaces. Make sure you have followed my previous instructions for ArchLINUX here. List of Instructions for Archlinux Install base devel and include all the sub packages. This is needed for installing XS modules and its roughly equivalent to build-essential package on Ubuntu $ pacman -S base-devel Install i2c-tools $ pacman -S i2c-tools Now we can go ahead and install Device::SMBus. This is the interface that I released to CPAN for connecting to I2C devices, in the last release Device::SMBus 1.05 I removed some dependencies on board and distribution specific differences in i2c-dev installations, so it works without issues on both Raspberry Pi and BeagleBone Black , ubuntu,armstrong and archlinux installations. $ cpan Device::SMBus I use the LSM303DLHC for my work with LSM303DLHC Altimeter and Magnetometer $ cpan Device::LSM303DLHC Installing module for using LPS331AP Altimeter Barometer $ cpan Device::LPS331AP Installing module for using L3GD20 Gyroscope $ cpan Device::L3GD20 My two ways of controlling PWM on Beagelbone Black: External I2C PWM Generator like PCA9685: I have already implemented this method before on Raspberry Pi, Since we have already setup I2C on ArchLINUX above, using PCA9685 is quiet simple, and while I have not lokked into the fact if the BeagleBone Black has a seperate microcontroller with a clock for controlling...

Setting up ArchLINUX on BeagleBone Black – Part 2

so I have been trying to get my usual environment up on archlinux.first comes vim $ pacman -Syq vim $ pacman -Syq perl-moose There is a cpan package for easily maintaining CPAN packages on arch linux CPANPLUS::Dist::Arch, its a CPANPLUS backend for ArchLINUXhttps://metacpan.org/pod/release/JUSTER/CPANPLUS-Dist-Arch-1.28/lib/CPANPLUS/Dist/Arch.pod $ cpan CPANPLUS::Dist::Arch setup cpan to use us automatically $ setupdistarch Install Device::SMBus as a pacman package $ cpanp -i...

Setting up perl and cpan the usual way on Angstrom Linux

I have gotten so used to using super convenient the default setups on ubuntu  for perl that other flavours of linux are feeling increasingly user-unfriendly. After I have been forced to switch to Angstrom on my Beaglebone Black, I have been trying to get it up like I usually like my Linux. There are tons of things missing in stock Angstrom distribution of perl and it just doesn’t do things right. So I decided to write a little guide on how to remove the existing perl distro and build a fresh version from the source: $ opkg remove perl --force-depends --force-remove $ wget http://www.cpan.org/src/5.0/perl-5.18.1.tar.gz  $ tar -xvf perl-5.18.1.tar.gz $ cd perl-5.18.1 Update system time, Configure can cause problems if you don't do this step  $ date -s "7 DEC 2013 22:47:00" $ ./Configure -d prefix=/usr/local/perl Go get some cofffee, this will take a while. $ make Mix it up get some hot chocolate this time 🙂 $ make install That will get you your usual cpan app on command line. Now if you want to install cpanminus there are few more step than usual. Upgrade your wgt as Angstrom on BB ships with a version of wget older than what is supported by cpanminus. Specifically the option –retry-connrefused used by cpanm is not supported by older versions of wget. $ opkg wget $ cpan App::cpanmius This should get your cpanm...

Reverting back to Angstrom Linux on my Beaglebone Black

Today I flashed back the Angstrom Kernel on my Beaglebone Black Board. Ubuntu arm Linux kernel caused me some issues with my realtek rtl8192cu wifi dongle, I was not keen to spend much time resolving this so I switched to Angstrom linux. I am quiet used to the process now. Its basically the same process as installing ubuntu on the BB except in this case I burn angstrom on to the SD card instead. This is all a part of the hung up process for me moving my Perl Autopilot development for my quadrotor drone over to my Beaglebone Black Board since my Raspberry Pi is now busy serving as the media center for my TV. However good thing is that I don’t need to use the PCA9685 chipset for generating the PWM signals since the Beaglebone black has its own GPIO Pins which can generate the right Pulse for controlling the DC motors. I can also get rid of the the breadboard for the moment, which might even help me remove a portion of the frame I was using for mounting all these extras. This means I will have some weight reduction, yippee 🙂 I am still working with the algorithms for Getting the right orientation values, I am some distance away from getting all the sensor data for achieving a straight hover capability. Most of this because I had to suspend this project first for all my trips to Macau and Hong Kong and then for my trip to Canada and later all the work committments. I hope I can get something going by the end of this...

Talking to LSM303DLHC Accelerometer and Compass using perl and Device::LSM303DLHC

I bought a pololu’s AltIMU inertial measurement unit that includes among other things a onboard Accelerometer and Magnetometer in the form of the LSM303DLHC chipset. I decided to write down the steps I take to get it working with my Beaglebone Black and Raspberry Pi boards using perl, to help those who are trying to achieve the same. First follow the instructions to install Device::SMBus on Beaglebone Black if you have a Beaglebone Black, or instructions to install Device::SMBus on a raspberry Pi if you are using a Raspberry Pi board Then install Device::LSM303DLHC from cpan sudo apt-get install Device::LSM303DLHC then put this code in a file and save it as lsm303dlhc.pl : #!/usr/bin/perl use strict; use warnings; use Device::LSM303DLHC;  my $dev = Device::LSM303DLHC->new(I2CBusDevicePath => '/dev/i2c-1'); $dev->Magnetometer->enable(); $dev->Accelerometer->enable(); while(){   my $accelerometer = $dev->Accelerometer->getRawReading();   my $compass = $dev->Magnetometer->getRawReading();   print "\tACCELEROMETER: $accelerometer->{x}\t$accelerometer->{y}\t$accelerometer->{z}\t\tCOMPASS: $compass->{x}\t$compass->{y}\t$compass->{z}\t\n" ; } Run this file now, you will get the following result:     The code and these modules have been tested to work on both Raspberry Pi models and on Beaglebone black, and there is no reason why it wont work in other dev boards as long you have perl and the other dependencies for Device::SMBus on...

Setting up Device::SMBus on Beaglebone Black

Yesterday I managed to find time to setup debian on my Beaglebone Black. So today I am going about setting up Device::SMBus perl library on it so that I can start talking to my smart I2C devices through it. First step is ofcourse getting the dependencies in place sudo apt-get install libi2c-dev build-essential libmoose-perl I2C kernel modules are enabled by default on debian so we don’t need to enable them explicitly like we need to in Pi. On debian beaglebone black i2c bus doesn’t seem to support quick write so i2cdetect -y 1 does not work Instead I use i2cdetect -r 1 This should show you the list of i2c devices connected to your board. Next install Device::SMBus from cpan. sudo cpan...

Teaching Myself Go(golang) – Part 2 Hello World

Every file in Go must start with a package line, The binary that you would want to run would be called package main (I notice the first similarity with C). So I hash out my first bare golang program go1.go : package main func main(){ } At this point I start noticing some stuff thats borrowed from python like no end of line charachter (; in C, Perl etc.). Personally given my heavy Perl background I like to write commands in multi level lines in Perl and I think its a better option than writing a long command in a single line, so this is not really my favourite feature. But to each his own. Anyway this is not exactly like Python, because you can put a semi colon at the end if you wish to. So in a way it tries to accomadate people with either kind of preference vis-a-vis EOLs. Now I run my program with with: go run go1.go It runs fine. and there are no errors. Next I fill it up with hello world logic, but now the whole packaging system comes into play, to use any function in go you need to import the package that provides the function. In this case we need Println for printing a line and its exported by fmt. package main import "fmt" func main(){   fmt.Println("Hello World") } Viola it churns out Hello World for me!...

Teaching Myself Go(golang) – Part 1 Installing and Configuring

First things first, my base system is a Ubuntu 12.04.2 32 bit desktop. First I install Go sudo apt-get install golang-go It’s interesting how this system works, it prompts me to verify if I want to report my install to the godashboard.appspot.com server! I am impressed! I notice a new idea even before I start working with this language. The entire install comes up to 79.6 Mb on my Laptop. Thats it, everything is installed! Gotta love the debian packaging...