有位大神告诉我发现了github上有人破解了广州天翼校园加密。具体仓库请点击链接EsDialerGD 代码实现了认证和keep请求。
接下来我会介绍如何通过以上代码完成小米路由器3g的自动认证上网逻辑。
EsDialerGD项目默认不提供相关的请求url
这些url需要自行抓包获取,url包括:
ps 程序默认的获取config url 为重定向地址ip的url,但在我们学校这个url是另外一个ip地址,所以具体的url需要用wireshark抓包拿到。以我们学校为例,需要修改源代码中的auth.c文件:
int get_ticket(AUTH_CONTEXT *ctx) {
if (!ctx->ticket_url[0]) {
dbgout("ticket_url not found");
goto _fail;
}
update_local_time(ctx);
char data[UD_BUF_SIZE] = {0};
char buf[UD_BUF_SIZE] = {0};
char md5_hex[64] = {0};
build_ticket_payload(ctx, data, md5_hex);
char headers[8][HEADER_LEN];
build_headers(ctx, headers, md5_hex);
(*((uint8_t *) (md5_bin + 1))),
(*((uint8_t *) (md5_bin + 2))),
(*((uint8_t *) (md5_bin + 3))),
(*((uint8_t *) (md5_bin + 4))),
(*((uint8_t *) (md5_bin + 5))));
dbgout("Fake MAC=%s", ctx->mac_addr);
snprintf(ctx->client_id, 64, "%08X-%04X-%04X-%04X-%04X%08X",
(*((uint32_t *) md5_bin)),
(*((uint16_t *) (md5_bin + 1))),
(*((uint16_t *) (md5_bin + 2))),
(*((uint16_t *) (md5_bin + 3))),
(*((uint16_t *) (md5_bin + 4))),
(*((uint32_t *) (md5_bin + 5))));
dbgout("Fake ClientID=%s", ctx->client_id);
if (cdc_domain) strcpy(ctx->cdc_domain, cdc_domain);
if (cdc_area) strcpy(ctx->cdc_area, cdc_area);
if (cdc_schoolid) strcpy(ctx->cdc_schoolid, cdc_schoolid);
strcpy(ctx->ostag, ostag);
strcpy(ctx->host_name, host_name);
strcpy(ctx->user_agent, user_agent);
strcpy(ctx->algo_id, algo_id);
char *ticker_url_buffer = malloc(2048);
//使用抓包获取到的config_url
memset(ticker_url_buffer, 0, 2048);
strcat(ticker_url_buffer, "http://14.146.227.141/index.cgi?wlanuserip=");
strcat(ticker_url_buffer, ctx->ipv4_addr);
strcat(ticker_url_buffer, "&wlanacip=61.142.108.88&portal_node=http://125.88.59.131:10002");
if (get_config(ctx, ticker_url_buffer)) {
free(ticker_url_buffer);
goto _fail;
}
free(ticker_url_buffer);
return 0;
_fail:
dbgout(FAILED_STR);
return -1;
}
如果程序编译后无法正常认证,请自行抓包确认一下URL,并且需要确认认证的固件ID为54EB0E0D-58FE-46E2-8629-0A517E2785F4
由于需要运行在小米路由器中,需要交叉编译。为了方便期间,我决定用cmake实现编译脚本,EsDialerGD项目默认只使用了curl链接库,所以动态链接并不麻烦。 我的CMakeLists.txt文件的代码如下:
cmake_minimum_required(VERSION 3.2)
set(PROJECT_NAME EsDialerGD)
set(PROJECT_SOURCE_FILES
auth.c
codec.c
http_req.c
md5.c
str_extract.c
main.c)
project(${PROJECT_NAME} C)
option(USE_SYSTEM_CURL "Set to ON to use system default curl otherwise your must define curl include path." OFF)
message(STATUS "-------------------------------------------")
message(STATUS "Options USE_SYSTEM_CULR " ${USE_SYSTEM_CURL})
message(STATUS "Options LIB_PATH" ${LIB_PATH})
if(NOT USE_SYSTEM_CURL)
if(NOT CURL_INCLUDE_PATH OR NOT LIB_PATH)
message(ERROR "Your must define curl include path when not use system curl.")
exit(1)
else()
include_directories(${CURL_INCLUDE_PATH})
link_directories(${LIB_PATH})
endif()
endif()
add_executable(${PROJECT_NAME} ${PROJECT_SOURCE_FILES})
set_property(TARGET ${PROJECT_NAME} PROPERTY C_STANDARD 99)
target_link_libraries(${PROJECT_NAME} curl)
其中需要指定三个变量:
这里以小米路由器3g为例子,但其他的可以刷openwrt路由器也是可以的,具体的步骤如下
//下载小米路由器提供的toolchains
cd /root
wget http://bigota.miwifi.com/xiaoqiang/sdk/tools/package/sdk_package_r3p.zip
unzip sdk_package_r3p
mkdir bin && cd bin
git clone https://github.com/claw6148/EsDialerGD.git
cd EsDialerGD
vim CMakeLists.txt
//这里将我上面的CMakeLists.txt文本拷贝进去
vim config //在config文件中添加如下内容
#!/bin/bash
ROOTDIR="/root/sdk_package/"
toolchain="${ROOTDIR}toolchain"
CURL="${ROOTDIR}include/"
LIB="-Wl,--rpath-link ${ROOTDIR}lib"
LIBRARY="${ROOTDIR}lib/"
export CXX="${toolchain}/bin/arm-xiaomi-linux-uclibcgnueabi-g++"
export CC="${toolchain}/bin/mipsel-xiaomi-linux-uclibc-gcc-4.8.5"
mkdir build
cmake -D CURL_INCLUDE_PATH=${CURL} -D LIB_PATH=${LIBRARY} .
cd build && cmake --build ..
chmod a+x ./config
./config
接下来将编译好的EsDialerGD文件拷贝到路由器中,并加上守护进程。就可以实现自动认证上网。