3 Commits

Author SHA1 Message Date
04fac1cff7 修复边界情况 2026-01-12 14:24:10 +08:00
0bba63d303 Use better way to detect bp script end instruction
fix bgi dsc overflow in debug build
2026-01-12 14:02:05 +08:00
0a92233e6c Fix some bp script can not be extracted 2026-01-12 13:17:25 +08:00
2 changed files with 20 additions and 10 deletions

View File

@@ -209,7 +209,7 @@ impl<'a> DscDecoder<'a> {
.0
.overflowing_add(self.key.overflowing_mul(346).0)
.0;
v1 = (v1 + (v0 >> 16)) & 0xffff;
v1 = overf::wrapping!(v1 + (v0 >> 16)) & 0xffff;
self.key = (v1 << 16) + (v0 & 0xffff) + 1;
v1 as u8
}

View File

@@ -73,19 +73,29 @@ impl BGIBpScript {
}
let mut last_instr_pos = 0;
reader.seek(SeekFrom::Start(header_size as u64))?;
let max_instr_len = reader.data.len() - 4;
let max_instr_len = reader.data.len();
while reader.pos < max_instr_len {
let instr = reader.cpeek_u32()?;
let instr = reader.peek_u8()?;
if instr == 0x17 {
last_instr_pos = reader.pos;
reader.pos += 4;
} else {
reader.pos += 1;
let need_zero_bytes = 3 - reader.pos % 4;
let mut all_zero = true;
for i in 0..need_zero_bytes {
let b = reader.peek_u8_at(reader.pos as u64 + 1 + i as u64)?;
if b != 0 {
all_zero = false;
break;
}
}
if all_zero {
last_instr_pos = reader.pos;
reader.pos += 1 + need_zero_bytes;
continue;
}
}
reader.pos += 1;
}
if last_instr_pos == 0 {
// return Err(anyhow::anyhow!("No end instruction found in bp script"));
last_instr_pos = reader.data.len();
return Err(anyhow::anyhow!("No end instruction found in bp script"));
}
reader.seek(SeekFrom::Start(header_size as u64))?;
let mut strings = Vec::new();
@@ -96,7 +106,7 @@ impl BGIBpScript {
let text_address = reader.pos + text_offset as usize - 1;
if text_address >= last_instr_pos
&& text_address < reader.data.len()
&& (text_address == last_instr_pos || reader.data[text_address - 1] == 0)
&& (text_address <= last_instr_pos + 1 || reader.data[text_address - 1] == 0)
{
strings.push(BpString {
offset_pos: reader.pos,