mirror of
https://github.com/bol-van/zapret2.git
synced 2026-03-14 06:13:09 +00:00
Compare commits
9 Commits
6d7f8efc49
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7cdc75d0db | ||
|
|
348f907b47 | ||
|
|
d641b00083 | ||
|
|
d3b3011000 | ||
|
|
2ec512af17 | ||
|
|
d41151ef6f | ||
|
|
60ac3693fc | ||
|
|
766b60544f | ||
|
|
e563f60153 |
5
.github/workflows/build.yml
vendored
5
.github/workflows/build.yml
vendored
@@ -106,7 +106,7 @@ jobs:
|
|||||||
OPTIMIZE=-Os
|
OPTIMIZE=-Os
|
||||||
;;
|
;;
|
||||||
arm)
|
arm)
|
||||||
CPU="-mcpu=cortex-a7 -mthumb"
|
CPU="-mcpu=arm1176jzf-s -mthumb"
|
||||||
;;
|
;;
|
||||||
arm64|mips64)
|
arm64|mips64)
|
||||||
# not safe without GC64
|
# not safe without GC64
|
||||||
@@ -250,6 +250,7 @@ jobs:
|
|||||||
arm64-v8a)
|
arm64-v8a)
|
||||||
# not safe without GC64
|
# not safe without GC64
|
||||||
SYSMALLOC=
|
SYSMALLOC=
|
||||||
|
PAGESIZE="-Wl,-z,max-page-size=16384"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
@@ -290,7 +291,7 @@ jobs:
|
|||||||
|
|
||||||
# zapret2
|
# zapret2
|
||||||
CFLAGS="-DZAPRET_GH_VER=${{ github.ref_name }} -DZAPRET_GH_HASH=${{ github.sha }} -I$DEPS_DIR/include $CPU" \
|
CFLAGS="-DZAPRET_GH_VER=${{ github.ref_name }} -DZAPRET_GH_HASH=${{ github.sha }} -I$DEPS_DIR/include $CPU" \
|
||||||
LDFLAGS="-L$DEPS_DIR/lib" \
|
LDFLAGS="-L$DEPS_DIR/lib $PAGESIZE" \
|
||||||
make -C zapret2 LUA_JIT=$LJIT LUA_CFLAGS="$LCFLAGS" LUA_LIB="$LLIB" -j$(nproc) android
|
make -C zapret2 LUA_JIT=$LJIT LUA_CFLAGS="$LCFLAGS" LUA_LIB="$LLIB" -j$(nproc) android
|
||||||
|
|
||||||
# strip unwanted ELF sections to prevent warnings on old Android versions
|
# strip unwanted ELF sections to prevent warnings on old Android versions
|
||||||
|
|||||||
@@ -270,5 +270,6 @@ v0.9.4.3
|
|||||||
0.9.4.5
|
0.9.4.5
|
||||||
|
|
||||||
* github: rollback to lj_alloc in luajit for arm64 and mips64
|
* github: rollback to lj_alloc in luajit for arm64 and mips64
|
||||||
|
* github: use 16K page size for android arm64 build
|
||||||
* nfqws2: join fragments in quic CRYPTO reconstruction. allow intersections.
|
* nfqws2: join fragments in quic CRYPTO reconstruction. allow intersections.
|
||||||
|
|
||||||
|
|||||||
@@ -389,7 +389,8 @@ function syndata(ctx, desync)
|
|||||||
dis.payload = blob(desync, desync.arg.blob, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
|
dis.payload = blob(desync, desync.arg.blob, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
|
||||||
apply_fooling(desync, dis)
|
apply_fooling(desync, dis)
|
||||||
if desync.arg.tls_mod then
|
if desync.arg.tls_mod then
|
||||||
dis.payload = tls_mod_shim(desync, dis.payload, desync.arg.tls_mod, nil)
|
local pl = tls_mod_shim(desync, dis.payload, desync.arg.tls_mod, nil)
|
||||||
|
if pl then dis.payload = pl end
|
||||||
end
|
end
|
||||||
if b_debug then DLOG("syndata: "..hexdump_dlog(dis.payload)) end
|
if b_debug then DLOG("syndata: "..hexdump_dlog(dis.payload)) end
|
||||||
if rawsend_dissect_ipfrag(dis, desync_opts(desync)) then
|
if rawsend_dissect_ipfrag(dis, desync_opts(desync)) then
|
||||||
@@ -449,7 +450,8 @@ function fake(ctx, desync)
|
|||||||
end
|
end
|
||||||
local fake_payload = blob(desync, desync.arg.blob)
|
local fake_payload = blob(desync, desync.arg.blob)
|
||||||
if desync.reasm_data and desync.arg.tls_mod then
|
if desync.reasm_data and desync.arg.tls_mod then
|
||||||
fake_payload = tls_mod_shim(desync, fake_payload, desync.arg.tls_mod, desync.reasm_data)
|
local pl = tls_mod_shim(desync, fake_payload, desync.arg.tls_mod, desync.reasm_data)
|
||||||
|
if pl then fake_payload = pl end
|
||||||
end
|
end
|
||||||
-- check debug to save CPU
|
-- check debug to save CPU
|
||||||
if b_debug then DLOG("fake: "..hexdump_dlog(fake_payload)) end
|
if b_debug then DLOG("fake: "..hexdump_dlog(fake_payload)) end
|
||||||
|
|||||||
@@ -175,7 +175,12 @@ end
|
|||||||
-- arg : server=[0|1] - override server mode. by default use "--server" nfqws2 parameter
|
-- arg : server=[0|1] - override server mode. by default use "--server" nfqws2 parameter
|
||||||
function udp2icmp(ctx, desync)
|
function udp2icmp(ctx, desync)
|
||||||
local dataxor
|
local dataxor
|
||||||
local bserver = desync.arg.server and (desync.arg.server~="0") or b_server
|
local bserver
|
||||||
|
if desync.arg.server then
|
||||||
|
bserver = desync.arg.server~="0"
|
||||||
|
else
|
||||||
|
bserver = b_server
|
||||||
|
end
|
||||||
|
|
||||||
local function one_byte_arg(name)
|
local function one_byte_arg(name)
|
||||||
if desync.arg[name] then
|
if desync.arg[name] then
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ CFLAGS_UBSAN = -fsanitize=undefined,alignment -fno-sanitize-recover=undefined,al
|
|||||||
LDFLAGS_PIE = -pie
|
LDFLAGS_PIE = -pie
|
||||||
LDFLAGS += -flto=auto -Wl,--gc-sections $(LDFLAGS_PIE)
|
LDFLAGS += -flto=auto -Wl,--gc-sections $(LDFLAGS_PIE)
|
||||||
LDFLAGS_ANDROID = -llog
|
LDFLAGS_ANDROID = -llog
|
||||||
|
LDFLAGS_CYGWIN = -Wl,--build-id=none
|
||||||
STRIPP=-s
|
STRIPP=-s
|
||||||
LIBS =
|
LIBS =
|
||||||
LIBS_LINUX = -lz -lnetfilter_queue -lnfnetlink -lmnl -lm
|
LIBS_LINUX = -lz -lnetfilter_queue -lnfnetlink -lmnl -lm
|
||||||
@@ -157,9 +158,9 @@ bsd: $(SRC_FILES)
|
|||||||
$(CC) $(STRIPP) $(CFLAGS) $(LUA_CFL) $(CFLAGS_BSD) -o dvtws2 $(SRC_FILES) $(LIBS) $(LUA_LIB) $(LIBS_BSD) $(LDFLAGS)
|
$(CC) $(STRIPP) $(CFLAGS) $(LUA_CFL) $(CFLAGS_BSD) -o dvtws2 $(SRC_FILES) $(LIBS) $(LUA_LIB) $(LIBS_BSD) $(LDFLAGS)
|
||||||
|
|
||||||
cygwin64:
|
cygwin64:
|
||||||
$(CC) $(STRIPP) $(CFLAGS) $(LUA_CFL) $(CFLAGS_CYGWIN) $(CFLAGS_CYGWIN64) -o winws2 $(SRC_FILES) $(RES_CYGWIN64) $(LIBS) $(LUA_LIB) $(LIBS_CYGWIN) $(LIBS_CYGWIN64) $(LDFLAGS)
|
$(CC) $(STRIPP) $(CFLAGS) $(LUA_CFL) $(CFLAGS_CYGWIN) $(CFLAGS_CYGWIN64) -o winws2 $(SRC_FILES) $(RES_CYGWIN64) $(LIBS) $(LUA_LIB) $(LIBS_CYGWIN) $(LIBS_CYGWIN64) $(LDFLAGS) $(LDFLAGS_CYGWIN)
|
||||||
cygwin32:
|
cygwin32:
|
||||||
$(CC) $(STRIPP) $(CFLAGS) $(LUA_CFL) $(CFLAGS_CYGWIN) $(CFLAGS_CYGWIN32) -o winws2 $(SRC_FILES) $(RES_CYGWIN32) $(LIBS) $(LUA_LIB) $(LIBS_CYGWIN) $(LIBS_CYGWIN32) $(LDFLAGS)
|
$(CC) $(STRIPP) $(CFLAGS) $(LUA_CFL) $(CFLAGS_CYGWIN) $(CFLAGS_CYGWIN32) -o winws2 $(SRC_FILES) $(RES_CYGWIN32) $(LIBS) $(LUA_LIB) $(LIBS_CYGWIN) $(LIBS_CYGWIN32) $(LDFLAGS) $(LDFLAGS_CYGWIN)
|
||||||
cygwin: cygwin64
|
cygwin: cygwin64
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
|||||||
11
nfq2/lua.c
11
nfq2/lua.c
@@ -3350,7 +3350,6 @@ static int luacall_tls_mod(lua_State *L)
|
|||||||
int argc=lua_gettop(L);
|
int argc=lua_gettop(L);
|
||||||
|
|
||||||
size_t fake_tls_len;
|
size_t fake_tls_len;
|
||||||
bool bRes;
|
|
||||||
const uint8_t *fake_tls = (uint8_t*)lua_reqlstring(L,1,&fake_tls_len);
|
const uint8_t *fake_tls = (uint8_t*)lua_reqlstring(L,1,&fake_tls_len);
|
||||||
const char *modlist = lua_reqstring(L,2);
|
const char *modlist = lua_reqstring(L,2);
|
||||||
|
|
||||||
@@ -3370,8 +3369,10 @@ static int luacall_tls_mod(lua_State *L)
|
|||||||
uint8_t *newtls = lua_newuserdata(L, maxlen);
|
uint8_t *newtls = lua_newuserdata(L, maxlen);
|
||||||
|
|
||||||
memcpy(newtls, fake_tls, newlen);
|
memcpy(newtls, fake_tls, newlen);
|
||||||
bRes = TLSMod(&mod, payload, payload_len, newtls, &newlen, maxlen);
|
if (TLSMod(&mod, payload, payload_len, newtls, &newlen, maxlen))
|
||||||
lua_pushlstring(L,(char*)newtls,newlen);
|
lua_pushlstring(L,(char*)newtls,newlen);
|
||||||
|
else
|
||||||
|
lua_pushnil(L);
|
||||||
|
|
||||||
lua_remove(L,-2);
|
lua_remove(L,-2);
|
||||||
}
|
}
|
||||||
@@ -3379,11 +3380,9 @@ static int luacall_tls_mod(lua_State *L)
|
|||||||
{
|
{
|
||||||
// no mod. push it back
|
// no mod. push it back
|
||||||
lua_pushlstring(L,(char*)fake_tls,fake_tls_len);
|
lua_pushlstring(L,(char*)fake_tls,fake_tls_len);
|
||||||
bRes = true;
|
|
||||||
}
|
}
|
||||||
lua_pushboolean(L, bRes);
|
|
||||||
|
|
||||||
LUA_STACK_GUARD_RETURN(L,2)
|
LUA_STACK_GUARD_RETURN(L,1)
|
||||||
}
|
}
|
||||||
|
|
||||||
struct userdata_zs
|
struct userdata_zs
|
||||||
|
|||||||
@@ -649,9 +649,11 @@ bool TLSAdvanceToHostInSNI(const uint8_t **ext, size_t *elen, size_t *slen)
|
|||||||
// u8 data+2 - server name type. 0=host_name
|
// u8 data+2 - server name type. 0=host_name
|
||||||
// u16 data+3 - server name length
|
// u16 data+3 - server name length
|
||||||
if (*elen < 5 || (*ext)[2] != 0) return false;
|
if (*elen < 5 || (*ext)[2] != 0) return false;
|
||||||
|
uint16_t nll = pntoh16(*ext);
|
||||||
*slen = pntoh16(*ext + 3);
|
*slen = pntoh16(*ext + 3);
|
||||||
|
if (nll<(*slen+3) || *slen > *elen-5) return false;
|
||||||
*ext += 5; *elen -= 5;
|
*ext += 5; *elen -= 5;
|
||||||
return *slen <= *elen;
|
return true;
|
||||||
}
|
}
|
||||||
static bool TLSExtractHostFromExt(const uint8_t *ext, size_t elen, char *host, size_t len_host)
|
static bool TLSExtractHostFromExt(const uint8_t *ext, size_t elen, char *host, size_t len_host)
|
||||||
{
|
{
|
||||||
@@ -1269,7 +1271,7 @@ bool QUICDefragCrypto(const uint8_t *clean,size_t clean_len, uint8_t *defrag,siz
|
|||||||
uint8_t *defrag_data = defrag+10;
|
uint8_t *defrag_data = defrag+10;
|
||||||
size_t defrag_data_len = *defrag_len-10;
|
size_t defrag_data_len = *defrag_len-10;
|
||||||
uint8_t ft;
|
uint8_t ft;
|
||||||
uint64_t offset,sz,szmax=0,zeropos=0,pos=0,r1,r2;
|
uint64_t offset,sz,szmax=0,zeropos=0,pos=0;
|
||||||
bool found=false;
|
bool found=false;
|
||||||
struct range64 ranges[MAX_DEFRAG_PIECES];
|
struct range64 ranges[MAX_DEFRAG_PIECES];
|
||||||
int i,j,range=0;
|
int i,j,range=0;
|
||||||
@@ -1294,26 +1296,26 @@ bool QUICDefragCrypto(const uint8_t *clean,size_t clean_len, uint8_t *defrag,siz
|
|||||||
if ((pos+sz)>clean_len) return false;
|
if ((pos+sz)>clean_len) return false;
|
||||||
|
|
||||||
if ((offset+sz)>defrag_data_len) return false; // defrag buf overflow
|
if ((offset+sz)>defrag_data_len) return false; // defrag buf overflow
|
||||||
|
|
||||||
|
// remove exact duplicates early to save cpu
|
||||||
|
for(i=0;i<range;i++)
|
||||||
|
if (ranges[i].offset==offset && ranges[i].len==sz)
|
||||||
|
goto skip_range;
|
||||||
|
|
||||||
if (zeropos < offset)
|
if (zeropos < offset)
|
||||||
// make sure no uninitialized gaps exist in case of not full fragment coverage
|
// make sure no uninitialized gaps exist in case of not full fragment coverage
|
||||||
memset(defrag_data+zeropos,0,offset-zeropos);
|
memset(defrag_data+zeropos,0,offset-zeropos);
|
||||||
if ((offset+sz) > zeropos)
|
if ((offset+sz) > zeropos)
|
||||||
zeropos=offset+sz;
|
zeropos=offset+sz;
|
||||||
|
|
||||||
memcpy(defrag_data+offset,clean+pos,sz);
|
|
||||||
if ((offset+sz) > szmax) szmax = offset+sz;
|
|
||||||
|
|
||||||
found=true;
|
found=true;
|
||||||
pos+=sz;
|
if ((offset+sz) > szmax) szmax = offset+sz;
|
||||||
|
memcpy(defrag_data+offset,clean+pos,sz);
|
||||||
// remove exact duplicates early to save cpu
|
|
||||||
for(i=0;i<range;i++)
|
|
||||||
if (ranges[i].offset==offset && ranges[i].len==sz)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
ranges[range].offset = offset;
|
ranges[range].offset = offset;
|
||||||
ranges[range].len = sz;
|
ranges[range].len = sz;
|
||||||
range++;
|
range++;
|
||||||
|
skip_range:
|
||||||
|
pos+=sz;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (found)
|
if (found)
|
||||||
@@ -1373,6 +1375,8 @@ bool IsQUICInitial(const uint8_t *data, size_t len)
|
|||||||
if (data[offset] > QUIC_MAX_CID_LENGTH) return false;
|
if (data[offset] > QUIC_MAX_CID_LENGTH) return false;
|
||||||
offset += 1 + data[offset];
|
offset += 1 + data[offset];
|
||||||
|
|
||||||
|
if (offset>=len) return false;
|
||||||
|
|
||||||
// SCID
|
// SCID
|
||||||
if (data[offset] > QUIC_MAX_CID_LENGTH) return false;
|
if (data[offset] > QUIC_MAX_CID_LENGTH) return false;
|
||||||
offset += 1 + data[offset];
|
offset += 1 + data[offset];
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user