Tuesday, May 12, 2015

Changing MAC Address on Windows

In testing wireless across a conference center, I do a few different things.

  1. Scanning tools like Vistumbler (laptop) and Wifi Analyzer (Android phone) to discover access points
  2. Throughput testing with Speedtest
  3. Connecting the wireless card on the laptop to the network to force splash screen authentication

The last part is challenging as after the first connection, repeated disconnects and reconnects will provide the same IP address through DHCP and bypass the splash screen. This is because most systems cache MAC addresses so repeated authentication isn't required for the duration of the lease.

Changing MAC addresses will present as a new device and thus a new IP address is issued and authentication via the splash screen is required. But how to easily change a MAC address in Windows?

Thankfully, it can be done. Unfortunately, it's a bit of obsured registry hacking that does it.

Enter MACChanger.bat. This Windows batch file uses 'reg', 'wmic' and 'netsh' to query the registry and set the appropriate keys to change the MAC address of the specified adapter. It's pretty easy, but does require Administrator privileges.

If you set the wireless network to automatically connect, then a simple:

C:\> macchanger.bat "Wireless Network Connection" -r

Changes the MAC address to a random value and reconnects to the network.

MACChanger.bat can be found on my Software page.

Tuesday, March 31, 2015

Netcat Proxy on Windows: Part 2 - v4/v6 Translation

In my previous post I looked at a Netcat proxy on Windows using named pipes to emulate how it works on *nix. Now that I got it working in the straightforward case, I decided to see if Netcat could be used as an IPv4 / IPv6 translation proxy.

This of course requires a Netcat that has IPv6 capabilities and because of my setup - works on Windows. Luckily, I have just the thing - nc64 which you can grab here.

The setup is more or less the same as for the IPv4-only test case last discussed: start the named pipe server, start the Netcat proxy, then connect. However, in this case, the Netcat proxy setup is slightly different. We'll need to listen on IPv4 and forward to IPv6 and vice versa for the opposite test case. Let's look at IPv4 to IPv6 first.

Monday, March 30, 2015

Netcat Proxy on Windows: Part 1 - Named Pipes

Using Netcat as a proxy has been well documented and is pretty straightforward on *nix:

&gt mkfifo backpipe
&gt nc -l 3000 0&ltbackpipe | nc www.google.com 80 1&gtbackpipe

However, I'm running Windows and the concept of named pipes (mkfifo) is a bit different. There isn't a Windows command to create a named pipe; rather, it must be programmatically done. Also, it operates a bit different so even with a Windows named pipe, the above command didn't work for me.

There are workarounds, using the '-e' option but I couldn't get those to send data back to me. So I figured it was time to find out how named pipes work and see what I could do with that.

Wednesday, March 25, 2015

Defeating Lollipop Longing with KitKat Kustomizations

Even with a third-party ROM, I won't be getting Lollipop on my long-in-the-tooth Samsung Galaxy S3. It runs fine, doesn't give me any real troubles, gets app updates from the Play Store - just no operating system updates.

And of course, that's the issue.

Some of the new features of Lollipop - most notably notifications and smart lock - are missing from KitKat (4.4.2 is what my GS3 is running). And I need them!

Developers to the rescue!

Notifications

For notifications, I looked at a few options and first settled on Heads-up notifications. It was easy to set-up and use, offered a clean and smooth user interface and did what I wanted - mostly. It didn't offer multiple notifications, only the latest one. Feature requests were made but it seems the developer doesn't want that in this app. From the open-source repository:

"I ran a poll on my website a while ago, where over 1,000 users voted. Roughly 50% of the users wanted support for multiple notifications. [...] (this option should probably be implemented in a separate app as it kills the whole point of non-intrusive notifications)."

Since "Android app developer" isn't on my resume and my limited programming chops couldn't make heads or tails of the open source code, I needed to find something else.

Enter Floatify. This app does the same but allows for multiple notifications. However, you'll need the ProKey ($2.49) to enable all features. I sprung for it and am pretty happy so far.

Smart Lock

Like notifications, I looked at a few options and settled on Dislock. This allowed me to set up my home WiFi network as a trusted location and disable the lockscreen while at home. I previously used the pattern unlock but this app (and most others of this kind to be fair) only supports PIN and password mode. So I had to switch and get used of using PIN to unlock; not a big deal.

This app too has a paid-for mode ($2.99) with an in-app purchase to allow more than one trusted "device". Since I've set up my home WiFi, I can't set up my Bluetooth headset or car Bluetooth also without the purchase. For now, skipping the lockscreen at home is fine.

Another note is that when this app installs and activates, it changes the default lockscreen security to "None" when on the trusted network. This means pressing any button on my phone (power or home) activates the home screen. This can lead to accidental app opening or other issues since there isn't the intermediate swipe to get to the home screen. I tried setting the default lockscreen security to "Swipe" and it WORKED! Now, at home, pressing a button activates the swipe to unlock screen (no security). And when I'm away, PIN to unlock appears to maintain security in untrusted locations. Works a treat!

Monday, September 15, 2014

Reach the Beach Relay - 2014

Massakruliks - Mens Open

234/521 - 34/46

Back row from left: Paul (leg 12), Dave (leg 9), Randy (leg 2), Gavin (leg 8), Erin (leg 3), Jackie (leg 6), Jim "Wiggy" (leg 11)

Middle row from left: Steve (leg 1), Ali (leg 10), Jen (leg 4), Leon (leg 7)

Front row: Vince [aka: Me] (leg 5)

Vert
Distance Difficulty Gain Loss Net Flair Time Pace
Leg 5 5.5 Easy 73 388 -315 +11 37:25 6:48
Leg 17 9.1 Hard 773 739 34 +22 1:09:50 7:40
Leg 27 * 8.57 Hard 471 530 -60 +11 1:08:44 8:00
23.17 +44 2:55:59 7:36

* Due to an injury in our van, some switching happened and I volunteered for the longest of the last set of legs.

Monday, June 23, 2014

Perl and SQLite - Follow Through, On and Up

As follow through to my previous post, I did some investigation into SQLite and got that working in my little database proof of concept script.

As follow-on to my digression in that post, SQLite adds yet another wrinkle in the AUTO_INCREMENT saga I used as a primary key in each of my tables. These are the strings I found to work:

Microsoft Access
ID AUTOINCREMENT NOT NULL PRIMARY KEY
MySQL
ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY
SQLite
ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL

As follow-up to my statement about not finding a way to programmatically instantiate a MySQL database, I did some searching and found the following in the 'perldoc' for DBD::mysql - I have yet to try it.

$rc = $drh->func('createdb', $database, $host, $user, $password, 'admin');

...

createdb
    Creates the database $dbname. Equivalent to "m(y)sqladmin create $dbname".

And finally, the topic of this post. I found this neat little Perl extension for SQLite and thought I might give it a try.

Learning from my last post, I checked my SQLite version and it was 32-bit, so I switched my Perl to Strawberry 5.18.1 32-bit on Windows 7 x64 and followed the steps outlined in that post. It worked a treat first time! So I ported the executable extension to my other machine and tried it and it failed.

Knowing my other machine was 64-bit for everything I switched Perl back to Strawberry 5.18.1 64-bit on my original machine and failure there too. It makes sense; I compiled a 32-bit Perl extension for a 32-bit version of SQLite - it stands to reason it would need a 32-bit version of Perl to run it. But I use 64-bit Perl normally.

Easy enough solution, I grabbed the sources for SQLite from their download page and compiled myself with the 64-bit gcc from Strawberry Perl 5.18.1 64-bit. This incidentally was the easiest build I've done - no warnings, no errors, built first time.

gcc shell.c sqlite3.c -o sqlite3.exe -lpthread

I redid the extension compile with 64-bit Perl and all worked again - this time all with 64-bit.

Since I did this a few times (due to my own mistake), I created a Perl package with a Makefile.PL to easily rebuild the SQLite Perl extension whenever / wherever needed.

Tuesday, June 17, 2014

64-bit Solution for "2-bit" Perl Problem

I'm not a Perl programming by trade, I just know enough to help me in my day to day activities. That said, database development / interaction with Perl is not a day to day activity, but it's something I feel I should know at a base level for the few times I've needed it in the past. To that end, I have a simple script that illustrates database instantiation, creation, population and some data manipulations with Perl.

I mainly use Windows, so the database for my little experiment was Microsoft Access as that's the most common database found on Windows; usually part of an enterprise Microsoft Office installation. I also have a view to cross platform capabilities, so I made my script check the operating system ($^O eq "MSWin32") and if not Windows, use MySQL as the database.

<digression>This presents some issues with database creation - creating tables has a different SQL syntax between Microsoft Access and MySQL so again an operating system check is required for some activites. For example, both have the concept of auto-increment, but MySQL is AUTO_INCREMENT, Access is AUTOINCREMENT. And while MySQL needs a type definition (INT AUTO_INCREMENT), Access believes AUTOINCREMENT is explicitly an integer type of its own, so will fail with INT AUTOINCREMENT.</digression>

My script:

  1. Instantiates - make a database (if it doesn't already exist)
  2. Creates - create the tables / schema in the database
  3. Populates - adds some data to the database
  4. Manipulates - does some SQL INSERT, UPDATE, DELETE, SELECT queries

I couldn't find a way to programmatically instantiate a database in MySQL - the database needs to exist for my script to use it. It's easy enough to do with some simple MySQL commands (with operations for a test example emphasized over secure best practices):

$ mysql -u root -p

mysql> create database PerlTest;
mysql> grant usage on PerlTest.* to perluser@localhost identified by 'password';
mysql> grant all privileges on PerlTest.* to perluser@localhost;

I did find a way to programmatically instantiate a Microsoft Access database in Perl. It relies on Win32::OLE, standard with Strawberry Perl - my Perl of choice for Windows.

use Cwd;
use Win32::OLE;
use Win32::OLE::Const;

my $dbname = getcwd . '/' . 'PerlTest.accdb';
my $props = Win32::OLE::Const->Load('Microsoft DAO')
my $dbLangGeneral = $props->{dbLangGeneral};

my $Access = Win32::OLE->new('Access.Application', 'Quit');
my $Workspace = $Access->DBEngine->CreateWorkspace('', 'Admin', '');
my $Database = $Workspace->CreateDatabase($dbname, $dbLangGeneral);

It's at this point I should mention I did this years ago on Windows XP (32-bit) with Strawberry Perl 5.10.1 (32-bit). I've since upgraded to Windows 7 (64-bit) and Strawberry Perl 5.18.1 (64-bit) and along the way, the script "broke".

I decided for no particular reason the other day to see what was wrong. I was sure it was a 32/64 bit issue with the instantiate code. On Windows 7 64-bit, I could instantiate the database with Strawberry 32-bit, but not connect to it for steps 2 through 4. With Strawberry 64-bit, I couldn't instantiate the database, but could do steps 2 through 4 on an existing database.

It turns out, there isn't a 64-bit version of "Microsoft DAO" and instead, you should rely on "Microsoft Office 14.0 Access Database Engine Object" for similar functionality. Changing the line to read:

my $props = Win32::OLE::Const->Load('Microsoft Office 14.0 Access Database Engine Object')

did the trick!

Next step - testing this all with SQLite.

 

Copyright © VinsWorld. All Rights Reserved.