This tool is not intended for amateur people. It is not a "next, next, next..." tool. You need a bit of know-how about QR encoding standard and some self learning attitude. Do not get nervous if you don't achieve "magical" results. It's just a Proof of Concept... To try the Full Version: Encoding -the easy part-: 1.- Have a smart phone ready to make a video record. 2.- Run the "runme.bat" and follow instructions. If you choose encryption, you will need to decrypt the information offline... use the "mysecret.exe" tool for that. The first time you will probably want to try with the "demo.pdf" file... 3.- Save the video you have just recorded on the PC where you will do the decoding job. *Notice: The "runme.bat" will create a "tmp" directory where it stores the QR codes and other stuff. Decoding -the hard part, until someone automates it-: 1.- Install "Apache Ant" ( http://ant.apache.org/ ) and "ZXing" ( http://code.google.com/p/zxing/ ). We suggest you learning the "getting started" of ZXing at ( http://code.google.com/p/zxing/wiki/GettingStarted ). 2.- Check that your ZXing works fine and you can decode QR codes!!! 3.- Install some software able to do convert video frames to pictures. We have tried "Video to JPG Converter" from ( http://www.dvdvideosoft.com ) with good results. 4.- Generate a picture from every frame -yes EVERY frame- of the video you recorded with your smart phone -and you saved in the decoding PC...- 5.- Run ZXing "CommandLineRunner". If you are in Windows, you should be careful with the syntax. Quoting "http://code.google.com/p/zxing/" : "Windows users take note; path syntax is different on Windows. Here and elsewhere you will need to use ';' rather than ':' to separate classpath elements, and likely need to use the '\' path separator." So, if you run the command like this: "java -cp javase\javase.jar;core\core.jar com.google.zxing.client.j2se.CommandLineRunner" You should see: ---------------------------------------------------------------------------------- Decode barcode images using the ZXing library usage: CommandLineRunner { file | dir | url } [ options ] --try_harder: Use the TRY_HARDER hint, default is normal (mobile) mode --pure_barcode: Input image is a pure monochrome barcode image, not a photo --products_only: Only decode the UPC and EAN families of barcodes --dump_results: Write the decoded contents to input.txt --dump_black_point: Compare black point algorithms as input.mono.png --crop=left,top,width,height: Only examine cropped region of input image(s) ----------------------------------------------------------------------------------- In your first test, and if the encoding/decoding PC are the same, maybe you want to try to decode the /tmp of the encoding phase, where you have the original QR codes... For this, in Windows, run like this: java -cp javase\javase.jar;core\core.jar com.google.zxing.client.j2se.CommandLineRunner --pure_barcode "\PATH_TO_YOUR_QRLEAKS_DIRECTORY\tmp" > output_test.txt As you can see, we use the "--pure-barcode" option. Yes, because those pictures (from the /tmp of the encoding phase) aren't photos, nor come from a video... They are the original QR codes. If everything is OK, you will see something like this: file:/D:/Users/hugo/Desktop/INFOLEAKS/qr_code/funcional/final/tmp/bintob64.vbs: Could not load image file:/D:/Users/hugo/Desktop/INFOLEAKS/qr_code/funcional/final/tmp/commands.bat: Could not load image file:/D:/Users/hugo/Desktop/INFOLEAKS/qr_code/funcional/final/tmp/demo.pdf: Could not load image file:/D:/Users/hugo/Desktop/INFOLEAKS/qr_code/funcional/final/tmp/end.vbs: Could not load image file:/D:/Users/hugo/Desktop/INFOLEAKS/qr_code/funcional/final/tmp/md5.exe: Could not load image file:/D:/Users/hugo/Desktop/INFOLEAKS/qr_code/funcional/final/tmp/mkqrimg.exe: Could not load image file:/D:/Users/hugo/Desktop/INFOLEAKS/qr_code/funcional/final/tmp/MySecret.exe: Could not load image file:/D:/Users/hugo/Desktop/INFOLEAKS/qr_code/funcional/final/tmp/slideshow.html: Could not load image file:/D:/Users/hugo/Desktop/INFOLEAKS/qr_code/funcional/final/tmp/split.vbs: Could not load image What is happening is that ZXING is trying to decode every file... no problem at all. Now if you open the "output_test.txt" with the Notepad, you will see all the decoded chunks. Something like this: ----------------------------- file:/D:/Users/hugo/Desktop/INFOLEAKS/qr_code/funcional/final/tmp/1-input.bmp (format: QR_CODE, type: TEXT): Raw result: #7055475/1/10 JVBERi0xLjUNJeLjz9MNCjEgMCBvYmo8PC9QYWdlcyAyIDAgUi9PdXRsaW5lcyA2 IDAgUi9UeXBlL0NhdGFsb2cvTmFtZXMgMTYgMCBSL1N0cnVjdFRyZWVSb290IDI4 IDAgUi9NZXRhZGF0YSA3OSAwIFIvU3BpZGVySW5mbyA2NSAwIFI+Pg1lbmRvYmoN MiAwIG9iajw8L0NvdW50IDYvS2lkc1szMiAwIFIgMzcgMCBSIDM5IDAgUiA0MSAw IFIgNDMgMCBSIDQ1IDAgUl0vVHlwZS9QYWdlcz4+DWVuZG9iag0zIDAgb2JqPDwv TW9kRGF0ZShEOjIwMDMxMjI0MTMwMjU0LTA2JzAwJykvQ3JlYXRpb25EYXRlKEQ6 MjAwMzEyMjQxMzAyNDJaKS9UaXRsZShVbml2ZXJzYWwgRGVjbGFyYXRpb24gb2Yg SHVtYW4gUmlnaHRzKS9Qcm9kdWNlcihBY3JvYmF0IFdlYiBDYXB0dXJlIDYuMCk+ Pg1lbmRvYmoNNSAwIG9iaiBudWxsDWVuZG9iag02IDAgb2JqPDwvQ291bnQgMi9U eXBlL091dGxpbmVzL0ZpcnN0IDc3IDAgUi9MYXN0IDc3IDAgUj4+DWVuZG9iag03 8f42f33232dd6cd1d40277f21d513f91 Parsed result: #7055475/1/10 JVBERi0xLjUNJeLjz9MNCjEgMCBvYmo8PC9QYWdlcyAyIDAgUi9PdXRsaW5lcyA2 IDAgUi9UeXBlL0NhdGFsb2cvTmFtZXMgMTYgMCBSL1N0cnVjdFRyZWVSb290IDI4 IDAgUi9NZXRhZGF0YSA3OSAwIFIvU3BpZGVySW5mbyA2NSAwIFI+Pg1lbmRvYmoN MiAwIG9iajw8L0NvdW50IDYvS2lkc1szMiAwIFIgMzcgMCBSIDM5IDAgUiA0MSAw IFIgNDMgMCBSIDQ1IDAgUl0vVHlwZS9QYWdlcz4+DWVuZG9iag0zIDAgb2JqPDwv TW9kRGF0ZShEOjIwMDMxMjI0MTMwMjU0LTA2JzAwJykvQ3JlYXRpb25EYXRlKEQ6 MjAwMzEyMjQxMzAyNDJaKS9UaXRsZShVbml2ZXJzYWwgRGVjbGFyYXRpb24gb2Yg SHVtYW4gUmlnaHRzKS9Qcm9kdWNlcihBY3JvYmF0IFdlYiBDYXB0dXJlIDYuMCk+ Pg1lbmRvYmoNNSAwIG9iaiBudWxsDWVuZG9iag02IDAgb2JqPDwvQ291bnQgMi9U eXBlL091dGxpbmVzL0ZpcnN0IDc3IDAgUi9MYXN0IDc3IDAgUj4+DWVuZG9iag03 8f42f33232dd6cd1d40277f21d513f91 (...) (...) (...) file:/D:/Users/hugo/Desktop/INFOLEAKS/qr_code/funcional/final/tmp/info-input.bmp (format: QR_CODE, type: TEXT): Raw result: #INFO NumberofChunks=80 HeaderText=#7055475 MaxDataLinesxChunk=10 Encrypted=no milliseconds=200 E42F8586756962759AEE50E72AFB2E9D input.txt 9406092319fccfca561b49e6976d59c4 Parsed result: #INFO NumberofChunks=80 HeaderText=#7055475 MaxDataLinesxChunk=10 Encrypted=no milliseconds=200 E42F8586756962759AEE50E72AFB2E9D input.txt 9406092319fccfca561b49e6976d59c4 Also, there were 0 result points. Decoded 81 files out of 90 successfully (90%) -------------------------------------------------- As you can see all the chunks are duplicated, that's OK. The last chunk is a data control/information chunk where you have something like this: NumberofChunks=80 HeaderText=#7055475 MaxDataLinesxChunk=10 Encrypted=no milliseconds=200 E42F8586756962759AEE50E72AFB2E9D input.txt 9406092319fccfca561b49e6976d59c4 Where: "NumberofChunks" is the total amount (n) of data chunks. It doesn't include the "INFO" chunk. So really, total chunks are (n + 1). "HeaderText" is the identifier of the file transfer. It has two purposes: first it helps identifying what file it belongs to, in the case of multiple file transfers -future development?-, second, a bit paranoid approach, it prevents "interferences" of "HeaderText" strings in the base64 encoded input file, as it has a "#" character that can't be present in base64 stream... "MaxDataLinesxChunk" just to know maximum lines encoded in every chunk "Encrypted" is to know if we need to decrypt with Blowfish "milliseconds" time between every transmission frame -which has nothing to do with the frames/second of the recording device...- "E42F8586756962759AEE50E72AFB2E9D input.txt" is the MD5 of the original base64 "input.txt" file -before splitting and QR encoding- "9406092319fccfca561b49e6976d59c4" MD5 of current chunk All the other chunks will have a header like this: "#7055475/1/10" where the first field "#7055475" is the identifier, the second "1" the number of chunk and the last "10" is the "MaxDataLinesxChunk". And after the "MaxDataLinesxChunk" lines of base64 encoded data, you should always have a MD5 hash of the full chunk. TO REBUILD ALL THE DATA, YOU NEED TO PROCESS ALL THE OUTPUT in that way: 1.- Find the "INFO" chunk. Just look for "#INFO" 2.- Read all the info you need. Check if you have all the chunks (If you are decoding the original QR codes, you should have all of them...) 3.- Rebuild the original base64 encoded file. 4a.- Base64 decode the file. If you did the transfer in clear text, you are done. 4b.- If you encrypted the file, decrypt with "mysecret.exe" using the same password as for encryption... Congratulations! You did it! Some more things: *Notice that the message "Decoded 81 files out of 90 successfully (90%)" in the last line of the output usually will be a wrong reference, as it includes the attempts of decoding non QR files... REAL SCENARIO: When you try QRLEAKS with the real captured video frames, consider this: a) As we are decoding offline, we are interested in the "--try_harder" option, which probably exploits better the PC power. b) WARNING: Do not use the "--pure-barcode" option !!! c) Be careful with the "Decoded NN files out of XX successfully (YY%)" last line message. Think that you are converting every frame of the video to a picture, so you will have lots of duplicated chunks and errors. Rely ONLY on the INFO chunk and the header of any chunk to calculate how many chunks do you have. d) Decoding ALL the QR codes with ZXing is not a fast process. Think that if you have converted any video frame to an image, you will end up with thousands of pictures being decoded by a Java application... So remember: you can't make a silk purse out of a sow's ear! Take it easy... e) Right now this tool is only a Proof of Concept that allows working with small files (less than 1 MB). For bigger files it's mandatory to build a control channel to feed back the lost chunks, to allow the tool to "re-send" them. It is important to make quality tests to know if you can execute a reliable transfer!!! Play with the advanced configuration of the "runme.bat" and increase the time -milliseconds- between pictures. Play with environment options -it's better in darkness than daylight-, play with distance from the video recording to the screen, play with resolution of the video, etc. Maybe, in the future we will release some script to extract the data chunks and rebuild the original file. We have some thing to do that, but we still need to test it a bit more. Maybe you want to build your own tool! Good Luck, and have a nice data extraction.