标签 逆向工程 下的文章

CVE-2025-0282 Ivanti Connect Secure VPN 栈溢出漏洞分析

也许有些佬不大明白这个软件是做什么的?

简单讲,这是一款用于教学的 ERP 沙盘模拟系统,
它可以让学生自己体验一把公司运营的感觉,
倒也可以说是模拟经营游戏。
这是一些软件截图,或许能唤起部分人的回忆:






我是在学校中了解到这个系统,那时候上手了一下就有点上瘾了。
后来我在各大搜索引擎中,在 CSDN 找到了原始安装包,
不过由于需要加密狗,我就一直存放在我的网盘一直没有动过。

后来在上周,我就开始了对他的破解研究,直到目前才正式完工。
除了破解补丁,我在安装包内附赠了该软件的操作手册,
还有一些我在学校机房发现的规划和订单文件。
你可以利用这些文件让 AI 帮你写出你想要的规划和订单,
或者你自己利用安装文件的工具手工制作一个,
并导入到软件里面,自行体验公司运营的乐趣。

你也许不知道这个软件的含金量,他在闲鱼价格通常以租聘账号为主。
十几块钱一周,三十几一个月,主要租聘的是软件的规划订单数据,
国内一些的比赛也在使用这个软件,而且不少学生都想要这个软件的安装包。
软件本体本不应公开,但我希望我的贡献能给相同需要的学生一个帮助。

!!!但请注意,请不要将该软件直接部署在公网的生产环境中!!!
这不是我的问题,但这软件已经硬编码写死了数据库的密码和用户名,
数据库本身有弱口令风险,会有被渗透的可能性。
并且请勿将软件用于商业或盈利用途,转载请先告知我!!!
除此之外,也还请各位佬友私下交流并游玩哇~~
(同样如果你遇到了什么问题,也欢迎在底下留言呢,
第一次做这种逆向,不是懂很多 xwx)

软件启动后默认地址为:http://localhost:8081/
管理员账户名:admin
管理员密码:1

123 盘:https://www.123865.com/s/ztqKVv-t3Hl3
(去掉了蓝奏云下载,我刚知道蓝奏云已经没办法分卷上传了)

因为是第一次,所以等级就暂时锁到 3 级佬可见,等风头好些了再尝试降到 2 级哇。
希望不会给我带来什么乱子


📌 转载信息
转载时间:
2026/1/19 18:29:38

助理安全研究员(漏洞挖掘与利用)(北京)

薪资:17-19k,15薪,具体可进一步沟通

投递方式:campus@360.cn

职位职位链接:https://360campus.zhiye.com/campus/detail?jobAdId=69b88265-4f41-4e90-b2e3-02ae630c7631

工作职责

1、深入研究软件、设备、系统、网络协议等某领域或多领域的安全漏洞,利用逆向工程、模糊测试、静态/动态代码分析等技术,主动发现并验证新的安全漏洞;

2、探索应用大语言模型(LLM)技术于Web与二进制领域的复杂漏洞挖掘,结合专业知识,设计构建相关自动化工具/流程;

3、研究前沿攻防技术,跟踪国内外安全动态与漏洞披露信息,复现漏洞,研究攻击手法和防御技术,持续提升公司的安全研究能力;

4、参与相关项目或课题,推动漏洞研究能力的价值转化。

任职资格

1、计算机科学、信息安全或相关领域本科及以上学历;

2、对Web和二进制安全漏洞有一定的认知,具备一定的逆向分析能力和研究能力,熟练使用常见工具,如:IDA、WinDbg、GDB等;

3、熟练掌握C/C++/Python等至少一种语言,熟悉X86或ARM汇编指令,有扎实的编程基础;

4、对漏洞挖掘与利用感兴趣,有热情和自我驱动力,有一定的抗压能力和较强的团队协作精神。

以上职位满足以下至少一项条件者优先录用:

1、参加过天府杯、Pwn2Own等赛事,并成功攻破目标,作为CTF主力选手取得过优秀的成绩。

2、在有影响力的业界会议(学术/工业)上发表论文;

3、有独立挖掘漏洞的经验,获得过主流厂商的CVE编号;

4、通过使用/定制/自研工具发现有效漏洞;

安全研究员(Windows方向)(北京)

薪资:17-19k,15薪,具体可进一步沟通

投递方式:campus@360.cn

职位直达链接:https://360campus.zhiye.com/campus/detail?jobAdId=d7b48154-dd38-45ee-9492-0b4baec1004a

工作职责

1持续跟踪并深入分析最新的Windows平台漏洞,研究其根本原理、高级利用技术及有效的缓解措施。

2研究和复现野外流行的攻击手法、APT攻击中使用的先进技术,特别是针对杀毒软件、EDR等安全产品的绕过技术(如白利用、无文件攻击、内存驻留、EDR盲点等)。

3基于研究成果,设计和开发创新的威胁检测模型和主动防御方案,并将其工程化,落地到实际的安全产品中,提升产品的核心检测与防护能力。

任职资格

1计算机科学、信息安全、网络工程或相关专业本科及以上学历。

2精通C/C++编程,熟悉Python等脚本语言,具备扎实的Windows平台开发能力(如Win32 API, Native API)。

3熟练掌握x86/x64汇编语言,能够熟练使用IDA Pro, WinDbg, x64dbg等工具进行静态分析和动态调试。

4深入理解Windows操作系统内核机制,包括内存管理、进程/线程调度、对象管理、文件系统、驱动模型等。

5对主流的漏洞利用技术(如ROP, JOP, 堆利用等)及相应的防御和绕过技术(如ASLR, DEP, CFG bypass)有深入的理解。

6 对安全研究抱有浓厚兴趣和热情,具备强烈的自我驱动力、好奇心和优秀的学习能力,能够独立解决复杂技术问题。
加分项(满足以下一项或多项者优先):

7有独立发现并分析过漏洞(有CVE编号者优先)的经验。

8有Windows内核驱动开发或内核安全攻防经验者优先。

9有反病毒、反外挂、EDR、HIPS等安全产品核心研发经验者优先。

10在知名安全会议或在安全社区、个人博客上发表过高质量技术文章者优先。

11在CTF竞赛中取得过优异成绩者优先。

CVE-2025-0282 Ivanti Connect Secure VPN 栈溢出漏洞分析


在很多比赛中,都是以代码量堆积起来的,这样题目需要有强大的逆向的能力,但是在大ai时代,我们可以让ai给我们极大程度的降低逆向分析的压力。

题目附件

通过网盘分享的文件:easypwn_b52bf495bea360db1e259c6827e703ed.zip

链接: https://pan.baidu.com/s/1pA49B0Jpb0FYAEKqSHe1Kg?pwd=aaaa 提取码: aaaa

--来自百度网盘超级会员v4的分享

Easypwn(典型的 bison/flex 生成的 parser:状态栈用 byte,语义栈用 8 字节槽位

这个题目及其复杂,我们通过这个题目学习一下现代ai逆向分析的辅。

技巧一:通过ai写idapython快速一键还原名称

其他的部分可以利用这个方式一键还原,这样就不用看a+的偏移

这里计算机模拟架构非常非常复杂 我们需要用idapython进行导入,要不太麻烦了

下面这个idapython可以直接导入我们需要的

Python

复制代码
import idc
import ida_kernwin

DECLS = r"""
typedef struct StreamCtx
{
void *fp;
unsigned char *buf;
unsigned char *ptr;
int cap;
int len;
int can_realloc;
int is_tty;
int unk40;
int unk44;
int unk48;
int buf_inited;
int slot_state;
int _pad5C;
} StreamCtx;

typedef struct OP_Ctx
{
int *nest_counter;
void *in;
void *out;
unsigned __int64 stream_index;
unsigned __int64 stream_cap;
StreamCtx **streams;

unsigned char ch_saved;
unsigned char _pad49[3];

int buf_valid;
int tok_len;
unsigned char *cur;

idapython使用中遇到的问题及解决

一开始遇到了ModuleNotFoundError: No module named 'ida_struct'这个问题

对于这个问题,我们首先确定我们这个模块有没有这个功能

import pkgutil
mods = sorted([m.name for m in pkgutil.iter_modules()])
print("ida_struct" in mods, "idautils" in mods, "idaapi" in mods)
print([m for m in mods if m.startswith("ida_")][:50])

你返回的结果非常明确:

ida_struct False

idaapi True

idautils True

并且模块列表里有 ida_typeinfida_idc 等,但就是没有 ida_struct

这个 IDA/IDAPython 版本把结构体相关能力主要放在 IDC API(idc.*)和 ida_typeinf/ida_bytes 等模块里了

然后我们把这里的信息喂给ai之后,就能给我写出来正确的idapython的脚本

idapython的使用实例二

下面给你一份 “一键还原已知信息” 的 IDAPython 脚本(兼容你这套 Python 3.11 + 没有 ida_struct 模块 的环境)。它会做三件事:

1 给你已知的全局表(byte_4068xx/word_4063xx)批量重命名(Bison 表 + Flex DFA 表)

2 尽量给这些表打上合理的数组类型(不要求知道确切长度)

3 (可选)把你已导入的 StreamCtx / OP_Ctx 的成员名改成更语义化的 Flex/Bison 命名(如果 idc.set_member_name 在你版本可用就会生效,不可用也不会报错)

你直接把脚本复制到 IDA 的 Python 窗口执行即可。执行完建议:F5 刷新反编译窗口,或者重开一下伪代码视图。

idaoython中的窗口的刷新

这个好像只能还原反汇编,不能还原反编译

这里需要关闭重启一下才行,重复这个步骤可以很快还原这个计算机的函数名称,结构体名称,而不用去手动一个个的去定义。

技巧二:fuzz输入测试(AFL)

这个题目fuzz测试没测出来异常,应该是我的用法的问题

下面这个是特定工具,限制的话是需要提前用这个fuzz进行编译

安装

下载AFL

编译

检测是否成功

运行

建目录 in/,放一些“语法合法”的短表达式:

run.sh

如果你有源码:优先用插桩编译(效果最好)

如果你只有二进制:用 QEMU 模式

-m none 是为了避免一些程序内存稍大导致 AFL 误杀。 -t 1000+ / 2000+ 是给 parser 足够时间(你后面可以再调回去)。

遇到的问题以及解决

解决环境问题

解决工具的依赖的问题(c脚本替代bash脚本)

再次安转依赖

build_qemu_support.sh的脚本修复

拷贝进入linux空间

清理空间

改个配置文件

然后创建一个临时终端,解决python的版本的问题

之后编译的时候可能会出现很多bug,我们用下面这个查看内存占用的情况

删除编译残留

安装AFL+

环境清理

docker拉取

运行,等待

爆破了2小时一无所获,我们可以延长时间的参数

crashes

这个目录通常用于存储 fuzzing 过程中发现的崩溃案例。AFL++ 在测试目标程序时,如果遇到崩溃(比如段错误、总线错误等),它会将触发崩溃的输入保存到这个文件夹中,供进一步分析。

default

这个文件夹可能包含 AFL++ 默认的配置、输入样本或运行时数据。它可能是 fuzzing 过程中使用的初始种子(seeds)文件的目录,也可能是 fuzzing 执行时的默认设置或输入数据的存储位置。

hangs

这个目录用于存储 fuzzing 过程中导致程序挂起(例如死锁或无限循环)的输入数据。当 AFL++ 测试过程中遇到这样的情况时,它会将这些输入保存到这个目录中,以便进一步调试。

plot_data

这个目录通常包含 AFL++ 在 fuzzing 流程中生成的图形数据或统计数据。例如,它可能包含了程序运行过程中的覆盖率信息,用于生成图形化的报告。AFL++ 可以通过这些数据来评估模糊测试的有效性和进展。

queue

这个文件夹保存 fuzzing 测试过程中用来测试程序的所有输入数据(也就是“队列”)。每一个输入样本都会被存储在此文件夹中,并且 AFL++ 会不断地修改、变异这些输入数据,并将变异后的数据放入队列中供程序继续测试。

查看 fuzzer_stats

这个文件记录了 AFL++ 在模糊测试过程中跟踪的关键统计数据

查看 plot_data

这个文件提供了模糊测试的进度数据,并记录了时间、执行情况等与测试进度相关的信息。每一行代表测试过程中的一个时间点

技巧三:结构体的分析技巧

结构体一般是存储在堆上,我们打断点到malloc的位置上,然后对比赋值从物理字段对比ida源码记忆结构体即可,如果抽象能力很强的话可以直接看。

这样的话看的话就比较清晰了,结构体的赋值字段就不用跳着看了

image.png







技巧四:程序流的分析技巧

我们看到漏洞的可能点,我们一个重要的是如何达到我们漏洞的利用点

这里我们可以结合ida的反汇编窗口去一个个对比去看,结合F5,这里和dbg的动调配合起来,道道很多,附一个中间过程对比的截图,主要是有外到内取看判断条件

image.png



这里的分析过程最好是关闭aslr,这样可以看到分支条件哪些是可控的因素,哪些是不可控的因素,哪些可以进入分支,哪些是必然不能进入分支的。

技巧五:弄清楚bug的原因

这个是和程序流一样的,我们要尽可能弄清楚,弄不清楚不是很影响,弄清楚了之后对于做题帮助是实质性的,比如说这个error的报错的原因

out的结构体如下

40 位十进制数大概是:

10^39 ~ 2^129.610^40 ~ 2^132.9

需要的字节数约为 ceil(bitlen/8)ceil(133/8) = 17 字节

也就是说,一个 40 位左右的大整数,转换成 base-256 输出时会产生 ~17 个 rem_byte

但你的 out 只有 16 字节,而且还不是“纯输出 buffer”,里面有指针/错误码。

所以当你写到第 9 个字节开始,out[1](error)就被你自己写脏了,变成非 0,于是:

就走 “error 分支”。

技巧五:漏洞分析技巧

这个是最难的一部分,把程序都还原出来,只不过是降低查找漏洞的难度,而不是我还原出来就一定能找到漏洞。

这个题目关闭了canary,本质上一个栈溢出

我们观察这里来回返回的释放申请,首先推测是结构体的重用的漏洞

这个题目逻辑流一开始往申请的堆块里面输入最大0x400的数据,实际上不到0x400

然后拷贝进入一个堆块,这里的拷贝是存在字符截断的处理的

之后申请一个ctx_manager结构体管理我们拷贝存储的堆块

第一轮检查结束就释放掉我们一开始的这些堆块,之后重复这个流程,然后功能执行的是分析计算

第二轮结束之后,还有一个计算结果标志位的检测,之后就是打印我们第二轮计算的结果,这个流程是这样的

这里的可疑的地方一个是多重释放,另外一个不断取余,我们从感觉是有这两个利用点

下面的这个利用点的话主要是这个

image.png



这里是往栈上的写,写的是我们计算的结果,我们可以利用我们利用残留数值ctx结构体,和这个配合可以写上rop链的

假如说我们不去使用特殊手段的话,我们最多只能写10个数字长度

然后我们发现可能并不是结构体重用的漏洞


助理安全研究员(漏洞挖掘与利用)(北京)

薪资:17-19k,15薪,具体可进一步沟通

投递方式:campus@360.cn



工作职责

1、深入研究软件、设备、系统、网络协议等某领域或多领域的安全漏洞,利用逆向工程、模糊测试、静态/动态代码分析等技术,主动发现并验证新的安全漏洞;

2、探索应用大语言模型(LLM)技术于Web与二进制领域的复杂漏洞挖掘,结合专业知识,设计构建相关自动化工具/流程;

3、研究前沿攻防技术,跟踪国内外安全动态与漏洞披露信息,复现漏洞,研究攻击手法和防御技术,持续提升公司的安全研究能力;

4、参与相关项目或课题,推动漏洞研究能力的价值转化。

任职资格

1、计算机科学、信息安全或相关领域本科及以上学历;

2、对Web和二进制安全漏洞有一定的认知,具备一定的逆向分析能力和研究能力,熟练使用常见工具,如:IDA、WinDbg、GDB等;

3、熟练掌握C/C++/Python等至少一种语言,熟悉X86或ARM汇编指令,有扎实的编程基础;

4、对漏洞挖掘与利用感兴趣,有热情和自我驱动力,有一定的抗压能力和较强的团队协作精神。

以上职位满足以下至少一项条件者优先录用:

1、参加过天府杯、Pwn2Own等赛事,并成功攻破目标,作为CTF主力选手取得过优秀的成绩。

2、在有影响力的业界会议(学术/工业)上发表论文;

3、有独立挖掘漏洞的经验,获得过主流厂商的CVE编号;

4、通过使用/定制/自研工具发现有效漏洞;



安全研究员(Windows方向)(北京)

薪资:17-19k,15薪,具体可进一步沟通

投递方式:campus@360.cn



工作职责

1持续跟踪并深入分析最新的Windows平台漏洞,研究其根本原理、高级利用技术及有效的缓解措施。

2研究和复现野外流行的攻击手法、APT攻击中使用的先进技术,特别是针对杀毒软件、EDR等安全产品的绕过技术(如白利用、无文件攻击、内存驻留、EDR盲点等)。

3基于研究成果,设计和开发创新的威胁检测模型和主动防御方案,并将其工程化,落地到实际的安全产品中,提升产品的核心检测与防护能力。

任职资格

1计算机科学、信息安全、网络工程或相关专业本科及以上学历。

2精通C/C++编程,熟悉Python等脚本语言,具备扎实的Windows平台开发能力(如Win32 API, Native API)。

3熟练掌握x86/x64汇编语言,能够熟练使用IDA Pro, WinDbg, x64dbg等工具进行静态分析和动态调试。

4深入理解Windows操作系统内核机制,包括内存管理、进程/线程调度、对象管理、文件系统、驱动模型等。

5对主流的漏洞利用技术(如ROP, JOP, 堆利用等)及相应的防御和绕过技术(如ASLR, DEP, CFG bypass)有深入的理解。

6对安全研究抱有浓厚兴趣和热情,具备强烈的自我驱动力、好奇心和优秀的学习能力,能够独立解决复杂技术问题。
加分项(满足以下一项或多项者优先):

7有独立发现并分析过漏洞(有CVE编号者优先)的经验。

8有Windows内核驱动开发或内核安全攻防经验者优先。

9有反病毒、反外挂、EDR、HIPS等安全产品核心研发经验者优先。

10在知名安全会议或在安全社区、个人博客上发表过高质量技术文章者优先。

11在CTF竞赛中取得过优异成绩者优先。


助理安全研究员(漏洞挖掘与利用)(北京)

薪资:17-19k,15薪,具体可进一步沟通

投递方式:campus@360.cn



工作职责

1、深入研究软件、设备、系统、网络协议等某领域或多领域的安全漏洞,利用逆向工程、模糊测试、静态/动态代码分析等技术,主动发现并验证新的安全漏洞;

2、探索应用大语言模型(LLM)技术于Web与二进制领域的复杂漏洞挖掘,结合专业知识,设计构建相关自动化工具/流程;

3、研究前沿攻防技术,跟踪国内外安全动态与漏洞披露信息,复现漏洞,研究攻击手法和防御技术,持续提升公司的安全研究能力;

4、参与相关项目或课题,推动漏洞研究能力的价值转化。

任职资格

1、计算机科学、信息安全或相关领域本科及以上学历;

2、对Web和二进制安全漏洞有一定的认知,具备一定的逆向分析能力和研究能力,熟练使用常见工具,如:IDA、WinDbg、GDB等;

3、熟练掌握C/C++/Python等至少一种语言,熟悉X86或ARM汇编指令,有扎实的编程基础;

4、对漏洞挖掘与利用感兴趣,有热情和自我驱动力,有一定的抗压能力和较强的团队协作精神。

以上职位满足以下至少一项条件者优先录用:

1、参加过天府杯、Pwn2Own等赛事,并成功攻破目标,作为CTF主力选手取得过优秀的成绩。

2、在有影响力的业界会议(学术/工业)上发表论文;

3、有独立挖掘漏洞的经验,获得过主流厂商的CVE编号;

4、通过使用/定制/自研工具发现有效漏洞;



安全研究员(Windows方向)(北京)

薪资:17-19k,15薪,具体可进一步沟通

投递方式:campus@360.cn



工作职责

1持续跟踪并深入分析最新的Windows平台漏洞,研究其根本原理、高级利用技术及有效的缓解措施。

2研究和复现野外流行的攻击手法、APT攻击中使用的先进技术,特别是针对杀毒软件、EDR等安全产品的绕过技术(如白利用、无文件攻击、内存驻留、EDR盲点等)。

3基于研究成果,设计和开发创新的威胁检测模型和主动防御方案,并将其工程化,落地到实际的安全产品中,提升产品的核心检测与防护能力。

任职资格

1计算机科学、信息安全、网络工程或相关专业本科及以上学历。

2精通C/C++编程,熟悉Python等脚本语言,具备扎实的Windows平台开发能力(如Win32 API, Native API)。

3熟练掌握x86/x64汇编语言,能够熟练使用IDA Pro, WinDbg, x64dbg等工具进行静态分析和动态调试。

4深入理解Windows操作系统内核机制,包括内存管理、进程/线程调度、对象管理、文件系统、驱动模型等。

5对主流的漏洞利用技术(如ROP, JOP, 堆利用等)及相应的防御和绕过技术(如ASLR, DEP, CFG bypass)有深入的理解。

6对安全研究抱有浓厚兴趣和热情,具备强烈的自我驱动力、好奇心和优秀的学习能力,能够独立解决复杂技术问题。
加分项(满足以下一项或多项者优先):

7有独立发现并分析过漏洞(有CVE编号者优先)的经验。

8有Windows内核驱动开发或内核安全攻防经验者优先。

9有反病毒、反外挂、EDR、HIPS等安全产品核心研发经验者优先。

10在知名安全会议或在安全社区、个人博客上发表过高质量技术文章者优先。

11在CTF竞赛中取得过优异成绩者优先。


前言

C

复制代码
现如今,各种恶意程序层出不穷,如何快速分析恶意程序的行为、节省安全从业人员的时间是一个问题。
幸好在当今大模型、智能体、MCP流行的时代,能够提供部分答案。

IDA Pro MCP 是一个AI驱动的反编译辅助工具,
通过MCP协议将IDA Pro与语言模型连接,旨在提升逆向工程效率。

它由三个主要组件组成:
IDA Pro 远程控制插件 (ida_remote_server.py):一个IDA Pro插件,创建一个HTTP服务器以远程控制IDA Pro功能。
IDA 远程客户端 (idaremoteclient.ts):一个TypeScript客户端,用于与IDA Pro远程控制服务器进行交互。
MCP 服务器 (index.ts):一个模型上下文协议服务器,向AI助手暴露IDA Pro的功能。

功能
从AI助手执行IDA Pro中的Python脚本
检索二进制文件的信息:
字符串、导入、导出函数
高级二进制分析功能:
1、在指令中搜索立即数
2、在二进制文件中搜索文本字符串
3、搜索特定的字节序列
4、获取地址范围内的反汇编代码
5、通过标准化接口自动化IDA Pro操作
6、组件之间的安全通信

环境搭建

Python环境

访问地址下载python 3.11.9版本。

下载地址:https://www.python.org/ftp/python/3.11.9/python-3.11.9-amd64.exe

下载好直接一键安装即可,这里是已经安装好了。所以显示这个界面

image.png



验证python是否安装成功

image.png



IDA Pro MCP

下载好IDA Pro9.0版本以上,并安装好

image.png



使用如下命令安装mcp

image.png



运行以下命令,将MCP插件安装到IDA Pro

image.png



Trae

访问下载Trae并安装好

下载地址:https://www.trae.cn/

image.png



输入命令查看config

image.png



然后在Trae的设置中找到MCP

image.png



把上面的config复制进去

image.png



然后创建智能体

image.png



并选中IDA Pro MCP

image.png



到此,已经基本配置好了。

分析过程

注意:在分析之前需要先脱壳,使用的FSG2.0的壳。这也是MCP目前的局限性

image.png



直接掏出脱壳工具进行一键脱壳

image.png



运行IDA并加载熊猫烧香病毒程序

注意:千万不要在物理机上误点击运行了,那么就难受了

image.png



在IDA插件功能里启动MCP,启动成功如下

image.png



Trae连接MCP

image.png



现在开始就是让MCP进行分析了

输入提示词:分析恶意程序的恶意行为

如下所示,提供输出熊猫烧香的行为操作

image.png



完整的恶意行为如下:

再输入提示词:输出进行每个恶意行为相关的函数以及地址

image.png



完整结果如下:从结果中可以看到不仅输出了进行恶意行为的函数以及地址,还给了交叉引用的函数。极大的提供了分析效率

恶意行为相关函数及地址映射

1持久化机制(Persistence)

image.png



2 传播机制(Propagation)

image.png



3 网络恶意行为(Network Activity)

image.png



4系统破坏(System Destruction)

image.png



5反杀毒软件(Anti-Antivirus)

image.png



6反分析技术(Anti-Analysis)

7文件操作(File Operations)

image.png



甚至能够协助获取到制作者遗留在病毒程序中的信息

image.png



具体函数分析

继续让MCP逐一分析各个函数。

sub_402DD8函数

提示词:提供sub_402DD8函数伪代码以及注释,说明

MCP反馈sub_402DD8 是一个 文件创建/打开函数 ,用于创建或打开文件,也可以获取标准输入/输出句柄。

- 文件创建 : 用于创建病毒副本、配置文件(如 autorun.inf )或其他恶意文件

- 持久化 : 可能用于创建启动脚本或配置文件以实现自启动

- 传播 : 结合 autorun.inf 和 setup.exe 字符串,用于在USB驱动器上创建传播文件

- 日志记录 : 可能使用标准输出句柄记录病毒活动

image.png



进入IDA验证是否一致,可以看到基本一致。

image.png



再分析一下其他几个相对重要的函数

sub_40C5E0函数

sub_40C5E0 是一个 网络下载函数 ,用于从指定的URL下载文件内容到内存缓冲区。

执行流程如下:

image.png



sub_40CDEC函数

sub_40CDEC 是一个 系统破坏函数 ,用于执行破坏性系统命令,删除网络共享并可能进行其他系统破坏操作。

主要执行的命令是:cmd.exe /c net share admin$ /del /y

image.png



sub_406E44函数

sub_406E44 是一个 反杀毒软件函数 ,用于删除多种杀毒软件的服务和注册表启动项,使杀毒软件失效。

执行流程如下:

image.png



病毒程序运行流程

病毒程序的运行流程如下:

完整执行流程图如下:

image.png









值得注意的是IDA Pro MCP并不能很好的分析从内存中释放的恶意载荷,因此还需要人工去动态调试这一部分




全是干货,笔者在使用IDA的过程,总结了很多场景下的使用,以下内容来自笔者+互联网总结。有些文章我不记得从哪看了,但是感谢大佬的分享。



Python条件断点与hook功能

目的:使程序在 rand返回值是16949时断下来,其他情况继续执行。让python脚本帮我们做。



导入脚本:



def bp():
rax = idc.get_reg_value('rax')
return rax == 16949

设置普通断点,在call rand()之后设置(此时能获取rand()函数的返回值)



[右键] --> [Edit Break ···]

[Condition] --> [···]



输入bp(),并选择语言为Python



运行样本程序,发现rax == 16949(0x4235)时断了下来



适用的情况:当达到条件时触发断点,然后执行脚本中的功能,然后继续运行程序。

总归还是一个很有用的技巧





IDA-Fork双进程调试法

fork的子进程特点:

无法直接启动调试,只能附加。

进程存在时间短,很可能执行完逻辑后就退出,开没开始附加进程就没了。

目的,想调试下面fork子进程的代码:



思路:

1将子进程的第一条指令patch为死循环

2循环处下断点,重新打开IDA附加子进程,恢复第一条patch后的指令,调试

步骤:

1fork调用处设置断点,断下来后,对子进程进行patch。

观察到第一条指令只是log输出,没什么用处。所以可以对<span class="ne-text">BL __android_log_print</span>指令进行patch:



patch后:(一个死循环,自己跳自己)





2f9使程序运行起来,再主线程Detach掉(取消附加)

3 然后死循环处下断点,重新附加子进程( 此时子进程由于死循环的关系,会一直存在



4子进程会断在死循环处:



5 最后使用SetIP跳出死循环到需要调试的代码上,就可以与愉快的调试子进程了:







IDA编写脚本语法提示

日常逆向,肯定需要编写IDA脚本,在vscode进行编写,如果有提示,那就很方便了

vscode 安装插件 idacode

配置环境变量



然后就可以获得提示啦:







堆栈不平衡-报错修复技巧

// positive sp value has been detected, the output may be wrong!

打开IDA设置









设置为0,就OK了





IDA Trace功能











Trace 的粒度:



第一个是指令级别的trace,就是记录的是每条指令的指令。

第二个是基本块的trace,基本块的概念 ollvm 里面有,可以找下文档。

第三个是函数级别的trace,仅仅记录函数的调用。

运行然后卡在断点处时,这个选项就可以选了



我们停止调试,打开 trace 窗口看看,打开菜单项 [Debugger] → [Tracing] → [Tracing Window] 查看 Trace 记录:



将这些数据导出,可以直接右键 export trace to text file,以文本模式导出来,这样可以直接用 python 处理,比较方便。











鼠鼠因逆向教务系统,被校方误以为网络攻击 (马上要报警),差点被记过继续讨论:

佬友的这个帖子让我想起以前本科的一些类似的有趣事情。

第一件事是我参加比赛认识的一个师弟干的。
他在参加某比赛的时候在宿舍用校园网去爬了某政府网站上的统计数据,刚开始爬的当天下午学校网管和警察就直接敲开他的宿舍门了。
该政府网站的工作人员认为收到了网络攻击,于是找了网警,网警定位到了 IP 是我们学校,打电话找学校网管,因为没有做任何遮掩,所以学校网管直接定位到宿舍然后上门了。
后面是因为理由正当,没有造成严重后果,口头警告一下就过了。
这件事对当时我的我造成了很大冲击,因为我当时正在参加学院和某企业合作的一个项目,通过爬各种新闻网站、论坛的评论区来做舆情分析。虽然这个项目有一定政府背景,但当时我写爬虫测试的时候都是用的自己的电脑,唯一想到要用代理池的原因是爬太多被封 IP 不能继续测试…
我一个不太靠谱的师兄在拉我们进这个爬虫项目的时候信誓旦旦地说,学会了爬虫就不怕吃不饱饭了,因为他有一个同学,毕业之后靠写爬虫爬数据去卖,一天能赚 100 多。我一开始还傻傻觉得挺有道理。后面想起来,觉得这只是当时的法规不成熟,放现在分分钟出事。
结合佬友的故事,各位同仁学、用爬虫的时候需谨慎

第二个事情是想吐槽一下高校纸糊一样的网络系统。
我们本科的时候有一门忘记干嘛的公选课,第一天上课老师就让我们要经常登录某个学校部门自己搭的网站,学期末的时候会根据登录次数来算平时分。
我们研究之后发现那个网站的登录系统完全是纸糊的,除了账号密码之外不做任何校验,甚至连登录都是一次性的,就是它不记录你的登录状态,你关闭网站再打开就是注销状态了。
为了刷登录次数,我有同学用脚本精灵做了个脚本去点。我则用 python 写了个代码去刷,经历了第一件事之后,我还专门把登录间隔设大一点,爬刷出问题。后来发现完全没有关系,系统完全不在乎这些事情。
想起来挺好笑的。


📌 转载信息
原作者:
linyopt
转载时间:
2026/1/14 11:05:06


第三届“数信杯”数据安全大赛数据安全个人赛初赛

数据安全

第四题

题目描述:工程师小王为了保证数据的安全存储,开发了对数据处理的程序,但这样的处理方式安全吗?分析程序功能,解密文件获取原始数据,提交第6行第2列数据。

IDA打开程序



Base64解密即可,第六行数据

MjU3MTA4NzYwNDAgNzE2ODk2MTk4ODI5MDM3NDkzIGFkNzg2MkBiNy5jb20K



答案:716896198829037493

第五题

题目描述:工程师小王认识到前面开发的程序并不能保证对数据的安全存储,现在对处理程序进行了改进,这次能行吗?分析程序功能,解密文件获取原始数据,提交第8行第2列数据。



程序re1e97e14f是64位ELF可执行文件(Linux x86-64,stripped)。通过静态分析确定程序结构:

入口点_start位于0x401190,通过__libc_start_main调用main函数。main函数位于0x401579,负责文件读写和调用核心加密函数。核心加密函数sub_401276位于0x401276,实现三阶段加密处理。

程序执行流程:读取./info_81bedab.ori → 三阶段加密 → 输出./info_81bedab.ori.en

Stage A - 位运算变换(sub_401276内,地址0x4012FE~0x401360):

Stage B - RWX自解密代码执行(sub_401276内,地址0x401360~0x401450):

关键函数调用序列:

0x401368: call malloc(0x1000) 申请4KB内存

0x401380: call mprotect(page, 0x1000, 7) 设置RWX权限

0x4013A0: 从.data段地址0x404060复制0x84(132)字节代码块到RWX页

0x4013B8: 获取密钥 state = (uint16_t)(buf + 0x339)

0x4013D0: 循环调用RWX代码处理每个字节

0x84字节代码块结构(位于.data段0x404060):

解密后的变换代码(key=0x6E72解密后):

等效变换函数:

Stage C - 循环XOR(sub_401276内,地址0x401450~0x4014A0):

解密算法:

Stage C逆操作:cipher XOR "e6911c24" → B[]

从B[0x339]=0xEB, B[0x33A]=0xAB约束搜索Stage B密钥,得到key=0x6E72

Stage B逆操作:通过逆映射表还原 → A[]

Stage A逆操作:A[i] >> 1 → plaintext[]

验证:A[0x339]=0x72, A[0x33A]=0x6E,与key一致

解密成功

答案:878052199921046799

第六题



题目给出一个SQLite数据库文件,提示在Freeblock空闲块中隐藏了自定义链表数据。首先连接数据库查询sys_config表获取三个关键配置:


入口指针格式为"物理页号:偏移",页号0x13B=315,偏移0x4F0=1264,该偏移已跳过Freeblock的4字节头部

链表节点结构为大端序,NextPage占4字节,NextOff占2字节,Len占2字节

加密方式为使用当前物理页号的大端4字节表示循环异或

SQLite文件头偏移16-17处读取页大小为4096字节。链表遍历算法:从入口页315偏移1264开始,读取8字节头部解析出NextPage、

NextOff、Len,然后读取Len字节的加密数据,用struct.pack('>I', current_page)生成4字节密钥循环XOR解密。当NextPage=0且

NextOff=0时链表结束。

解密拼接后得到完整SQL脚本:



执行该SQL查询得到container_id=CN2888991777license_plate=粤B-52816,按题目要求提取container_id和license_plate后五位数字

用下划线连接。

答案:CN2888991777_52816

第七题

题目实现了一个存在漏洞的AES-CBC加密,核心代码如下:

漏洞在于hint泄露了key与message前16字节的异或值。

对于38字节的flag,自定义padding函数会在前面添加10个\x0a字节,得到48字节。PKCS7填充后变成64字节(4块)。

消息结构为:

Block 0: \x0a*10 + flag[0:6]

Block 1: flag[6:22]

Block 2: flag[22:38]

Block 3: \x10*16

由于flag[:5]=b'flag{'已知,只需爆破flag[5]一个字符即可恢复完整key。验证方法是检查解密后最后一块是否为\x10*16。

利用CBC模式特性,后续块使用前一块密文作为IV解密,可恢复完整flag。

答案:flag{IADMIN-TOP-18880101-7634567_2025}

第八题

题目提供损坏的RSA私钥key_pri.pem和加密用户数据encrypted_users.csv。解析私钥DER编码发现大量参数被零填充,属于"变异RSA"私钥恢

复问题。

私钥ASN.1结构解析:

从dp字段提取p的部分高位(496位已知,低48位为0):

p_high =

0x9d025160d56d4971363f3cf2ce7e3e96215c50bf50d0cc606f5645de7ec113d16d931383e649bc2c7328499d219e2982b726ae41c5370

aa8000000000000

使用Coppersmith小根攻击恢复p的完整值。设p = p_high + x + y*2^496,其中x为低位未知部分(约48位),y为高位修正(约16位)。构

造格基,利用LLL算法求解满足p | n的小根。

cuso库求解代码:

恢复完整p =

0xf5e49d025160d56d4971363f3cf2ce7e3e96215c50bf50d0cc606f5645de7ec113d16d931383e649bc2c7328499d219e2982b726ae41c

5370aab851b8a28df37

验证:n mod p = 0,p为512位素数。计算q = n/p,d = e^(-1) mod (p-1)(q-1),构建RSA私钥,使用PKCS1_OAEP解密查找目标记录。

答案:294_010880753296303612_5108757973927325

第九题



答案:S20251001

第十题

题目提供了三个文件:secret_image.png(隐写图片)、multimodal_model.pth(PyTorch模型权重)和stego_hint.txt(提示文件)。

根据提示文件,隐写规则如下:

1图片的R通道中隐藏了模型输入特征

2取图片左上角前20个像素的R值,计算 R值 mod 10 得到20维特征向量

3将20维特征输入MLP模型,输出数值四舍五入取整即为flag的ASCII码

4ASCII码转换为字符得到完整flag

关键点在于"左上角前20个像素"的取法:按扫描顺序取第一列从上到下的20个像素(x=0, y=0..19)。

模型结构为3层全连接神经网络(MLP):20->64->32->27,使用ReLU激活函数。输出27维向量对应flag的27个字符。

答案:flag{A12I_shu1xin2bei_2025}

数据分析

数据应急

题目背景: 一家科技公司服务器被黑客入侵,重要文件被窃取并删除。需要根据系统自动备份的残存内容进行溯源分析。

第一题



三个文件全部导出



答案:HT-2025-001234

第二题

解压压缩包,得到一个内存镜像

非预期

直接搜索flag{



预期解



发现有C:\Program Files\TrueCrypt\TrueCrypt.exe

Elcomsoft Forensic Disk Decryptor挂载

加载内存镜像先搜索一下key

保存1.evk



成功挂载



答案:flag{33c3789a36bb61beb6d4268cd7d13038}

第三题

过滤响应200的包



最后一个包发现是exe程序



导出来看看

解包

找到一个exfiltrator_balanced.pyc

反编译

该程序是一个基于 ICMP 协议的隐蔽数据外带工具,通过将文件切分为 224 字节的数据块并伪装成 Windows Ping 流量发送。其核心安全机

制包含三个部分:
程序运行时会生成一个随机的 16 字节 CryptoSeed 和一个基于时间的 ScrambleSeed(用于乱序)。利用 PBKDF2-HMAC-SHA256 算

法,结合 CryptoSeed 和两组被混淆和硬编码的盐值(b'Bloodharbor!2024'b'Silent_Update!!!'),迭代 10,000 次分别派生出两

层加密所需的 32 字节密钥。
每个数据块首先添加 4 字节大端序长度头,然后使用 ChaCha20-Poly1305 进行内层加密(Layer 1),输出包含 Nonce、密文和 Tag。接着

对 Layer 1 的完整结果使用 AES-256-GCM 进行外层加密(Layer 2),同样输出 Nonce、密文和 Tag,确保了数据的机密性与完整性。
程序首先发送包含种子的元数据块(以 EX1L 开头)。为了对抗流量分析,它利用 ScrambleSeed 初始化随机数生成器,对所有数据块的发

送顺序进行全随机打乱(Shuffle)。发送时,每个 ICMP 包的 Payload 前部填充 16 字节的伪造 Windows Ping 数据,并使用复杂的线性同

余算法生成伪随机的 ICMP ID 和序列号,使得流量在外观和统计特征上极难被识别。



打开流量包,发现流量包含有大量 ICMP 请求,其中部包含 EX1L 标志的 Payload,确认为数据外带。提取 EX1L 元数据块,获取 Crypto

Seed 和 Scramble Seed。加密机制为双层加密:首先是 ChaCha20-Poly1305 (Layer 1,带 4 字节长度头),其次是 AES-GCM (Layer 2)。密

钥由 PBKDF2 基于 Crypto Seed 和硬编码盐值生成。数据块顺序经过混淆,需利用 Scramble Seed 初始化随机数生成器并还原顺序。编写脚

本提取 ICMP Payload,还原顺序并依次解密 Layer 2 和 Layer 1,拼接后得到一个 ZIP 文件。

解压得到100张图片



写一个脚本OCR识别18316978925

[+] 找到目标: person_086.png



答案:江苏省南京市鼓楼区西湖路200号梧桐里15栋4单元101室

数据分析

背景描述

随着维真科技(VerityTech)业务规模的不断扩张,公司积累了大量内部 PDF 文档,包括重要的研发资料、业务报告、内部制度说明等。在长期

的运作过程中,由于文档管理规范不完善、缺乏统一的安全策略,公司文档的安全风险逐渐显现。

近期,公司文档服务器遭遇未知勒索程序攻击。部分 PDF 文件被加密无法打开,系统中还出现可疑链接的文档,疑似为攻击入口。同时,安

全团队在受感染终端中提取到了一份可疑的可执行程序(exe 文件),推测为勒索程序主体。

为了定位安全漏洞、恢复文档数据、查明攻击来源,公司启动了"文档安全事件分析"专项工作。本题给出攻击样本、加密文档及疑似钓鱼

PDF 文档,请你协助安全团队进行取证分析、密钥恢复、数据解密以及钓鱼链接识别。

相关信息

公司合法域名为:

其余域名均视为可疑链接,需重点审查。

第一题

通过file命令识别en.exe为Windows PE可执行文件,使用strings发现Python相关字符串,判断为PyInstaller打包程序。使用pyinstxtractor.py

解包后,在en.exe_extracted/key/目录下发现RSA密钥对文件pr.pem和public_key.pem。读取pr.pem文件内容,定位-----BEGIN PRIVATE

KEY-----标记位置,提取其后的32位字符即为答案。

答案:MIIEvgIBADANBgkqhkiG9w0BAQEFAASC

第二题

反编译

分析解包后的pyc文件,发现加密流程采用混合加密机制:使用RSA-OAEP(SHA256)加密AES密钥并保存到store.key,使用AES-256-ECB模

式对PDF文件进行加密。解密流程为:首先使用提取的RSA私钥pr.pem通过PKCS1_OAEP(SHA256)解密store.key获取AES密钥,然后使用

AES-ECB模式解密PDF文件并去除PKCS7填充,最后计算解密后文件的MD5值。

答案:52fd2cb4fc43eceb3c79233038bb5f42

第三题

使用PyMuPDF遍历999份解密后的PDF,提取PDF Annotation超链接中的URI。合法域名为veritytech.com及其子域名*.veritytech.com,排

除.local和.internal等内部域名后,筛选出所有指向外部非法域名的钓鱼URL。同时检查URL参数中的跳转地址(redirect/next/url等参数)。

过滤掉包含非ASCII字符的无效URL,将所有钓鱼URL按字典序升序排序后用逗号拼接,计算MD5值。

答案:0a16f1ca5e8db1270074d0d39f6edeaf

数据审计

背景描述

某公司运维团队在日常安全巡检过程中发现系统存在异常访问和潜在入侵迹象。经初步技术研判,问题可能与公司用于关键服务器相关。该

服务器被确认存在一定安全风险,但目前尚无法确定攻击者是否已成功获取其中的证书信息。

为进一步排查与分析潜在的数据泄漏情况,运维团队已导出该服务器的所有网络流量文件,请根据流量包文件分析并回答以下问题。

第一题

题目提供了params.csv文件,包含500组RSA参数(id, e, p, q)。需要根据id=285的参数合成RSA私钥,然后遍历所有pcap文件,提取TLS证

书中的公钥模数n,与id=285计算得到的n(n = p * q)进行匹配,找到对应的流量包。具体步骤:首先读取params.csv获取id=285的e、p、

q参数,计算n = p * q;然后遍历pcap文件,解析其中的X.509证书,提取RSA公钥的模数n;最后比对两个n值,相等则说明该pcap使用了

id=285对应的证书。

答案:mAqY0WRHsV.pcap

第二题

需要使用params.csv中的RSA参数生成私钥,然后用私钥解密TLS加密的流量包,获取HTTP明文数据。具体步骤:首先根据e、p、q计算私

钥参数d = e^(-1) mod (p-1)(q-1),生成PEM格式私钥文件;然后遍历每个pcap文件,提取证书中的公钥模数n,匹配对应的私钥;使用

tshark配合私钥解密TLS流量,提取HTTP请求体;解密后的数据为POST请求到/api/v1/user/profile,请求体为hex编码的JSON,包含

username和phone字段;遍历所有解密结果,查找username为"王梅"的记录,获取其phone字段。

答案:13930079365

第三题

系统在请求包中设置了Authorization头部字段,使用JWT进行身份认证。JWT的payload中包含username和phone信息,而请求体中也包含

相同字段。越权访问的判断标准是:JWT中的用户信息与请求体中的用户信息不一致。具体步骤:解密所有流量包获取HTTP明文;提取

Authorization头部中的JWT token;JWT由三部分组成(header.payload.signature),对payload部分进行Base64URL解码获取JSON数

据;同时解析请求体中的hex编码JSON数据;比较JWT payload中的username和phone与请求体中的username和phone;若不一致则判定为

越权访问,统计越权账号总数。

答案:5

目前只有プリンセスコネクト!Re:Dive 无法 dump,这玩意的 crackproof 不知道改了什么东西,会把完整的 PE 切成几百个分页,不过可以分析安卓版本的,壳子难度中等。
由于 Unity 的源代码得买,所以这里只能用反编译器 + pdb 来分析

LoadScriptingRuntime 这个函数加载了 GameAssembly.dll,相关的加载逻辑在 LoadIl2Cpp 里面,LoadIl2Cpp 的返回值是 GameAssembly.dll 的 handle

解法就很明显了,可以用 frida 拦截 LoadIl2Cpp 返回时候的动作,这时候 GameAssembly.dll 刚刚被 LoadLibraryW 加载上去,并且完成了一些初始化(crackproof 修复导入表,解密解压代码段等等),但是没有执行任何 il2cpp 部分的代码,dump 下来就能获得完全干净的 GameAssembly.dll 了。
dump 下来以后还需要简单的修复一下 PE 头,完整代码如下:

'use strict';

const UNITY_PLAYER = "UnityPlayer.dll";
const TARGET_RVA = ;
const GAMEASSEMBLY = "GameAssembly.dll";
const DUMP_PATH = "D:\\Reverse\\Frida_Hook\\GameAssembly_dump_fix.dll";
const CHUNK_SIZE = ;


function dumpModule(moduleName, outPath) {
    try {
        const m = Process.getModuleByName(moduleName);
        console.log("[*] Found module:", m.name, "Base:", m.base, "Size:", m.size);

        const size = m.size;
        const base = m.base;

        // raw→virtual const localCopy = fixPEHeader(base, size);
        if (localCopy === null) {
            console.error("[!] Fix PE Header failed");
            return;
        }

        const file = new File(outPath, "wb");
        console.log("[*] Output:", outPath);

        let offset = 0;
        while (offset < size) {
            const chunk = Math.min(CHUNK_SIZE, size - offset);
            const buf = localCopy.add(offset).readByteArray(chunk);
            file.write(buf);
            offset += chunk;
        }

        file.flush();
        file.close();
        console.log("[*] Dump finished:", outPath);

    } catch (e) {
        console.error("[!] Dump exception:", e);
    }
}

function hookAfterUnityPlayerLoaded(module) {
    if (module.name !== UNITY_PLAYER) return;
    console.log("[+] UnityPlayer.dll loaded @", module.base);

    const targetAddr = module.base.add(TARGET_RVA);
    console.log("[*] Hooking LoadDynamicLibrary @", targetAddr);

    Interceptor.attach(targetAddr, {
        onLeave(retval) {
            console.log("[*] LoadDynamicLibrary returned:", retval);

            try {
                const found = Process.findModuleByName(GAMEASSEMBLY);
                if (found) {
                    console.log("[*] GameAssembly.dll loaded -> dumping...");
                    dumpModule(GAMEASSEMBLY, DUMP_PATH);
                } else {
                    console.warn("[!] GameAssembly.dll not found yet");
                }
            } catch (e) {
                console.error("[!] Dump error:", e);
            }
        }
    });
}


function fixPEHeader(base, size) {
    try {
        const localBuf = Memory.alloc(size);
        Memory.copy(localBuf, base, size);

        const dos = localBuf.readPointer();
        const e_lfanew = localBuf.add().readU32();
        const nt = localBuf.add(e_lfanew);

        const numSections = nt.add().readU16();
        const optSize = nt.add().readU16();
        const firstSec = nt.add( + optSize);

        console.log("[*] Sections:", numSections, "First section @", firstSec);

        let secPtr = firstSec;
        for (let i = 0; i < numSections; i++) {
            const virtualAddress = secPtr.add(0xC).readU32();
            const virtualSize = secPtr.add().readU32();

            // 把 raw data 指向 virtual
            secPtr.add().writeU32(virtualAddress);       // PointerToRawData
            secPtr.add().writeU32(virtualSize);          // SizeOfRawData

            secPtr = secPtr.add(); // 下一节
        }

        return localBuf;

    } catch (e) {
        console.error("[!] fixPEHeader exception:", e);
        return null;
    }
}


setImmediate(() => {
    console.log("[*] Script started.");

    Process.attachModuleObserver({
        onAdded(module) {
            console.log("[*] Module loaded:", module.name);
            if (module.name === UNITY_PLAYER) {
                hookAfterUnityPlayerLoaded(module);
            }
        },
        onRemoved(module) { }
    });

    try {
        const existing = Process.getModuleByName(UNITY_PLAYER);
        if (existing) hookAfterUnityPlayerLoaded(existing);
    } catch (e) { }
});

由于 crackproof hook 了自身的 openprocess 并且进行的 handle 权限过滤,frida-server 是肯定不行了,但是 Windows 这玩意相当开放,有以下方法能把 frida-gadget.dll 塞进去:

  1. 劫持 version.dll
  2. 修改 UnityPlayer.dll 的导入表,把 frida-gadget.dll 导出表的任意函数塞进去。
  3. 搓一个 ring0 驱动,从内核用 APC 方法把 frida-gadget.dll 强行塞进去。

frida-gadget.dll 塞进去了以后还需要写一个配置文件,名称命名为 frida-gadget.config

{
  "interaction": {
    "type": "script",
    "path": "D:\\Reverse\\Frida_Hook\\crackproof\\1.js"
  }
}

这样 frida-gadget.dll 加载后就能自动执行脚本,手动连接执行肯定是来不及的,因为 GameAssembly.dll 加载时机非常早。

对于ウマ娘 プリティーダービー这种会检查目录下面有没有多余的 dll,可以把带 crackproof 但是不检查 dll 的启动器复制过去,然后就能随意改导入表了。(不带 crackproof 不检查 dll 的启动器貌似不行,疑似启动器上面的壳子有额外检测)


📌 转载信息
转载时间:
2026/1/12 17:05:44

原项目地址:GitHub:GitHub - TheSmallHanCat/flow2api: 无限次数的 banana pro!逆向账号池,支持负载均衡、AT 自动刷新、缓存策略、代理等。Q 交流群 1073237297
原帖地址:[Flow2api] 无限次数的 banana pro!逆向账号池,支持负载均衡、AT 自动刷新、缓存策略、代理等

发帖原因是因为自己折腾了好久飞牛 nas-docker 安装后总有一些问题。
后来用 ai 改了下可以直接部署到 huggingface.co(抱脸)space,下面是具体步骤
第 1 步复制空间:
【小白教程 huggingface.co 搭建 [Flow2api] 】无限次数的 banana pro!逆向账号池1

第 2 步:复制后会提交部署

第 3 步:获取项目访问网址

默认账号密码:admin/admin
第 4 步:安装浏览器脚本(出现提取错误请将 http 改成 https)

其他对应后台里面提示设置就好了,这个仅针对小白,有不懂的可以问,但是可能你问我我也解决不了啥,有能力的还是直接用原作者 @ TheSmallHanCat 的项目。
关于提取错误:将 http 改成 https
关于 403:无头打码不稳定 最稳定目前应该是 https://yescaptcha.com/ 有 1500 积分可用


📌 转载信息
转载时间:
2026/1/12 16:40:43

先上链接 GitHub - map-A/A-stock-level1-dump

与传统的数据下载方式不同( 看到别人卖数据好贵啊,bushi),该方式是直接将海 x 证券的 tcp 数据解码后保存为 csv。

该 python 代码是个研究代码,可以将单个股票单个交易日 dump 为 csv 文本,单个股票单个交易日数据下载大约 8-10s,本地自测。这个速度不太好用,如有需要的, 佬们可以让 ai 基于此研究代码一个高性能的版本。我自己有一版本的 rs 实现,用于批量 dump 所有股票数据,但是不太好拆出来,5000 个股票单日数据保存到数据库大约是 200s,如有需要后续可以继续整理开源。

动机:之前在网上看到的 xxshare 基本上都要付费,积分,并且回看历史分钟 k 线很受限制,好像 60 日之前的 k 线就看不了了。后来在 window 的海 x 证券的终端复盘,看到历史回放,这功能可以看到很久以前的交易历史快照。于是乎就想到能不能将这个数据 dump 下来,自己再合成分钟级 k 线,或者做其他事情。

之后就是 tcp 捕获数据包 + 尝试解密算法,逆向算法。细节部分可以查看 py 代码。如有问题可以向我提问。

大家多多 star 。


📌 转载信息
原作者:
map_a
转载时间:
2026/1/5 13:22:14

今天某个我觉得很好用的一站式 SSH、数据库软件 Hexhub
遂用 cc 捣鼓出了一个注册会员的小工具 HexhubKeygen
注:后续软件热更新会掉签

过程可能需要安装 mitmproxy 证书
如果出现 Client TLS handshake failed. The client does not trust the proxy’s certificate for hexhub.cn (OpenSSL Error ([(‘SSL routines’, ‘’, ‘ssl/tls alert certificate unknown’)])) 异常 根据提示删除证书后重试


📌 转载信息
原作者:
youcaizhang
转载时间:
2025/12/29 12:30:12