We basically use two tools: cdparanoia and lame.
cdparanoia: Compact Disc Digital Audio extraction tool https://www.archlinux.org/packages/extra/x86_64/cdparanoia/
lame: A high quality MPEG Audio Layer III (MP3) encoder https://www.archlinux.org/packages/extra/x86_64/lame/
# grab CD information
$ cdparanoia -vsQ
cdparanoia III release 10.2 (September 11, 2008)
Using cdda library version: 10.2
Using paranoia library version: 10.2
Checking /dev/cdrom for cdrom...
Testing /dev/cdrom for SCSI/MMC interface
SG_IO device: /dev/sr0
CDROM model sensed sensed: ASUS DRW-24D1ST 1.00
Checking for SCSI emulation...
Drive is ATAPI (using SG_IO host adaptor emulation)
Checking for MMC style command set...
Drive is MMC style
DMA scatter/gather table entries: 1
table entry size: 131072 bytes
maximum theoretical transfer: 55 sectors
Setting default read size to 27 sectors (63504 bytes).
Verifying CDDA command set...
Expected command set reads OK.
Attempting to set cdrom to full speed...
drive returned OK.
Table of contents (audio tracks only):
track length begin copy pre ch
===========================================================
1. 11033 [02:27.08] 0 [00:00.00] no no 2
2. 18007 [04:00.07] 11033 [02:27.08] no no 2
3. 10100 [02:14.50] 29040 [06:27.15] no no 2
4. 13237 [02:56.37] 39140 [08:41.65] no no 2
5. 9050 [02:00.50] 52377 [11:38.27] no no 2
6. 11076 [02:27.51] 61427 [13:39.02] no no 2
7. 23342 [05:11.17] 72503 [16:06.53] no no 2
8. 13141 [02:55.16] 95845 [21:17.70] no no 2
9. 16703 [03:42.53] 108986 [24:13.11] no no 2
10. 12635 [02:48.35] 125689 [27:55.64] no no 2
TOTAL 138324 [30:44.24] (audio only)
# rip stuffs
$ cdparanoia -B
cdparanoia III release 10.2 (September 11, 2008)
Ripping from sector 0 (track 1 [0:00.00])
to sector 138323 (track 10 [2:48.34])
outputting to track01.cdda.wav
(== PROGRESS == [ | 011032 00 ] == :^D * ==)
outputting to track02.cdda.wav
(== PROGRESS == [ | 029039 00 ] == :^D * ==)
outputting to track03.cdda.wav
(== PROGRESS == [ | 039139 00 ] == :^D * ==)
outputting to track04.cdda.wav
(== PROGRESS == [ | 052376 00 ] == :^D * ==)
outputting to track05.cdda.wav
(== PROGRESS == [ | 061426 00 ] == :^D * ==)
...
outputting to track10.cdda.wav
(== PROGRESS == [ | 138323 00 ] == :^D * ==)
Done.
# convert to mp3 format
$ for i in `ls`; do lame $i; done
LAME 3.99.5 64bits (http://lame.sf.net)
Using polyphase lowpass filter, transition band: 16538 Hz - 17071 Hz
Encoding track01.cdda.wav to track01.cdda.mp3
Encoding as 44.1 kHz j-stereo MPEG-1 Layer III (11x) 128 kbps qval=3
Frame | CPU time/estim | REAL time/estim | play/CPU | ETA
5633/5633 (100%)| 0:04/ 0:04| 0:04/ 0:04| 35.102x| 0:00
-------------------------------------------------------------------------------------
kbps LR MS % long switch short %
128.0 1.8 98.2 99.9 0.0 0.0
Writing LAME Tag...done
ReplayGain: -0.3dB
LAME 3.99.5 64bits (http://lame.sf.net)
Using polyphase lowpass filter, transition band: 16538 Hz - 17071 Hz
Encoding track02.cdda.wav to track02.cdda.mp3
Encoding as 44.1 kHz j-stereo MPEG-1 Layer III (11x) 128 kbps qval=3
Frame | CPU time/estim | REAL time/estim | play/CPU | ETA
9193/9193 (100%)| 0:07/ 0:07| 0:07/ 0:07| 34.246x| 0:00
-------------------------------------------------------------------------------------
kbps LR MS % long switch short %
128.0 0.3 99.7 100.0 0.0 0.0
Writing LAME Tag...done
ReplayGain: +0.1dB
...
done!
Reference: http://www.cyberciti.biz/faq/linux-ripping-and-encoding-audio-files/
Sunday, May 31, 2015
Thursday, May 14, 2015
skicka: Google drive command line tool
Install go and skicka
$ sudo pacman -S go
$ mkdir ~/go
$ export GOPATH=~/go
$ export PATH=$PATH:~/go/bin
$ go get github.com/google/skicka
Initialize the configuration and client id/secret key pairs from https://console.developers.google.com/project
Read: https://github.com/google/skicka/blob/master/README.md
$ skicka init
2015/05/14 21:44:37 created configuration file /home/xatier/.skicka.config.
$ vim ~/.skicka.config
Oauth authentication for the first time
Generate ~/.skicka.metadata.cache and ~/.skicka.tokencache.json
$ skicka ls -l /
Go to the following link in your browser:
https://accounts.google.com/o/oauth2/auth?***********************************
Enter verification code: ******************************************
Updating metadata cache:
[========================================================================================] 99.99 % 37s
Support commands:
$ skicka
usage: skicka [skicka options] [command options]
Supported commands are:
cat Print the contents of the given file
download Download a file or folder hierarchy from Drive to the local disk
df Display free space on Drive
du Report disk usage for a folder hierarchy on Drive
fsck Check consistency of files in Drive and local metadata cache
genkey Generate a new encryption key
init Create an initial skicka configuration file
ls List the contents of a folder on Google Drive
mkdir Create a new folder or folder hierarchy on Drive
rm Remove a file or folder on Google Drive
upload Upload a local file or directory hierarchy to Drive
Testing with my hinet 100/40 home use plan (roughly around 1.5MB/s):
$ skicka upload GG.mp4 /
Files: 23.83 MB / 23.83 MB
[========================================================================================] 100.00 % 15s
2015/05/14 22:13:11 Preparation time 1s, sync time 15s
2015/05/14 22:13:11 Updated 1 Drive files, 0 local files
2015/05/14 22:13:11 23.83 MiB read from disk, 0 B written to disk
2015/05/14 22:13:11 23.83 MiB uploaded (1.58 MiB/s), 0 B downloaded (0 B/s)
2015/05/14 22:13:11 4.72 MiB peak memory used
$ skicka upload GG.mp4 /
Files: 23.83 MB / 23.83 MB
[========================================================================================] 100.00 % 13s
2015/05/14 22:14:19 Preparation time 1s, sync time 13s
2015/05/14 22:14:19 Updated 1 Drive files, 0 local files
2015/05/14 22:14:19 23.83 MiB read from disk, 0 B written to disk
2015/05/14 22:14:19 23.83 MiB uploaded (1.72 MiB/s), 0 B downloaded (0 B/s)
2015/05/14 22:14:19 5.49 MiB peak memory used
$ skicka upload GG.mp4 /
Files: 23.83 MB / 23.83 MB
[========================================================================================] 100.00 % 13s
2015/05/14 22:14:41 Preparation time 1s, sync time 13s
2015/05/14 22:14:41 Updated 1 Drive files, 0 local files
2015/05/14 22:14:41 23.83 MiB read from disk, 0 B written to disk
2015/05/14 22:14:41 23.83 MiB uploaded (1.71 MiB/s), 0 B downloaded (0 B/s)
2015/05/14 22:14:41 5.49 MiB peak memory used
$ skicka upload GG.mp4 /
Files: 23.83 MB / 23.83 MB
[========================================================================================] 100.00 % 15s
2015/05/14 22:15:01 Preparation time 1s, sync time 15s
2015/05/14 22:15:01 Updated 1 Drive files, 0 local files
2015/05/14 22:15:01 23.83 MiB read from disk, 0 B written to disk
2015/05/14 22:15:01 23.83 MiB uploaded (1.51 MiB/s), 0 B downloaded (0 B/s)
2015/05/14 22:15:01 5.49 MiB peak memory used
Large file test:
$ skicka upload movie.mkv
Files: 8.39 GB / 8.39 GB
[========================================================================================] 100.00 % 2h43m59s
2015/05/15 01:18:24 Preparation time 1s, sync time 2h 43m 59s
2015/05/15 01:18:24 Updated 1 Drive files, 0 local files
2015/05/15 01:18:24 8.39 GiB read from disk, 0 B written to disk
2015/05/15 01:18:24 8.39 GiB uploaded (893.93 kiB/s), 0 B downloaded (0 B/s)
2015/05/15 01:18:24 16.07 MiB peak memory used
Encryption
$ SKICKA_PASSPHRASE=gg skicka genkey
; Add the following lines to the [encryption] section
; of your ~/.skicka.config file.
salt=************************************
passphrase-hash=************************************
encrypted-key=************************************
encrypted-key-iv=************************************
$ SKICKA_PASSPHRASE=gg skicka upload -encrypt GG2.mp4 /
Files: 23.83 MB / 23.83 MB
[========================================================================================] 100.00 % 25s
2015/05/14 21:59:16 Preparation time 1s, sync time 26s
2015/05/14 21:59:16 Updated 1 Drive files, 0 local files
2015/05/14 21:59:16 23.83 MiB read from disk, 0 B written to disk
2015/05/14 21:59:16 23.83 MiB uploaded (928.17 kiB/s), 0 B downloaded (0 B/s)
2015/05/14 21:59:16 4.24 MiB peak memory used
$ sudo pacman -S go
$ mkdir ~/go
$ export GOPATH=~/go
$ export PATH=$PATH:~/go/bin
$ go get github.com/google/skicka
Initialize the configuration and client id/secret key pairs from https://console.developers.google.com/project
Read: https://github.com/google/skicka/blob/master/README.md
$ skicka init
2015/05/14 21:44:37 created configuration file /home/xatier/.skicka.config.
$ vim ~/.skicka.config
Oauth authentication for the first time
Generate ~/.skicka.metadata.cache and ~/.skicka.tokencache.json
$ skicka ls -l /
Go to the following link in your browser:
https://accounts.google.com/o/oauth2/auth?***********************************
Enter verification code: ******************************************
Updating metadata cache:
[========================================================================================] 99.99 % 37s
Support commands:
$ skicka
usage: skicka [skicka options]
Supported commands are:
cat Print the contents of the given file
download Download a file or folder hierarchy from Drive to the local disk
df Display free space on Drive
du Report disk usage for a folder hierarchy on Drive
fsck Check consistency of files in Drive and local metadata cache
genkey Generate a new encryption key
init Create an initial skicka configuration file
ls List the contents of a folder on Google Drive
mkdir Create a new folder or folder hierarchy on Drive
rm Remove a file or folder on Google Drive
upload Upload a local file or directory hierarchy to Drive
Testing with my hinet 100/40 home use plan (roughly around 1.5MB/s):
$ skicka upload GG.mp4 /
Files: 23.83 MB / 23.83 MB
[========================================================================================] 100.00 % 15s
2015/05/14 22:13:11 Preparation time 1s, sync time 15s
2015/05/14 22:13:11 Updated 1 Drive files, 0 local files
2015/05/14 22:13:11 23.83 MiB read from disk, 0 B written to disk
2015/05/14 22:13:11 23.83 MiB uploaded (1.58 MiB/s), 0 B downloaded (0 B/s)
2015/05/14 22:13:11 4.72 MiB peak memory used
$ skicka upload GG.mp4 /
Files: 23.83 MB / 23.83 MB
[========================================================================================] 100.00 % 13s
2015/05/14 22:14:19 Preparation time 1s, sync time 13s
2015/05/14 22:14:19 Updated 1 Drive files, 0 local files
2015/05/14 22:14:19 23.83 MiB read from disk, 0 B written to disk
2015/05/14 22:14:19 23.83 MiB uploaded (1.72 MiB/s), 0 B downloaded (0 B/s)
2015/05/14 22:14:19 5.49 MiB peak memory used
$ skicka upload GG.mp4 /
Files: 23.83 MB / 23.83 MB
[========================================================================================] 100.00 % 13s
2015/05/14 22:14:41 Preparation time 1s, sync time 13s
2015/05/14 22:14:41 Updated 1 Drive files, 0 local files
2015/05/14 22:14:41 23.83 MiB read from disk, 0 B written to disk
2015/05/14 22:14:41 23.83 MiB uploaded (1.71 MiB/s), 0 B downloaded (0 B/s)
2015/05/14 22:14:41 5.49 MiB peak memory used
$ skicka upload GG.mp4 /
Files: 23.83 MB / 23.83 MB
[========================================================================================] 100.00 % 15s
2015/05/14 22:15:01 Preparation time 1s, sync time 15s
2015/05/14 22:15:01 Updated 1 Drive files, 0 local files
2015/05/14 22:15:01 23.83 MiB read from disk, 0 B written to disk
2015/05/14 22:15:01 23.83 MiB uploaded (1.51 MiB/s), 0 B downloaded (0 B/s)
2015/05/14 22:15:01 5.49 MiB peak memory used
Large file test:
$ skicka upload movie.mkv
Files: 8.39 GB / 8.39 GB
[========================================================================================] 100.00 % 2h43m59s
2015/05/15 01:18:24 Preparation time 1s, sync time 2h 43m 59s
2015/05/15 01:18:24 Updated 1 Drive files, 0 local files
2015/05/15 01:18:24 8.39 GiB read from disk, 0 B written to disk
2015/05/15 01:18:24 8.39 GiB uploaded (893.93 kiB/s), 0 B downloaded (0 B/s)
2015/05/15 01:18:24 16.07 MiB peak memory used
Encryption
$ SKICKA_PASSPHRASE=gg skicka genkey
; Add the following lines to the [encryption] section
; of your ~/.skicka.config file.
salt=************************************
passphrase-hash=************************************
encrypted-key=************************************
encrypted-key-iv=************************************
$ SKICKA_PASSPHRASE=gg skicka upload -encrypt GG2.mp4 /
Files: 23.83 MB / 23.83 MB
[========================================================================================] 100.00 % 25s
2015/05/14 21:59:16 Preparation time 1s, sync time 26s
2015/05/14 21:59:16 Updated 1 Drive files, 0 local files
2015/05/14 21:59:16 23.83 MiB read from disk, 0 B written to disk
2015/05/14 21:59:16 23.83 MiB uploaded (928.17 kiB/s), 0 B downloaded (0 B/s)
2015/05/14 21:59:16 4.24 MiB peak memory used
Tuesday, May 12, 2015
Make QT projects without QtCreator
Just a note for comping Qt stuffs without the shitty IDE.
$ ls
foo.cc
$ qmake -project
$ ls
foo.cc foo.pro
# maybe add some shit here, for example QT += concurrent
$ vim foo.pro
$ qmake foo.pro
$ make
g++ -c -pipe -O2 -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4 -Wall -W -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CONCURRENT_LIB -DQT_CORE_LIB -I. -I. -isystem /usr/include/qt -isystem /usr/include/qt/QtGui -isystem /usr/include/qt/QtConcurrent -isystem /usr/include/qt/QtCore -I. -I/usr/lib/qt/mkspecs/linux-g++ -o foo.o foo.cc
g++ -Wl,-O1 -Wl,-O1,--sort-common,--as-needed,-z,relro -o foo foo.o -lQt5Gui -lQt5Concurrent -lQt5Core -lGL -lpthread
$ ./foo
$ ls
foo.cc
$ qmake -project
$ ls
foo.cc foo.pro
# maybe add some shit here, for example QT += concurrent
$ vim foo.pro
$ qmake foo.pro
$ make
g++ -c -pipe -O2 -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4 -Wall -W -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CONCURRENT_LIB -DQT_CORE_LIB -I. -I. -isystem /usr/include/qt -isystem /usr/include/qt/QtGui -isystem /usr/include/qt/QtConcurrent -isystem /usr/include/qt/QtCore -I. -I/usr/lib/qt/mkspecs/linux-g++ -o foo.o foo.cc
g++ -Wl,-O1 -Wl,-O1,--sort-common,--as-needed,-z,relro -o foo foo.o -lQt5Gui -lQt5Concurrent -lQt5Core -lGL -lpthread
$ ./foo
Monday, May 11, 2015
Adjust swappiness to improve responsiveness
I bought 16GB RAM recently for my desktop ( http://xatierlike.blogspot.tw/2015/04/ramdisk-for-chromium.html ). But sometimes the system is still a bit slow for me.
The reason is the high usage of the swap filesystem. The size of swap will go to over 1GB sometimes.
(for example)
$ free -h
total used free shared buff/cache available
Mem: 15G 5.0G 158M 1.0G 10G 9.1G
Swap: 1.9G 1.2G 612M
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 931.5G 0 disk
├─sda1 8:1 0 28G 0 part /
├─sda2 8:2 0 1.9G 0 part [SWAP]
└─sda3 8:3 0 901.7G 0 part /home
According to Arch wiki: https://wiki.archlinux.org/index.php/Swap
Sample usage:
# current swappiness
$ cat /proc/sys/vm/swappiness
60
# same as above
$ sysctl vm.swappiness
vm.swappiness = 60
# set it to 10
$ sudo sysctl vm.swappiness=10
vm.swappiness = 10
# unload old swap
$ sudo swapoff -a && sudo swapon /dev/sda2
# set the swappiness value permanently,
/etc/sysctl.d/99-sysctl.conf
----------------
vm.swappiness=10
Okay, now my system is back to flying.
The reason is the high usage of the swap filesystem. The size of swap will go to over 1GB sometimes.
(for example)
$ free -h
total used free shared buff/cache available
Mem: 15G 5.0G 158M 1.0G 10G 9.1G
Swap: 1.9G 1.2G 612M
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 931.5G 0 disk
├─sda1 8:1 0 28G 0 part /
├─sda2 8:2 0 1.9G 0 part [SWAP]
└─sda3 8:3 0 901.7G 0 part /home
According to Arch wiki: https://wiki.archlinux.org/index.php/Swap
Swappiness
The swappiness sysctl parameter represents the kernel's preference (or avoidance) of swap space. Swappiness can have a value between 0 and 100, the default value is 60. Setting this parameter to a low value will reduce swapping from RAM, and is known to improve responsiveness on many systems.
Sample usage:
# current swappiness
$ cat /proc/sys/vm/swappiness
60
# same as above
$ sysctl vm.swappiness
vm.swappiness = 60
# set it to 10
$ sudo sysctl vm.swappiness=10
vm.swappiness = 10
# unload old swap
$ sudo swapoff -a && sudo swapon /dev/sda2
# set the swappiness value permanently,
/etc/sysctl.d/99-sysctl.conf
----------------
vm.swappiness=10
Okay, now my system is back to flying.
Tuesday, May 5, 2015
STL pretty print support in gdb
I program in C/C++ for a long time, it's really hateful to debug C++ programs with STL containers in gdb, but yeah, who doesn't use STL?
gdb always prints lots of useless stuffs from a container.
And we're able to use a very tricky way to print that out.
(^q^) p *(v._M_impl._M_start)@(v._M_impl._M_finish - v._M_impl._M_start)
According to the gdb wiki, the gdb python pretty printer is supported since 7.0. https://sourceware.org/gdb/wiki/STLSupport
Download the latest python script from gcc.gnu.org
---
mkdir ~/.gdb
cd ~/.gdb
svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
---
put the following stuffs appended to your ~/.gdbinit
---
python
import sys
sys.path.insert(0, '/home/xatier/.gdb/python')
import libstdcxx.v6
end
---
Note, we only need to import the lib, let __init__.py do the magic ;-)
Done!
If you really want to dig up the implementation details, use " p /r "
(^q^) p /r v
$1 = {
<std::_Vector_base<int, std::allocator<int> >> = {
_M_impl = {
<std::allocator<int>> = {
<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>},
members of std::_Vector_base<int, std::allocator<int> >::_Vector_impl:
_M_start = 0x602010,
_M_finish = 0x602024,
_M_end_of_storage = 0x602024
}
}, <No data fields>}
(^q^)
Actually this python script will be installed and automatically loaded in Archlinux once you install gcc/gcc-multilib.
$ pacman -Ql gcc-multilib | grep libstd
gcc-multilib /usr/lib/libstdc++.a
gcc-multilib /usr/lib32/libstdc++.a
gcc-multilib /usr/share/gcc-4.9.2/python/libstdcxx/
gcc-multilib /usr/share/gcc-4.9.2/python/libstdcxx/__init__.py
gcc-multilib /usr/share/gcc-4.9.2/python/libstdcxx/v6/
gcc-multilib /usr/share/gcc-4.9.2/python/libstdcxx/v6/__init__.py
gcc-multilib /usr/share/gcc-4.9.2/python/libstdcxx/v6/printers.py
gcc-multilib /usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.20-gdb.py
If you're using other distros like Debian, that should be here, but not auto-loaded by default :(
$ apt-file list gcc | grep libstd
gcc-snapshot: /usr/lib/gcc-snapshot/share/gcc-4.9.0/python/libstdcxx/__init__.py
gcc-snapshot: /usr/lib/gcc-snapshot/share/gcc-4.9.0/python/libstdcxx/v6/__init__.py
gcc-snapshot: /usr/lib/gcc-snapshot/share/gcc-4.9.0/python/libstdcxx/v6/printers.py
Happy debugging C++! (^q^)
gdb always prints lots of useless stuffs from a container.
$ g++ -std=c++11 foo.cc -g
$ gdb -q ./a.out
Reading symbols from ./a.out...done.
(^q^) l
1 #include <vector>
2
3 int main (void) {
4 std::vector<int> v = {1, 2, 3, 4, 5};
5 return 0;
6 }
(^q^) b 5
Breakpoint 1 at 0x40082c: file foo.cc, line 5.
(^q^) r
Starting program: /tmp/a.out
Breakpoint 1, main () at foo.cc:5
5 return 0;
(^q^) p
$2 = {
<std::_Vector_base<int, std::allocator<int> >> = {
_M_impl = {
<std::allocator<int>> = {
<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>},
members of std::_Vector_base<int, std::allocator<int> >::_Vector_impl:
_M_start = 0x602010,
_M_finish = 0x602024,
_M_end_of_storage = 0x602024
}
}, <No data fields>}
(^q^)
And we're able to use a very tricky way to print that out.
(^q^) p *(v._M_impl._M_start)@(v._M_impl._M_finish - v._M_impl._M_start)
$22 = {[0] = 1,
[1] = 2,
[2] = 3,
[3] = 4,
[4] = 5}
(^q^)
A container is a "container", we don't care the implementation details, what we care about is the data.
With the pretty printer, we're able to print a container out like this:
(^q^) p v
$1 = std::vector of length 5, capacity 5 = {
[0] = 1,
[1] = 2,
[2] = 3,
[3] = 4,
[4] = 5
}
Download the latest python script from gcc.gnu.org
---
mkdir ~/.gdb
cd ~/.gdb
svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
---
put the following stuffs appended to your ~/.gdbinit
---
python
import sys
sys.path.insert(0, '/home/xatier/.gdb/python')
import libstdcxx.v6
end
---
Note, we only need to import the lib, let __init__.py do the magic ;-)
Done!
If you really want to dig up the implementation details, use " p /r "
(^q^) p /r v
$1 = {
<std::_Vector_base<int, std::allocator<int> >> = {
_M_impl = {
<std::allocator<int>> = {
<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>},
members of std::_Vector_base<int, std::allocator<int> >::_Vector_impl:
_M_start = 0x602010,
_M_finish = 0x602024,
_M_end_of_storage = 0x602024
}
}, <No data fields>}
(^q^)
Actually this python script will be installed and automatically loaded in Archlinux once you install gcc/gcc-multilib.
$ pacman -Ql gcc-multilib | grep libstd
gcc-multilib /usr/lib/libstdc++.a
gcc-multilib /usr/lib32/libstdc++.a
gcc-multilib /usr/share/gcc-4.9.2/python/libstdcxx/
gcc-multilib /usr/share/gcc-4.9.2/python/libstdcxx/__init__.py
gcc-multilib /usr/share/gcc-4.9.2/python/libstdcxx/v6/
gcc-multilib /usr/share/gcc-4.9.2/python/libstdcxx/v6/__init__.py
gcc-multilib /usr/share/gcc-4.9.2/python/libstdcxx/v6/printers.py
gcc-multilib /usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.20-gdb.py
If you're using other distros like Debian, that should be here, but not auto-loaded by default :(
$ apt-file list gcc | grep libstd
gcc-snapshot: /usr/lib/gcc-snapshot/share/gcc-4.9.0/python/libstdcxx/__init__.py
gcc-snapshot: /usr/lib/gcc-snapshot/share/gcc-4.9.0/python/libstdcxx/v6/__init__.py
gcc-snapshot: /usr/lib/gcc-snapshot/share/gcc-4.9.0/python/libstdcxx/v6/printers.py
Happy debugging C++! (^q^)
Monday, May 4, 2015
Reverseing reverse engineered tools: reverse on the pyc of Easy-Card tool
A hacker called Zhi-Wei Cai did some reverse engineering on Taipei city passport Easy Card credit querying system.
https://github.com/x43x61x69/Easy-Card
But he only released the .pyc file.
I tool a glance on the binary file and smiled, he didn't apply any code obfuscation on that, that is, it would be pretty easy for those who want to read the source code.
With the help of this tool: https://github.com/wibiti/uncompyle2
uncompyle2 easycard.pyc > easycard.py
You can decompile that yourself.
Basically the API takes 4 parameters: verify, cardID, begin, end.
verify = md5((seed * const) + salt)
where
seed = date.month + date.day + date.hour
salt = 'L0CalKing'
const = 8544
cardID = base64( des3( data, key, iv, mode=DEC3.MODE_CBC) )
where
data = 'your card ID', like '1234567889'
key = 'EasyCardToKingay23456789
iv = '01234567'
begin / end = time period
I'm really curious about how did he get these constants , but I don't want to dig up the original app. :)
Lesson: don't release .pyc file without code obfuscation if you really don't want any people try to dig up your code.
Code listing (partially omitted):
https://github.com/x43x61x69/Easy-Card
But he only released the .pyc file.
I tool a glance on the binary file and smiled, he didn't apply any code obfuscation on that, that is, it would be pretty easy for those who want to read the source code.
With the help of this tool: https://github.com/wibiti/uncompyle2
uncompyle2 easycard.pyc > easycard.py
You can decompile that yourself.
Basically the API takes 4 parameters: verify, cardID, begin, end.
verify = md5((seed * const) + salt)
where
seed = date.month + date.day + date.hour
salt = 'L0CalKing'
const = 8544
cardID = base64( des3( data, key, iv, mode=DEC3.MODE_CBC) )
where
data = 'your card ID', like '1234567889'
key = 'EasyCardToKingay23456789
iv = '01234567'
begin / end = time period
I'm really curious about how did he get these constants , but I don't want to dig up the original app. :)
Lesson: don't release .pyc file without code obfuscation if you really don't want any people try to dig up your code.
Code listing (partially omitted):
#!/usr/bin/env python2 # -*- encoding: utf8 -*- # 2015.05.04 17:41:47 CST import sys import datetime import hashlib import urllib import urllib2 import json from Crypto.Cipher import DES3 import pytz version = '0.3' copyright = 'Copyright (C) 2015 Zhi-Wei Cai.' key = 'EasyCardToKingay23456789' iv = '01234567' salt = 'L0CalKing' const = 8544 def getID(data, isEncrypt, key, iv, encode): size = len(data) # '\x06' is the padding of DES3 if size % 16 != 0: data += '\x06' * (16 - size % 16) des3 = DES3.new(key, DES3.MODE_CBC, iv) if isEncrypt: result = des3.encrypt(data).encode(encode).rstrip() else: result = des3.decrypt(data.decode(encode)) return result def getVerify(const, seed, salt): hash = hashlib.md5() hash.update(str(seed * const) + salt) return hash.hexdigest().upper() def proc(data): e = getID(data, 1, key, iv, 'base64') cardID = urllib.quote_plus(e) date = datetime.datetime.now(pytz.timezone('Asia/Taipei')) seed = date.month + date.day + date.hour begin = '{:%Y-%m-%d}'.format(date - datetime.timedelta(days=30)) end = '{:%Y-%m-%d}'.format(date) verify = getVerify(const, seed, salt) url = '<Easy Card API URL>'.format(verify, cardID, begin, end) req = urllib2.Request(url) response = urllib2.urlopen(req) content = response.read() dict = json.loads(content) # the rest part of the code is omitted if __name__ == '__main__': print '\n悠遊卡餘額明細查詢 v{}'.format(version) print '{}\n'.format(copyright) if len(sys.argv) > 1: try: print '\n{:=^90}\n'.format('[ 查詢開始 ]') proc(str(sys.argv[1])) except ValueError as err: pass else: while 1: try: data = raw_input('請輸入卡片號碼:').replace(' ', '') if len(data): print '\n{:=^90}\n'.format('[ 查詢開始 ]') proc(data) else: break except ValueError as err: pass #+++ okay decompyling easycard.pyc # decompiled 1 files: 1 okay, 0 failed, 0 verify failed # 2015.05.04 17:41:47 CST
Subscribe to:
Posts (Atom)