自己在淘宝上买了PN532模块和USB-TTL,用我祖传的手工技术粘了一个,结果粘歪了

工具准备

将 TDM-GCC 安装到 C:\TDM-GCC、pcre、libnfc、libusb 等放到 D:\Tools 目录下、CMake 和 Doxygen 直接安装即可,自己编译的时候指定目录即可。

编译时的目录结构如下:

注:libnfcbuild目录为输出的二进制文件目录

为了能顺利编译,我们需要修改一下代码:
打开 libnfc-1.7.1 目录下面的 CMakeLists.txt,然后找到:

MACRO (GET_CURRENT_YEAR RESULT)
   EXECUTE_PROCESS(COMMAND "cmd" " /C date /T" OUTPUT_VARIABLE ${RESULT})
   STRING(REGEX REPLACE ".*(..)/(..)/(....).*" "\\3" ${RESULT} ${${RESULT}})
ENDMACRO (GET_CURRENT_YEAR)

改为:

MACRO (GET_CURRENT_YEAR RESULT)
   EXECUTE_PROCESS(COMMAND "cmd" " /C date /T" OUTPUT_VARIABLE ${RESULT})
   STRING(REGEX REPLACE "\n" "" ${RESULT} ${${RESULT}})
   STRING(REGEX REPLACE ".*(..)/(..)/(....).*" "\\3" ${RESULT} ${${RESULT}})
ENDMACRO (GET_CURRENT_YEAR)

接下来打开 libnfc-1.7.1\libnfc 下面的 nfc-internal.c 文件,找到:res->allow_intrusive_scan = false;

改成true后保存

配置参数

启动 CMake,上面的第一行选择为刚刚的 libnfc-1.7.1 目录,binaries 目录选择为 Tools 文件夹下面的 libnfcbuild 目录,然后点击 Configure。

此时会弹出一个窗口提示你选择编译环境,选择MinGW,然后点击 Finish

这个时候等待 GCC 处理完毕,你会看到一个错误对话框,点击 OK。

很明显是缺库了,进行调整:

CMAKE BUILD TYPE 改为 Release(当然 Debug 也可以);CMAKE_INSTALLPREFIX 修改为刚刚我创建的 libnfcbuild 目录,LIBNFC_SYSCONFDIR 请在刚刚的 libnfcbuild 目录下面手动建立一个 config 目录,并选择它。
PCREBINDIRS 修改为 pcre-7.0 目录下面的 bin 目录,INCLUDEDIRS 同理
PCRE_LIBRARIES 修改为 pcrelib 目录下面的 libpcre_dll.a

然后再次点击 Configure,出现新的参数:

由于我只使用 PN532,所以只保留 PN532 UART 选项,如果你是用 ACR122u 等读写器,可以进行对应的修改

LIBUSB_INCLUDE_DIRS 改为你 libusb-win32 目录下面的 include 目录,LIBRARIES 修改为 lib\gcc\libusb.a 文件(如果你使用其它编译器,选择对应的即可)最后再点击一次 Configure,如果没有什么差错的话,就会提示 Configuring Done 了。

正式编译

启动 CMD,进入刚刚的 libnfcbuild 目录,执行 C:\TDM-GCC-64\bin\mingw32-make.exe 即可,等待编译结束


编译完成了,开始整理文件:

进入 libnfcbuild 目录的 examples 文件夹,复制出所有的 EXE 文件到一个新文件夹

再进入 utils 目录,同样复制出所有的 EXE 文件

然后解决DLL依赖:

将 libusb-win32-bin-1.2.6.0\bin\x86 下面的 libusb0_x86.dll 改名为 libusb0.dll
pcre-7_0\bin 下面的 pcre3.dll
将 libnfcbuild\libnfc 目录下面的 libnfc.dll 也复制过来

最终成品大概就是这样:

测试

插上你的 PN532,并安装好 CP2103 驱动程序(USB to UART Bridge VCP Drivers),执行 nfc-list.exe,并放一张卡片在上面

可以看到成功的打开了端口并识别出了PN532,并且读出了卡片的信息


编译 mfcuk

MFCUK (MiFare Classic Universal toolKit) 是一款基于 dackside 攻击原理破解全加密 M1 卡的开源软件,mfcuk 通过算法的漏洞破解出第一个 key,如果某个扇区的 key 被破解出来,就可以再使用 mfoc 工具使用 nested authentication 攻击破解其他扇区的密码。

可以从这里获取源码:https://github.com/nfc-tools/mfcuk
在编译前你需要安装 MSYS2 MinGW,然后切为国内的镜像源,可参考:Tsinghua Open Source MirrorMSYS2 镜像使用帮助 [LUG@USTC]
启动MSYS2,安装软件包:
pacman -S mingw-w64-x86_64-gcc make automake mingw-w64-x86_64-gcc cmake git

下载 mfcuk 源码并解压到目录里面进入目录,输入 autoreconf -is,然后 ./configure

提示缺少 libnfc,我们将之前 libnfctools\nfclib 目录下面的 libnfc.dll.a 改名为 libnfc.a,复制到你的 MSYS2 安装目录下面 mingw32\lib 目录下面

接下来,在MSYS2手动创建一个 sys 目录:mkdir /sys
下载一个文件头b并将其复制到 sys 目录下面:https://github.com/lattera/glibc/blob/master/string/endian.h

回到 MSYS2 终端,使用下面的命令进行生成:
LIBS=/mingw32/lib/libnfc.a ac_cv_header_endian_h=/sys/endian.h ./configure PKG_CONFIG=:

在 mfcuk 目录下面的 src 文件夹里面建立一个 nfc 目录,找到 libnfc-1.7.1 源码的目录,进入 include\src 文件夹,找到这三个头文件,复制到你 mfcuk\src 文件夹下面的 nfc 目录中。

然后再将 libnfc\contrib\win32 下面的 err.h 放到你 mfcuk 的 src 文件夹下面:

最后开始编译:

LIBS=/mingw32/lib/libnfc.a ac_cv_header_endian_h=/sys/endian.h make

在 src 目录找到生成的 mfcuk.exe,放到和 libnfc.dll 一个目录中运行一下看看:


参考资料:
Libnfc-1.6.0在Windows下的编译过程
在Windows下编译支持ACR122U的libnfc
Installing libnfc on Windows and create executables and libnfc.dll

源链接

Hacking more

...