检查AE,PE, CE 状态是否正常

本文介绍了在完成IBM FileNet安装配置后,如何检查AE、PE、CE组件是否安装正确并能正常启动。包括启动方法及状态检查URL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Install & Config 完 IBM FileNet之后,一个重要的事情就是check所安装的AE,PE,CE是否安装正确、能够正常启动。 这里,简要列出一些check方法。

1. 启动 CE DB .
与CE有关的一般有两个 DB。 一个 是 FNGCDDB用于记录 CE Domain的一些配置信息。 主要有以FNGCD为 prefix 的四个表(FNGCD, FNGCD_ADDON, FNGCD_CESERVERS, FNGCD_OSCBROWNERS)。 当你有需要想重新建立CE Domain的时候,最好将这四个表删掉,然后重新建。
再一个DB就是 Object Store所在的DB,比如FNOS1DB. 在这个DB中,在建完Domain之后共有179张表。

值得注意的是,CE App Server是通过 DataSource来连接CE的DB的。所以,如果,有任何CE DB的改变,也同时需要更改DataSource。 显而易见,因为有两个 CE DB,所以也有两套CE DataSource, 一个是用于连接 FNGCDDB(还有个以XA结尾的,这个在运行时经常被用到),一个是用于连接FNOSDB,即Object Store DB。CE 就是靠这两个Source来取得CE 信息的。

Check CE 状态的方法:
http://localhost:9080/FileNet/Engine.

2. 启动 AE。
由于 AE是一个 WebApp 程序,所以只需要启动 AE所在的 Server即可。

Check AE 状态的方法:
http://localhost:9080/Workplace

3. 启动 PE
PE 核心是一个 C++程序。在运行时, AE会尝试连接 PE,CE,而PE和CE之间也有连接关系。

Windows based 的PE server需要注意有两个系统 Service(通过 Service.msc)是需要起来的。 一个 叫 PE Service Manager,一个是Img ControlService;需要检查;

再有一个 重要的命令是 initfnsw,可以通过这个命令来起停 PE server。

① initfnsw start //-启动PE
② initfnsw stop //-停止PE
killfnsw -y //-停止PE
③ initfnsw status //-查看PE状态
④ initfnsw restart //-重启PE

另外, 检查 PE的状态,可以用这个URL 来 check,

http://localhost:32776/IOR/ping.

另外,有关 PE 和 CE间连接性的检查方法:

在 PE所在 Server上,用如下URL check,

http://localhost:32776/IOR/FileNet.CE.PEDirectoryServer
上面的汇编是 00000001408875A4 ; __int64 __fastcall DbgkpPostFakeThreadMessages(PEPROCESS targerPorcess, PDEBUG_OBJECT debug_object, PETHREAD Thread, PETHREAD *OutThread, PETHREAD *OutThread2) 00000001408875A4 DbgkpPostFakeThreadMessages proc near ; CODE XREF: DbgkpPostFakeProcessCreateMessages+54↑p 00000001408875A4 ; DbgkpSetProcessDebugObject+E4↓p 00000001408875A4 ; DATA XREF: ... 00000001408875A4 var_1F8 = qword ptr -1F8h 00000001408875A4 var_1E8 = byte ptr -1E8h 00000001408875A4 var_1E7 = byte ptr -1E7h 00000001408875A4 var_1E4 = dword ptr -1E4h 00000001408875A4 PROCESS = qword ptr -1E0h 00000001408875A4 var_1D8 = qword ptr -1D8h 00000001408875A4 var_1D0 = qword ptr -1D0h 00000001408875A4 var_1C8 = qword ptr -1C8h 00000001408875A4 var_1C0 = qword ptr -1C0h 00000001408875A4 var_1B8 = qword ptr -1B8h 00000001408875A4 var_1B0 = qword ptr -1B0h 00000001408875A4 var_1A8 = qword ptr -1A8h 00000001408875A4 var_1A0 = qword ptr -1A0h 00000001408875A4 var_198 = qword ptr -198h 00000001408875A4 var_190 = qword ptr -190h 00000001408875A4 var_message = _DBGKM_APIMSG ptr -188h 00000001408875A4 ApcState = _KAPC_STATE ptr -78h 00000001408875A4 var_48 = qword ptr -48h 00000001408875A4 OutThread2 = qword ptr 28h 00000001408875A4 ; __unwind { // __GSHandlerCheck_SEH 00000001408875A4 mov r11, rsp ; 保存原始栈指针 00000001408875A7 push rbx ; 保存非易失寄存器 00000001408875A8 push rsi 00000001408875A9 push rdi 00000001408875AA push r12 00000001408875AC push r13 00000001408875AE push r14 00000001408875B0 push r15 00000001408875B2 sub rsp, 1E0h ; 分配栈空间 (480字节) 00000001408875B9 mov rax, cs:__security_cookie ; 安全Cookie检查初始化 00000001408875C0 xor rax, rsp ; 计算安全Cookie 00000001408875C3 NtWaitForDebugEvent$filt$0_0: ; 存储安全Cookie 00000001408875C3 mov [rsp+218h+var_48], rax 00000001408875CB mov [rsp+218h+var_1C0], r9 ; 保存第4个参数 (OutThread) 00000001408875D0 mov rbx, r8 ; 保存第3个参数 00000001408875D3 mov [rsp+218h+var_1D0], rdx ; 保存第2个参数 (DebugObject) 00000001408875D8 mov r14, rcx ; 保存第1个参数 (TargetProcess) 00000001408875DB mov [rsp+218h+PROCESS], rcx ; 再次保存TargetProcess 00000001408875E0 mov [rsp+218h+var_1A0], rcx 00000001408875E5 mov [rsp+218h+var_198], rdx 00000001408875ED mov rsi, r8 ; rsi = 第3个参数 00000001408875F0 mov [rsp+218h+var_190], r9 00000001408875F8 mov rax, [rsp+218h+OutThread2] ; 获取第5个参数 (栈传递) 0000000140887600 DbgkQueueUserExceptionReport_0: ; 保存第5个参数 0000000140887600 mov [rsp+218h+var_1B8], rax 0000000140887605 xorps xmm0, xmm0 ; 初始化APC状态结构 0000000140887605 ; 清零XMM0寄存器 0000000140887608 movups xmmword ptr [r11-78h], xmm0 ; 清零ApcState结构 000000014088760D movups xmmword ptr [r11-68h], xmm0 ; Move Unaligned Four Packed Single-FP 0000000140887612 movups xmmword ptr [r11-58h], xmm0 ; Move Unaligned Four Packed Single-FP 0000000140887617 xor edx, edx ; 初始化局部变量内存 0000000140887617 ; 清零作为memset参数 0000000140887619 mov r8d, 110h ; 设置大小 (272字节) 000000014088761F lea rcx, [r11-188h] ; 目标地址 0000000140887626 call memset ; 调用内存清零函数 000000014088762B xor r15d, r15d ; 初始化变量 000000014088762B ; r15d = 0 000000014088762E mov [rsp+218h+var_1D8], r15 ; 清零局部变量 0000000140887633 xor edi, edi ; edi = 0 0000000140887635 mov rax, gs:KPCR.kprcb.CurrentThread ; 获取当前线程 0000000140887635 ; 获取当前ETHREAD 000000014088763E mov [rsp+218h+var_1B0], rax ; 保存当前线程指针 0000000140887643 mov r12d, 0C0000001h ; 预设错误码 STATUS_UNSUCCESSFUL 0000000140887649 test rbx, rbx ; 检查第3个参数是否为NULL 000000014088764C jz short loc_140887669 ; 如果为NULL则跳转 000000014088764E mov r15, rbx ; 处理非NULL的线程参数 000000014088764E ; r15 = 输入线程 0000000140887651 mov [rsp+218h+var_1D8], rbx ; 保存到局部变量 0000000140887656 mov r14d, 'OgbD' ; 设置对象标签 'DBg' 000000014088765C mov edx, r14d ; Tag 标签作为参数 000000014088765F mov rcx, rbx ; Object 对象指针 0000000140887662 call ObfReferenceObjectWithTag ; 增加对象引用计数 0000000140887667 jmp short loc_14088767C ; 跳转到公共代码 0000000140887669 ; --------------------------------------------------------------------------- 0000000140887669 loc_140887669: ; CODE XREF: DbgkpPostFakeThreadMessages+A8↑j 0000000140887669 xor edx, edx ; 处理线程参数为NULL的情况 (遍历进程线程) 0000000140887669 ; 从第一个线程开始遍历 000000014088766B mov rcx, r14 ; TargetProcess 000000014088766E call PsGetNextProcessThread ; 获取进程第一个线程 0000000140887673 mov rbx, rax ; rbx = 当前线程 0000000140887676 mov r14d, 4F676244h ; 设置对象标签 'DBg' 000000014088767C loc_14088767C: ; CODE XREF: DbgkpPostFakeThreadMessages+C3↑j 000000014088767C mov [rsp+218h+var_1C8], rbx ; 公共代码路径 000000014088767C ; 保存当前线程 0000000140887681 test rsi, rsi ; 检查第3个参数 0000000140887684 setz r13b ; 如果为NULL则r13b=1 0000000140887688 mov [rsp+218h+var_1E8], r13b ; 保存标志 000000014088768D loc_14088768D: ; CODE XREF: DbgkpPostFakeThreadMessages+3AC↓j 000000014088768D test rbx, rbx ; 线程遍历主循环 000000014088768D ; 检查当前线程是否有效 0000000140887690 jz loc_1408878D1 ; 如果无效跳转到结束 0000000140887696 test rdi, rdi ; 释放前一线程对象 0000000140887696 ; 检查前一线程指针 0000000140887699 jz short loc_1408876A6 ; 如果为空则跳过 000000014088769B mov edx, r14d ; Tag 标签参数 000000014088769E mov rcx, rdi ; Object 线程对象 00000001408876A1 call ObfDereferenceObjectWithTag ; 减少引用计数 00000001408876A6 loc_1408876A6: ; CODE XREF: DbgkpPostFakeThreadMessages+F5↑j 00000001408876A6 mov rdi, rbx ; 处理当前线程 00000001408876A6 ; 保存当前线程到rdi 00000001408876A9 mov [rsp+218h+var_1A8], rbx ; 保存到局部变量 00000001408876AE mov edx, r14d ; Tag 标签参数 00000001408876B1 mov rcx, rbx ; Object 当前线程 00000001408876B4 call ObfReferenceObjectWithTag ; 增加引用计数 00000001408876B9 test dword ptr [rbx+74h], 400h ; 检查线程状态标志 00000001408876B9 ; 检查ThreadFlags+0x74 00000001408876B9 ; ULONG SystemThread:1; //0x74 00000001408876C0 jnz loc_14088793B ; 如果置位则跳过此线程 表示它是系统线程 00000001408876C6 mov eax, [rbx+_ETHREAD.___u21.CrossThreadFlags] ; 读取Thread->CrossThreadFlags 00000001408876CC test al, 2 ; 表示线程是否已经被插入到进程的线程列表中。当线程被创建并成功插入时,此标志被设置 00000001408876CE jnz short loc_1408876EB ; 如果已设置则继续 00000001408876D0 mov rdx, [rsp+218h+var_1B0] ; 同步线程插入操作 00000001408876D0 ; 当前线程 00000001408876D5 mov rcx, rbx ; 目标线程 00000001408876D8 call PsSynchronizeWithThreadInsertion ; 等待线程可用 00000001408876DD mov eax, [rbx+510h] ; 再次读取CrossThreadFlags 00000001408876E3 test al, 2 ; 表示线程是否已经被插入到进程的线程列表中。当线程被创建并成功插入时,此标志被设置 00000001408876E5 jz loc_14088793B ; 如果未设置则跳过线程 00000001408876EB loc_1408876EB: ; CODE XREF: DbgkpPostFakeThreadMessages+12A↑j 00000001408876EB lea rcx, [rbx+_ETHREAD.RundownProtect] ; 获取线程运行保护 00000001408876EB ; Thread->RundownProtect 00000001408876F2 call ExAcquireRundownProtection ; 获取运行保护 00000001408876F7 test al, al ; 检查是否成功 00000001408876F9 jz short loc_140887719 ; 失败则跳转 00000001408876FB mov esi, 0Ah ; 挂起线程 00000001408876FB ; 设置状态标志为0xA (挂起成功) 0000000140887700 mov [rsp+218h+var_1E4], esi ; 保存状态标志 0000000140887704 xor edx, edx ; PreviousMode = Kernel 0000000140887706 mov rcx, rbx ; 线程对象 0000000140887709 call PsSuspendThread ; 挂起线程 000000014088770E test eax, eax ; 检查返回值 0000000140887710 js short loc_140887722 ; 失败则跳转 0000000140887712 mov esi, 2Ah ; '*' ; 设置状态标志为0x2A 0000000140887717 jmp short loc_14088771E ; 跳转 0000000140887719 ; --------------------------------------------------------------------------- 0000000140887719 loc_140887719: ; CODE XREF: DbgkpPostFakeThreadMessages+155↑j 0000000140887719 mov esi, 12h ; 运行保护获取失败处理 0000000140887719 ; 设置状态标志为0x12 000000014088771E loc_14088771E: ; CODE XREF: DbgkpPostFakeThreadMessages+173↑j 000000014088771E mov [rsp+218h+var_1E4], esi ; 保存状态标志 0000000140887722 loc_140887722: ; CODE XREF: DbgkpPostFakeThreadMessages+16C↑j 0000000140887722 xor edx, edx ; 初始化消息结构 0000000140887722 ; 清零memset参数 0000000140887724 mov r8d, 110h ; 大小 000000014088772A lea rcx, [rsp+218h+var_message] ; 目标地址 0000000140887732 call memset ; 初始化消息缓冲区 0000000140887737 test r13b, r13b ; 检查是否需要处理系统DLL 0000000140887737 ; 检查标志 000000014088773A jz loc_140887843 ; 如果为0则跳过 0000000140887740 test sil, 10h ; 检查状态标志位4 0000000140887744 jnz loc_140887843 ; 如果置位则跳过 000000014088774A mov r13b, 1 ; 处理系统DLL消息 000000014088774A ; 设置标志 000000014088774D mov [rsp+218h+var_1E7], r13b 0000000140887752 mov dword ptr [rsp+218h+var_message.ApiNumber], 2 ; 设置处理模式 000000014088775D mov r12, [rsp+218h+PROCESS] ; 获取进程的Section句柄 000000014088775D ; TargetProcess 0000000140887762 mov rcx, [r12+_EPROCESS.SectionObject] ; Process->SectionHandle 000000014088776A test rcx, rcx ; 检查是否为NULL 000000014088776D jz short loc_14088777E ; 是则跳转 000000014088776F call DbgkpSectionToFileHandle ; 转换Section对象为句柄 0000000140887774 mov qword ptr [rsp+218h+var_message.u+8], rax ; 保存句柄 000000014088777C jmp short loc_140887787 ; 跳转 000000014088777E ; --------------------------------------------------------------------------- 000000014088777E loc_14088777E: ; CODE XREF: DbgkpPostFakeThreadMessages+1C9↑j 000000014088777E and qword ptr [rsp+218h+var_message.u+8], 0 ; 清空句柄变量 0000000140887787 loc_140887787: ; CODE XREF: DbgkpPostFakeThreadMessages+1D8↑j 0000000140887787 mov rax, [r12+_EPROCESS.SectionBaseAddress] ; 附加到目标进程 0000000140887787 ; Process->Win32Process 000000014088778F mov qword ptr [rsp+218h+var_message.u+10h], rax 0000000140887797 lea rdx, [rsp+218h+ApcState] ; ApcState APC状态指针 000000014088779F mov rcx, r12 ; PROCESS 目标进程 00000001408877A2 call KeStackAttachProcess ; 附加到进程空间 00000001408877A7 nop ; No Operation 00000001408877A8 loc_1408877A8: ; DATA XREF: .rdata:00000001400B5454↑o 00000001408877A8 ; __try { // __except at loc_1408877D9 ; 在目标进程空间中获取NT头 00000001408877A8 mov rcx, [r12+520h] ; Win32Process 00000001408877B0 call RtlImageNtHeader ; 获取PE头 00000001408877B5 test rax, rax ; 检查是否成功 00000001408877B8 jz short loc_1408877D7 ; 失败则跳转 00000001408877BA and qword ptr [rsp+218h+var_message.u+28h], 0 ; 保存PE头信息 00000001408877BA ; 清空变量 00000001408877C3 mov ecx, [rax+0Ch] ; SizeOfHeaders 00000001408877C6 mov dword ptr [rsp+218h+var_message.u+18h], ecx ; 保存 00000001408877CD mov eax, [rax+10h] ; SizeOfImage 00000001408877D0 mov dword ptr [rsp+218h+var_message.u+1Ch], eax ; 保存 00000001408877D7 loc_1408877D7: ; CODE XREF: DbgkpPostFakeThreadMessages+214↑j 00000001408877D7 jmp short DbgkRegisterErrorPort_0 ; 跳转到清理 00000001408877D7 ; } // starts at 1408877A8 00000001408877D9 ; --------------------------------------------------------------------------- 00000001408877D9 loc_1408877D9: ; DATA XREF: .rdata:00000001400B5454↑o 00000001408877D9 ; __except(1) // owned by 1408877A8 ; __except异常处理 00000001408877D9 and qword ptr [rsp+218h+var_message.u+28h], 0 ; 异常时清空变量 00000001408877E2 and dword ptr [rsp+218h+var_message.u+18h], 0 ; Logical AND 00000001408877EA and dword ptr [rsp+218h+var_message.u+1Ch], 0 ; Logical AND 00000001408877F2 mov r14d, 'OgbD' ; 恢复标签 00000001408877F8 mov r15, [rsp+218h+var_1D8] ; 恢复线程指针 00000001408877FD mov esi, [rsp+218h+var_1E4] ; 恢复状态标志 0000000140887801 mov r13b, [rsp+218h+var_1E7] ; 恢复标志 0000000140887806 mov rdi, [rsp+218h+var_1A8] ; 恢复当前线程 000000014088780B mov rbx, [rsp+218h+var_1C8] 0000000140887810 mov rax, [rsp+218h+var_1A0] 0000000140887815 mov [rsp+218h+PROCESS], rax ; 恢复进程指针 000000014088781A mov rax, [rsp+218h+var_198] 0000000140887822 mov [rsp+218h+var_1D0], rax ; 恢复DebugObject 0000000140887827 mov rax, [rsp+218h+var_190] 000000014088782F mov [rsp+218h+var_1C0], rax ; 恢复OutThread 0000000140887834 DbgkRegisterErrorPort_0: ; CODE XREF: DbgkpPostFakeThreadMessages:loc_1408877D7↑j 0000000140887834 lea rcx, [rsp+218h+ApcState] ; ApcState 分离目标进程 0000000140887834 ; APC状态指针 000000014088783C call KeUnstackDetachProcess ; 分离进程 0000000140887841 jmp short loc_140887860 ; 跳转到消息发送 0000000140887843 ; --------------------------------------------------------------------------- 0000000140887843 loc_140887843: ; CODE XREF: DbgkpPostFakeThreadMessages+196↑j 0000000140887843 ; DbgkpPostFakeThreadMessages+1A0↑j 0000000140887843 xor r13b, r13b ; 非系统DLL处理路径 0000000140887843 ; 清除标志 0000000140887846 mov dword ptr [rsp+218h+var_message.ApiNumber], 1 ; 设置处理模式 0000000140887851 mov rax, [rbx+_ETHREAD.Win32StartAddress] 0000000140887858 mov qword ptr [rsp+218h+var_message.u+8], rax ; 保存进程ID 0000000140887860 loc_140887860: ; CODE XREF: DbgkpPostFakeThreadMessages+29D↑j 0000000140887860 mov rax, [rsp+218h+var_1D0] ; 发送调试消息 0000000140887860 ; DebugObject 0000000140887865 mov [rsp+218h+var_1F8], rax ; 参数5: PRKEVENT 000000014088786A mov r9d, esi ; 参数4: 消息类型 000000014088786D lea r8, [rsp+218h+var_message] ; 参数3: 消息缓冲区 0000000140887875 mov rdx, rbx ; 参数2: 线程指针 0000000140887878 mov rcx, [rsp+218h+PROCESS] ; 参数1: 进程指针 000000014088787D call DbgkpQueueMessage ; 发送消息到调试端口 0000000140887882 mov r12d, eax ; 保存返回状态 0000000140887885 test eax, eax ; 检查消息发送结果 0000000140887885 ; 检查状态 0000000140887887 jns short loc_1408878FF ; 成功则跳转 0000000140887889 test sil, 20h ; 错误处理:恢复线程状态 0000000140887889 ; 检查是否挂起了线程 000000014088788D jz short loc_140887899 ; 未挂起则跳过 000000014088788F xor edx, edx ; PreviousMode = Kernel 0000000140887891 mov rcx, rbx ; 线程对象 0000000140887894 call PsResumeThread ; 恢复线程 0000000140887899 loc_140887899: ; CODE XREF: DbgkpPostFakeThreadMessages+2E9↑j 0000000140887899 test sil, 8 ; 检查是否获取了运行保护 000000014088789D jz short loc_1408878AB ; 未获取则跳过 000000014088789F lea rcx, [rbx+4F8h] ; Thread->RundownProtect 00000001408878A6 call ExReleaseRundownProtection_1 ; 释放运行保护 00000001408878AB loc_1408878AB: ; CODE XREF: DbgkpPostFakeThreadMessages+2F9↑j 00000001408878AB cmp dword ptr [rsp+218h+var_message.ApiNumber], 2 ; 清理句柄资源 00000001408878AB ; 检查是否系统DLL模式 00000001408878B3 jnz short loc_1408878C9 ; 不是则跳过 00000001408878B5 mov rcx, qword ptr [rsp+218h+var_message.u+8] ; 获取句柄 00000001408878BD test rcx, rcx ; 检查是否有效 00000001408878C0 jz short loc_1408878C9 ; 无效则跳过 00000001408878C2 xor edx, edx ; PreviousMode = Kernel 00000001408878C4 call ObCloseHandle ; 关闭句柄 00000001408878C9 loc_1408878C9: ; CODE XREF: DbgkpPostFakeThreadMessages+30F↑j 00000001408878C9 ; DbgkpPostFakeThreadMessages+31C↑j 00000001408878C9 mov rcx, rbx ; 获取下一个线程 00000001408878C9 ; 当前线程 00000001408878CC call PsQuitNextProcessThread ; 移动到下一个线程 00000001408878D1 loc_1408878D1: ; CODE XREF: DbgkpPostFakeThreadMessages+EC↑j 00000001408878D1 test r12d, r12d ; 线程遍历结束处理 00000001408878D1 ; 检查最终状态 00000001408878D4 jns short loc_140887955 ; 成功则跳转 00000001408878D6 test r15, r15 ; 错误处理:释放对象引用 00000001408878D6 ; 检查输入线程 00000001408878D9 jz short loc_1408878E6 ; 为空则跳过 00000001408878DB mov edx, r14d ; Tag 00000001408878DE mov rcx, r15 ; Object 00000001408878E1 call ObfDereferenceObjectWithTag ; 释放引用 00000001408878E6 loc_1408878E6: ; CODE XREF: DbgkpPostFakeThreadMessages+335↑j 00000001408878E6 test rdi, rdi ; 检查当前线程 00000001408878E9 jz loc_140887982 ; 为空则跳转到结束 00000001408878EF mov edx, r14d ; Tag 00000001408878F2 mov rcx, rdi ; Object 00000001408878F5 call ObfDereferenceObjectWithTag ; 释放引用 00000001408878FA jmp loc_140887982 ; 跳转到结束 00000001408878FF ; --------------------------------------------------------------------------- 00000001408878FF loc_1408878FF: ; CODE XREF: DbgkpPostFakeThreadMessages+2E3↑j 00000001408878FF test r13b, r13b ; 消息发送成功处理 00000001408878FF ; 检查系统DLL标志 0000000140887902 jz short loc_140887936 ; 未设置则跳过 0000000140887904 xor r13b, r13b ; 发送系统DLL消息 0000000140887907 mov [rsp+218h+var_1E8], r13b ; 清除标志 000000014088790C mov edx, r14d ; Tag 000000014088790F mov rcx, rbx ; 线程对象 0000000140887912 call ObfReferenceObjectWithTag ; 增加引用计数 0000000140887917 mov r15, rbx ; 保存当前线程 000000014088791A mov [rsp+218h+var_1D8], rbx ; 保存当前线程 000000014088791F lea r8, [rsp+218h+var_message] ; 消息缓冲区 0000000140887927 mov rdx, [rsp+218h+var_1D0] ; DebugObject 000000014088792C mov rcx, rbx ; PVOID 000000014088792F call DbgkSendSystemDllMessages_0 ; 发送系统DLL消息 0000000140887934 jmp short loc_14088793B ; 获取下一个线程 0000000140887934 ; 当前线程 0000000140887936 ; --------------------------------------------------------------------------- 0000000140887936 loc_140887936: ; CODE XREF: DbgkpPostFakeThreadMessages+35E↑j 0000000140887936 mov r13b, [rsp+218h+var_1E8] 000000014088793B loc_14088793B: ; CODE XREF: DbgkpPostFakeThreadMessages+11C↑j 000000014088793B ; DbgkpPostFakeThreadMessages+141↑j ... 000000014088793B mov rdx, rbx ; 获取下一个线程 000000014088793B ; 当前线程 000000014088793E mov rcx, [rsp+218h+PROCESS] ; 目标进程 0000000140887943 call PsGetNextProcessThread ; 获取下一个线程 0000000140887948 mov rbx, rax ; 更新当前线程 000000014088794B mov [rsp+218h+var_1C8], rax ; 保存 0000000140887950 jmp loc_14088768D ; 线程遍历主循环 0000000140887950 ; 检查当前线程是否有效 0000000140887955 ; --------------------------------------------------------------------------- 0000000140887955 loc_140887955: ; CODE XREF: DbgkpPostFakeThreadMessages+330↑j 0000000140887955 test r15, r15 ; 成功退出路径 0000000140887955 ; 检查输入线程 0000000140887958 jz short loc_14088796C ; 为空则跳过 000000014088795A mov rax, [rsp+218h+var_1C0] ; 设置输出参数 000000014088795A ; OutThread指针 000000014088795F mov [rax], r15 ; 保存线程指针 0000000140887962 mov rax, [rsp+218h+var_1B8] ; 第5个参数指针 0000000140887967 mov [rax], rdi ; 保存当前线程 000000014088796A jmp short loc_140887982 ; 跳转到结束 000000014088796C ; --------------------------------------------------------------------------- 000000014088796C loc_14088796C: ; CODE XREF: DbgkpPostFakeThreadMessages+3B4↑j 000000014088796C test rdi, rdi ; 无输入线程时的清理 000000014088796F jz short loc_14088797C ; 检查当前线程 000000014088796F ; 为空则跳过 0000000140887971 mov edx, r14d ; Tag 0000000140887974 mov rcx, rdi ; 线程对象 0000000140887977 call ObfDereferenceObjectWithTag ; 释放引用 000000014088797C loc_14088797C: ; CODE XREF: DbgkpPostFakeThreadMessages+3CB↑j 000000014088797C mov r12d, 0C0000001h ; 设置错误码 STATUS_UNSUCCESSFUL 0000000140887982 loc_140887982: ; CODE XREF: DbgkpPostFakeThreadMessages+345↑j 0000000140887982 ; DbgkpPostFakeThreadMessages+356↑j ... 0000000140887982 mov eax, r12d ; 函数退出 0000000140887982 ; 返回值 = 状态码 0000000140887985 mov rcx, [rsp+218h+var_48] ; 恢复安全Cookie 000000014088798D xor rcx, rsp ; StackCookie 0000000140887990 call __security_check_cookie ; 安全检查 0000000140887995 add rsp, 1E0h ; Add 000000014088799C pop r15 000000014088799E pop r14 00000001408879A0 pop r13 00000001408879A2 pop r12 00000001408879A4 pop rdi 00000001408879A5 pop rsi 00000001408879A6 pop rbx 00000001408879A7 retn ; 函数返回 00000001408879A7 ; --------------------------------------------------------------------------- 00000001408879A8 db 0CCh 00000001408879A8 ; } // starts at 1408875A4 00000001408879A8 DbgkpPostFakeThreadMessages endp
最新发布
08-16
import os import random import tkinter as tk from tkinter import filedialog, messagebox, ttk import shutil import tempfile import hashlib import time import pefile import zlib import sys import platform import psutil from Crypto.Cipher import AES # 仅保留但不用于代码段加密 from Crypto.Util.Padding import pad, unpad # 仅保留但不用于代码段加密 class ExeProtectorApp: def __init__(self, root): self.root = root self.root.title("EXE文件保护工具 v4.2") self.root.geometry("750x680") self.root.resizable(True, True) # 设置中文字体 self.style = ttk.Style() self.style.configure("TLabel", font=("SimHei", 10)) self.style.configure("TButton", font=("SimHei", 10)) self.style.configure("TProgressbar", thickness=20) # 创建主框架 self.main_frame = ttk.Frame(root, padding="20") self.main_frame.pack(fill=tk.BOTH, expand=True) # 文件选择部分 ttk.Label(self.main_frame, text="选择EXE文件:").grid(row=0, column=0, sticky=tk.W, pady=5) self.file_path_var = tk.StringVar() ttk.Entry(self.main_frame, textvariable=self.file_path_var, width=50).grid(row=0, column=1, padx=5, pady=5) ttk.Button(self.main_frame, text="浏览...", command=self.browse_file).grid(row=0, column=2, padx=5, pady=5) # 输出目录选择 ttk.Label(self.main_frame, text="输出目录:").grid(row=1, column=0, sticky=tk.W, pady=5) self.output_dir_var = tk.StringVar() ttk.Entry(self.main_frame, textvariable=self.output_dir_var, width=50).grid(row=1, column=1, padx=5, pady=5) ttk.Button(self.main_frame, text="浏览...", command=self.browse_output_dir).grid(row=1, column=2, padx=5, pady=5) # 选项设置 options_frame = ttk.LabelFrame(self.main_frame, text="选项", padding="10") options_frame.grid(row=2, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=10) # 随机字节增加量 ttk.Label(options_frame, text="随机字节增加范围 (KB):").grid(row=0, column=0, sticky=tk.W, pady=5) self.min_size_var = tk.IntVar(value=100) ttk.Entry(options_frame, textvariable=self.min_size_var, width=10).grid(row=0, column=1, padx=5, pady=5) ttk.Label(options_frame, text="至").grid(row=0, column=2, padx=5, pady=5) self.max_size_var = tk.IntVar(value=1000) ttk.Entry(options_frame, textvariable=self.max_size_var, width=10).grid(row=0, column=3, padx=5, pady=5) # 随机性强度 ttk.Label(options_frame, text="随机性强度:").grid(row=0, column=4, sticky=tk.W, pady=5) self.random_strength = tk.StringVar(value="medium") strength_options = ttk.Combobox(options_frame, textvariable=self.random_strength, state="readonly", width=12) strength_options['values'] = ("低", "中", "高") strength_options.grid(row=0, column=5, padx=5, pady=5) # 程序类型模拟 ttk.Label(options_frame, text="模拟程序类型:").grid(row=1, column=0, sticky=tk.W, pady=5) self.app_type = tk.StringVar(value="generic") app_types = ttk.Combobox(options_frame, textvariable=self.app_type, state="readonly", width=15) app_types['values'] = ("通用程序", "游戏程序", "办公软件", "系统工具", "开发工具") app_types.grid(row=1, column=1, padx=5, pady=5) # 处理方法 self.process_method = tk.StringVar(value="safe") ttk.Radiobutton(options_frame, text="安全模式", variable=self.process_method, value="safe").grid(row=1, column=2, sticky=tk.W, pady=5) ttk.Radiobutton(options_frame, text="增强模式", variable=self.process_method, value="enhanced").grid(row=1, column=3, sticky=tk.W, pady=5) ttk.Radiobutton(options_frame, text="标准保护", variable=self.process_method, value="standard").grid(row=1, column=4, sticky=tk.W, pady=5) ttk.Radiobutton(options_frame, text="高级保护", variable=self.process_method, value="advanced").grid(row=1, column=5, sticky=tk.W, pady=5) # 高级选项 advanced_frame = ttk.LabelFrame(self.main_frame, text="保护选项", padding="10") advanced_frame.grid(row=3, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=10) self.obfuscate_resources = tk.BooleanVar(value=True) ttk.Checkbutton(advanced_frame, text="混淆资源文件", variable=self.obfuscate_resources).grid(row=0, column=0, sticky=tk.W, pady=5) self.encrypt_sections = tk.BooleanVar(value=True) ttk.Checkbutton(advanced_frame, text="轻度代码变换", variable=self.encrypt_sections).grid(row=0, column=1, sticky=tk.W, pady=5) self.add_dummy_sections = tk.BooleanVar(value=True) ttk.Checkbutton(advanced_frame, text="添加随机数据块", variable=self.add_dummy_sections).grid(row=1, column=0, sticky=tk.W, pady=5) self.randomize_imports = tk.BooleanVar(value=True) ttk.Checkbutton(advanced_frame, text="随机化导入表顺序", variable=self.randomize_imports).grid(row=1, column=1, sticky=tk.W, pady=5) # 终极选项 ultra_frame = ttk.LabelFrame(self.main_frame, text="高级优化", padding="10") ultra_frame.grid(row=4, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=10) self.anti_vm = tk.BooleanVar(value=False) ttk.Checkbutton(ultra_frame, text="兼容虚拟机环境", variable=self.anti_vm).grid(row=0, column=0, sticky=tk.W, pady=5) self.anti_debug = tk.BooleanVar(value=False) ttk.Checkbutton(ultra_frame, text="调试模式兼容", variable=self.anti_debug).grid(row=0, column=1, sticky=tk.W, pady=5) self.random_pe_layout = tk.BooleanVar(value=True) ttk.Checkbutton(ultra_frame, text="随机PE结构布局", variable=self.random_pe_layout).grid(row=1, column=0, sticky=tk.W, pady=5) self.variable_section_count = tk.BooleanVar(value=True) ttk.Checkbutton(ultra_frame, text="随机区段数量", variable=self.variable_section_count).grid(row=1, column=1, sticky=tk.W, pady=5) # 处理按钮 ttk.Button(self.main_frame, text="保护文件", command=self.process_file).grid(row=5, column=0, columnspan=3, pady=20) # 状态和进度条 self.status_var = tk.StringVar(value="就绪") ttk.Label(self.main_frame, textvariable=self.status_var).grid(row=6, column=0, columnspan=2, sticky=tk.W, pady=5) self.progress_var = tk.DoubleVar(value=0) self.progress_bar = ttk.Progressbar(self.main_frame, variable=self.progress_var, length=100) self.progress_bar.grid(row=6, column=2, sticky=(tk.W, tk.E), pady=5) # 默认输出目录 self.output_dir_var.set(os.path.join(os.getcwd(), "protected_exes")) # 绑定窗口关闭事件 self.root.protocol("WM_DELETE_WINDOW", self.on_closing) # 初始化随机种子 self.initialize_random_seed() # 初始化随机种子,使用多种来源确保高随机性 def initialize_random_seed(self): # 使用多种系统信息和随机源作为种子材料,增强随机性 seed_material = ( time.time_ns().to_bytes(8, 'big') + os.getpid().to_bytes(4, 'big') + os.urandom(32) + # 增加随机字节数量 str(psutil.virtual_memory().available).encode() + str(psutil.cpu_percent(interval=0.1)).encode() + platform.node().encode() + str(random.getstate()).encode() ) # 使用SHA-512获取更复杂的哈希值作为种子 seed = int.from_bytes(hashlib.sha512(seed_material).digest(), 'big') random.seed(seed) # 额外增加随机状态初始化 random.getstate() # 浏览文件 def browse_file(self): file_path = filedialog.askopenfilename( filetypes=[("可执行文件", "*.exe"), ("所有文件", "*.*")] ) if file_path: self.file_path_var.set(file_path) # 浏览输出目录 def browse_output_dir(self): dir_path = filedialog.askdirectory() if dir_path: self.output_dir_var.set(dir_path) # 处理文件 def process_file(self): exe_path = self.file_path_var.get() output_dir = self.output_dir_var.get() if not exe_path: messagebox.showerror("错误", "请选择一个EXE文件") return if not os.path.exists(exe_path): messagebox.showerror("错误", "选择的文件不存在") return if not output_dir: messagebox.showerror("错误", "请选择输出目录") return if not os.path.exists(output_dir): try: os.makedirs(output_dir) except: messagebox.showerror("错误", "无法创建输出目录") return # 获取文件名和扩展名 file_name, file_ext = os.path.splitext(os.path.basename(exe_path)) # 添加随机字符串到输出文件名,确保每次不同 random_suffix = hashlib.sha256(str(time.time_ns()).encode() + os.urandom(16)).hexdigest()[:12] output_path = os.path.join(output_dir, f"{file_name}_protected_{random_suffix}{file_ext}") try: # 更新状态 self.status_var.set("正在处理文件...") self.progress_var.set(0) self.root.update() # 计算随机增加的字节大小 min_size = self.min_size_var.get() max_size = self.max_size_var.get() if min_size < 0 or max_size < 0 or min_size > max_size: messagebox.showerror("错误", "请设置有效的字节增加范围") return # 根据随机性强度调整随机范围 strength_factor = 1.0 if self.random_strength.get() == "高": strength_factor = 1.5 elif self.random_strength.get() == "低": strength_factor = 0.5 adjusted_min = int(min_size * strength_factor) adjusted_max = int(max_size * strength_factor) random_size_kb = random.randint(adjusted_min, adjusted_max) random_size_bytes = random_size_kb * 1024 # 复制原始文件 shutil.copy2(exe_path, output_path) # 计算原始文件哈希值 original_hash = self.calculate_file_hash(exe_path) # 更新进度 self.progress_var.set(5) self.root.update() # 根据选择的模式处理文件 if self.process_method.get() == "safe": self.safe_modify_exe_file(output_path, random_size_bytes) elif self.process_method.get() == "enhanced": self.enhanced_modify_exe_file(output_path, random_size_bytes) elif self.process_method.get() == "standard": self.standard_protection(output_path, random_size_bytes) else: self.advanced_protection(output_path, random_size_bytes) # 后续哈希计算、进度更新等 modified_hash = self.calculate_file_hash(output_path) self.progress_var.set(95) self.root.update() if self.verify_exe_file(output_path): self.status_var.set("文件处理完成") self.progress_var.set(100) messagebox.showinfo( "成功", f"文件保护成功!\n" f"原始文件大小: {os.path.getsize(exe_path) // 1024} KB\n" f"处理后文件大小: {os.path.getsize(output_path) // 1024} KB\n" f"增加了: {random_size_kb} KB\n\n" f"原始文件哈希 (MD5): {original_hash}\n" f"处理后文件哈希 (MD5): {modified_hash}\n\n" f"文件已保存至: {output_path}" ) else: self.status_var.set("文件验证失败") self.progress_var.set(100) messagebox.showwarning("警告", "处理后的文件可能需要在特定环境运行") except Exception as e: self.status_var.set("处理过程中出错") messagebox.showerror("错误", f"处理文件时出错: {str(e)}") finally: self.progress_var.set(0) # 每次处理后重新初始化随机种子,确保下一次处理的随机性不同 self.initialize_random_seed() # 计算文件哈希 def calculate_file_hash(self, file_path): hash_md5 = hashlib.md5() with open(file_path, "rb") as f: for chunk in iter(lambda: f.read(4096), b""): hash_md5.update(chunk) return hash_md5.hexdigest() # 安全模式:仅添加正常数据 def safe_modify_exe_file(self, file_path, additional_bytes): with open(file_path, 'ab') as f: # 根据选择的应用类型生成对应的数据 app_type = self.app_type.get() data = self.generate_application_specific_data(additional_bytes, app_type) f.write(data) # 增强模式:优化PE结构 def enhanced_modify_exe_file(self, file_path, additional_bytes): try: pe = pefile.PE(file_path) # 更新时间戳,使用更大的随机偏移 pe.FILE_HEADER.TimeDateStamp = int(time.time()) + random.randint(-86400, 86400) # 随机偏移1天内 # 随机化更多非关键的PE头字段 if self.random_pe_layout.get(): pe.FILE_HEADER.PointerToSymbolTable = random.getrandbits(32) pe.FILE_HEADER.NumberOfSymbols = random.randint(0, 2000) # 添加更多随机化字段 pe.OPTIONAL_HEADER.MajorLinkerVersion = random.randint(1, 25) pe.OPTIONAL_HEADER.MinorLinkerVersion = random.randint(0, 99) pe.OPTIONAL_HEADER.MajorImageVersion = random.randint(1, 20) pe.OPTIONAL_HEADER.MinorImageVersion = random.randint(0, 99) # 添加正常附加数据 self.safe_modify_exe_file(file_path, additional_bytes) pe.write(file_path) pe.close() except Exception as e: print(f"增强模式执行: {e}") self.safe_modify_exe_file(file_path, additional_bytes) # 标准保护:添加合理区段 def standard_protection(self, file_path, additional_bytes): try: pe = pefile.PE(file_path) # 随机决定添加的区段数量(1-4个),增加变化性 section_count = 1 if self.variable_section_count.get(): section_count = random.randint(1, 4) # 添加多个随机区段 for _ in range(section_count): # 创建新区段 new_section = pefile.SectionStructure(pe.__IMAGE_SECTION_HEADER_format__) # 生成随机但合理的区段名 new_section.Name = self.generate_sane_section_name() # 区段大小随机(1-16KB),范围更大 section_size = random.randint(0x1000, 0x4000) new_section.Misc_VirtualSize = section_size # 地址对齐,添加更大的随机偏移 base_virtual_address = (pe.sections[-1].VirtualAddress + pe.sections[-1].Misc_VirtualSize + 0x1000 - 1) & ~0xFFF new_section.VirtualAddress = base_virtual_address + random.randint(0, 0x2000) base_raw_data = (pe.sections[-1].PointerToRawData + pe.sections[-1].SizeOfRawData + 0x1000 - 1) & ~0xFFF new_section.PointerToRawData = base_raw_data + random.randint(0, 0x2000) new_section.SizeOfRawData = section_size # 随机选择合理的区段属性,增加更多可能性 section_flags = [ 0xC0000040, 0x40000040, 0x20000040, 0x80000040, 0x00000040, 0xE0000040, 0x00000080, 0x40000080 ] new_section.Characteristics = random.choice(section_flags) # 生成与程序类型匹配的区段数据 app_type = self.app_type.get() new_data = self.generate_application_specific_data(section_size, app_type) pe.set_bytes_at_offset(new_section.PointerToRawData, new_data) # 添加新区段到PE结构 pe.sections.append(new_section) pe.FILE_HEADER.NumberOfSections += 1 pe.OPTIONAL_HEADER.SizeOfImage = (new_section.VirtualAddress + new_section.Misc_VirtualSize + 0x1000 - 1) & ~0xFFF # 轻度代码变换 if self.encrypt_sections.get(): self.apply_mild_code_transformations(pe) # 随机化导入表顺序(如果启用) if self.randomize_imports.get() and hasattr(pe, 'DIRECTORY_ENTRY_IMPORT'): # 多次随机打乱以增加随机性 for _ in range(random.randint(1, 3)): random.shuffle(pe.DIRECTORY_ENTRY_IMPORT) # 添加文件末尾数据 self.safe_modify_exe_file(file_path, additional_bytes) # 更新时间戳,添加随机偏移 pe.FILE_HEADER.TimeDateStamp = int(time.time()) + random.randint(-86400, 86400) # 随机偏移1天内 pe.write(file_path) pe.close() except Exception as e: print(f"标准保护执行: {e}") self.enhanced_modify_exe_file(file_path, additional_bytes) # 高级保护:进一步增加随机性 def advanced_protection(self, file_path, additional_bytes): try: pe = pefile.PE(file_path) # 随机决定添加的区段数量(2-5个),增加更多变化 section_count = 2 if self.variable_section_count.get(): section_count = random.randint(2, 5) # 添加多个随机区段 for _ in range(section_count): new_section = pefile.SectionStructure(pe.__IMAGE_SECTION_HEADER_format__) new_section.Name = self.generate_sane_section_name() # 区段大小变化更大(1-32KB) section_size = random.randint(0x1000, 0x8000) new_section.Misc_VirtualSize = section_size # 地址对齐,添加更大的随机偏移 base_virtual_address = (pe.sections[-1].VirtualAddress + pe.sections[-1].Misc_VirtualSize + 0x1000 - 1) & ~0xFFF new_section.VirtualAddress = base_virtual_address + random.randint(0, 0x4000) base_raw_data = (pe.sections[-1].PointerToRawData + pe.sections[-1].SizeOfRawData + 0x1000 - 1) & ~0xFFF new_section.PointerToRawData = base_raw_data + random.randint(0, 0x4000) new_section.SizeOfRawData = section_size # 随机选择合理的区段属性,增加更多选项 section_flags = [ 0xC0000040, 0x40000040, 0x20000040, 0x80000040, 0x00000040, 0xE0000040, 0x00000080, 0x40000080, 0x80000080, 0x20000080, 0x00000100 ] new_section.Characteristics = random.choice(section_flags) # 生成特定类型的应用数据 app_type = self.app_type.get() new_data = self.generate_application_specific_data(section_size, app_type) pe.set_bytes_at_offset(new_section.PointerToRawData, new_data) pe.sections.append(new_section) pe.FILE_HEADER.NumberOfSections += 1 pe.OPTIONAL_HEADER.SizeOfImage = (new_section.VirtualAddress + new_section.Misc_VirtualSize + 0x1000 - 1) & ~0xFFF # 轻度代码变换 if self.encrypt_sections.get(): self.apply_mild_code_transformations(pe) # 混淆资源(如果启用) if self.obfuscate_resources.get() and hasattr(pe, 'DIRECTORY_ENTRY_RESOURCE'): self.obfuscate_pe_resources(pe) # 随机化导入表顺序,增加随机性 if self.randomize_imports.get() and hasattr(pe, 'DIRECTORY_ENTRY_IMPORT'): # 多次随机打乱以确保随机性 for _ in range(random.randint(2, 5)): random.shuffle(pe.DIRECTORY_ENTRY_IMPORT) # 添加随机数据块,使用随机大小 if self.add_dummy_sections.get(): dummy_size = random.randint(additional_bytes // 3, additional_bytes * 2 // 3) self.safe_modify_exe_file(file_path, dummy_size) additional_bytes -= dummy_size # 添加文件末尾数据 self.safe_modify_exe_file(file_path, additional_bytes) # 随机化更多PE头字段 if self.random_pe_layout.get(): pe.FILE_HEADER.PointerToSymbolTable = random.getrandbits(32) pe.FILE_HEADER.NumberOfSymbols = random.randint(0, 5000) pe.OPTIONAL_HEADER.MajorImageVersion = random.randint(1, 20) pe.OPTIONAL_HEADER.MinorImageVersion = random.randint(0, 99) pe.OPTIONAL_HEADER.MajorSubsystemVersion = random.randint(4, 10) pe.OPTIONAL_HEADER.MinorSubsystemVersion = random.randint(0, 99) pe.OPTIONAL_HEADER.MajorOperatingSystemVersion = random.randint(5, 10) pe.OPTIONAL_HEADER.MinorOperatingSystemVersion = random.randint(0, 99) # 添加更多可随机化的字段 pe.OPTIONAL_HEADER.LoaderFlags = random.getrandbits(32) & 0x00000003 # 仅保留合法值 pe.OPTIONAL_HEADER.NumberOfRvaAndSizes = 16 # 标准值,但可以偶尔修改 if random.random() < 0.3: # 30%概率修改这个值 pe.OPTIONAL_HEADER.SizeOfHeaders = (pe.OPTIONAL_HEADER.SizeOfHeaders + random.randint(0x100, 0x800)) & ~0xFF # 保持对齐 # 更新时间戳,使用更大的随机偏移 pe.FILE_HEADER.TimeDateStamp = int(time.time()) + random.randint(-604800, 604800) # 随机偏移1周内 pe.write(file_path) pe.close() except Exception as e: print(f"高级保护执行: {e}") self.standard_protection(file_path, additional_bytes) # 生成模拟特定类型程序的数据,增强随机性和多样性 def generate_application_specific_data(self, size, app_type): """根据程序类型生成不同特征的数据,确保每次生成都不同""" data = bytearray() # 根据选择的应用类型生成对应的数据模板,增加更多模板项 type_templates = { "通用程序": [ b"C:\\Program Files\\Common Files\\\x00", b"HKLM\\Software\\Microsoft\\Windows\\\x00", b"ERROR_ACCESS_DENIED\x00", b"SUCCESS\x00", b"CONFIG_FILE\x00", b"LOG_FILE\x00", b"USER_SETTINGS\x00", b"APPLICATION_DATA\x00", b"SYSTEM32\x00", b"KERNEL32.DLL\x00", b"ADVAPI32.DLL\x00", (0x00000001).to_bytes(4, 'little'), (0x00000100).to_bytes(4, 'little'), (0x00010000).to_bytes(4, 'little'), (0x00100000).to_bytes(4, 'little'), ], "游戏程序": [ b"C:\\Program Files\\Game\\Data\\\x00", b"C:\\Users\\Public\\Documents\\GameSaves\\\x00", b"TEXTURE_", b"MODEL_", b"SOUND_", b"LEVEL_", b"SCORE_", b"PLAYER_", b"ENEMY_", b"WEAPON_", b"QUEST_", b"ACHIEVEMENT_", b"INVENTORY_", b"CHARACTER_", b"MAP_", b"DIFFICULTY_", (0x000F4240).to_bytes(4, 'little'), # 1000000 (0x000003E8).to_bytes(4, 'little'), # 1000 (0x00000064).to_bytes(4, 'little'), # 100 (0x0000000A).to_bytes(4, 'little'), # 10 ], "办公软件": [ b"C:\\Users\\%USERNAME%\\Documents\\\x00", b"File Format: DOCX\x00", b"File Format: XLSX\x00", b"File Format: PPTX\x00", b"Page ", b"Sheet ", b"Table ", b"Font ", b"Style ", b"Paragraph ", b"Header", b"Footer", b"Section", b"Template", b"Macro", b"Add-in", b"Spell Check", b"Grammar Check", b"Word Count", b"Character Count", (0x0000000A).to_bytes(4, 'little'), # 10 (0x00000014).to_bytes(4, 'little'), # 20 (0x00000064).to_bytes(4, 'little'), # 100 ], "系统工具": [ b"C:\\Windows\\System32\\\x00", b"C:\\Windows\\SysWOW64\\\x00", b"HKLM\\SYSTEM\\CurrentControlSet\\\x00", b"Driver ", b"Service ", b"Device ", b"Registry ", b"Process ", b"Thread ", b"Memory ", b"Disk ", b"Network ", b"Adapter ", b"Protocol ", b"Firewall ", b"Security ", b"Policy ", b"Account ", (0x00000001).to_bytes(4, 'little'), (0x00000000).to_bytes(4, 'little'), (0xFFFFFFFF).to_bytes(4, 'little'), (0x00000002).to_bytes(4, 'little'), ], "开发工具": [ b"C:\\Program Files\\Developer\\SDK\\\x00", b"C:\\Users\\%USERNAME%\\Source\\\x00", b"Compiler ", b"Linker ", b"Debugger ", b"Library ", b"Include ", b"Namespace ", b"Class ", b"Function ", b"Variable ", b"Pointer ", b"Array ", b"Struct ", b"Enum ", b"Union ", b"Template ", b"Exception ", b"Thread ", b"Mutex ", (0x00000000).to_bytes(4, 'little'), (0x00000001).to_bytes(4, 'little'), (0x00000002).to_bytes(4, 'little'), (0x00000003).to_bytes(4, 'little'), ] } # 获取对应类型的模板 templates = type_templates.get(app_type, type_templates["通用程序"]) # 根据随机性强度调整模板使用方式 template_usage = 0.7 # 70%使用模板,30%使用随机数据 if self.random_strength.get() == "高": template_usage = 0.5 # 50%使用模板,50%使用随机数据 elif self.random_strength.get() == "低": template_usage = 0.9 # 90%使用模板,10%使用随机数据 # 填充数据直到达到目标大小,使用更复杂的模式 while len(data) < size: # 随机选择使用模板还是生成随机数据 if random.random() < template_usage: # 随机选择一个模板并添加 item = random.choice(templates) data.extend(item) # 偶尔添加随机长度的空白或分隔符 if random.random() < 0.4: separator_length = random.randint(1, 16) if random.random() < 0.5: data.extend(b'\x00' * separator_length) else: data.extend(b' ' * separator_length) else: # 生成更复杂的随机数据 random_len = random.randint(1, 128) if random.random() < 0.3: # 生成随机ASCII文本 random_text = bytes(random.choice(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-.') for _ in range(random_len)) data.extend(random_text) elif random.random() < 0.6: # 生成随机二进制数据 data.extend(os.urandom(random_len)) else: # 生成随机数值数据 for _ in range(random_len // 4 + 1): num = random.getrandbits(32) data.extend(num.to_bytes(4, 'little')) return data[:size] # 生成更多样化的合理区段名 def generate_sane_section_name(self): # 扩展区段名基础列表 base_names = [ b'.data', b'.rdata', b'.text', b'.rsrc', b'.reloc', b'.bss', b'.edata', b'.idata', b'.pdata', b'.tls', b'.data1', b'.rdata2', b'.text1', b'.rsrc1', b'.data_', b'.rdata_', b'.text_', b'.rsrc_', b'.init', b'.fini', b'.ctors', b'.dtors', b'.gnu', b'.note', b'.eh_frame', b'.debug', b'.xdata', b'.pdata', b'.data2', b'.text2', b'.code', b'.const', b'.dynamic', b'.hash', b'.plt', b'.got', b'.shstrtab', b'.symtab', b'.strtab', b'.comment', b'.note.ABI-tag' ] # 随机选择基础名称并可能添加随机后缀 name = random.choice(base_names) if random.random() < 0.8: # 提高添加后缀的概率 # 添加更多样化的随机后缀 suffix_type = random.randint(0, 2) if suffix_type == 0: # 数字后缀 suffix = str(random.randint(10, 999)).encode() elif suffix_type == 1: # 字母后缀 suffix_length = random.randint(1, 3) suffix = bytes(random.choice('abcdefghijklmnopqrstuvwxyz') for _ in range(suffix_length)) else: # 混合后缀 suffix = (str(random.randint(1, 9)) + random.choice('abcdef') + str(random.randint(10, 99))).encode() # 确保总长度不超过8字节 name = name[:8-len(suffix)] + suffix return name.ljust(8, b'\x00')[:8] # 确保正好8字节 # 轻度代码变换,增加更多变换类型 def apply_mild_code_transformations(self, pe): text_section = None for section in pe.sections: if b'.text' in section.Name: text_section = section break if text_section: data = pe.get_data(text_section.VirtualAddress, text_section.SizeOfRawData) if not isinstance(data, bytes): data = bytes(data) data_list = list(data) # 根据随机性强度调整变换程度 transform_count = len(data_list) // 200 if self.random_strength.get() == "高": transform_count = len(data_list) // 100 elif self.random_strength.get() == "低": transform_count = len(data_list) // 400 # 限制最大变换次数,但增加上限 transform_count = min(200, transform_count) # 随机选择位置进行更丰富的轻微变换 for _ in range(transform_count): i = random.randint(0, len(data_list) - 1) # 增加更多变换类型 transform_type = random.choice(range(8)) if transform_type == 0: # 加1 data_list[i] = (data_list[i] + 1) % 256 elif transform_type == 1: # 减1 data_list[i] = (data_list[i] - 1) % 256 elif transform_type == 2: # 与0xFF异或 data_list[i] ^= 0xFF elif transform_type == 3: # 左移一位 data_list[i] = (data_list[i] << 1) % 256 elif transform_type == 4: # 右移一位 data_list[i] = (data_list[i] >> 1) % 256 elif transform_type == 5: # 加一个小随机数 data_list[i] = (data_list[i] + random.randint(1, 5)) % 256 elif transform_type == 6: # 减一个小随机数 data_list[i] = (data_list[i] - random.randint(1, 5)) % 256 else: # 与一个随机数异或 data_list[i] ^= random.randint(1, 255) pe.set_bytes_at_offset(text_section.PointerToRawData, bytes(data_list)) # 增强资源混淆 def obfuscate_pe_resources(self, pe): try: # 遍历所有资源条目 for resource_type in pe.DIRECTORY_ENTRY_RESOURCE.entries: if hasattr(resource_type, 'directory'): for resource_id in resource_type.directory.entries: if hasattr(resource_id, 'directory'): for resource_lang in resource_id.directory.entries: data_rva = resource_lang.data.struct.OffsetToData size = resource_lang.data.struct.Size # 读取资源数据 resource_data = list(pe.get_data(data_rva, size)) # 根据随机性强度调整混淆程度 step_size = 200 if self.random_strength.get() == "高": step_size = 100 elif self.random_strength.get() == "低": step_size = 400 # 增加更多变换类型 for i in range(0, len(resource_data), random.randint(step_size-50, step_size+50)): if i < len(resource_data): # 随机选择一种变换 transform_type = random.randint(0, 4) if transform_type == 0: resource_data[i] = (resource_data[i] + random.randint(1, 5)) % 256 elif transform_type == 1: resource_data[i] = (resource_data[i] - random.randint(1, 5)) % 256 elif transform_type == 2: resource_data[i] ^= random.randint(1, 255) elif transform_type == 3: resource_data[i] = (resource_data[i] << random.randint(1, 3)) % 256 else: resource_data[i] = (resource_data[i] >> random.randint(1, 3)) % 256 # 对部分资源进行块级混淆 if random.random() < 0.3 and size > 1024: block_size = random.randint(64, 256) for b in range(0, size, block_size): if random.random() < 0.2: # 20%的块会被翻转 start = b end = min(b + block_size, size) resource_data[start:end] = resource_data[start:end][::-1] # 写回修改后的资源数据 pe.set_bytes_at_offset(data_rva, bytes(resource_data)) except Exception as e: print(f"资源混淆错误: {e}") # 计算PE校验和 def calculate_pe_checksum(self, pe): try: with open(pe.name, 'rb') as f: data = f.read() checksum = 0 for i in range(0, len(data), 2): if i + 1 < len(data): w = (data[i+1] << 8) | data[i] checksum += w else: checksum += data[i] checksum = (checksum >> 16) + (checksum & 0xffff) checksum += (checksum >> 16) return 0 - checksum except: return 0x00000000 # 验证EXE文件 def verify_exe_file(self, file_path): try: pe = pefile.PE(file_path) pe.close() return True except: return False # 关闭窗口 def on_closing(self): if messagebox.askokcancel("退出", "确定要退出程序吗?"): self.root.destroy() if __name__ == "__main__": root = tk.Tk() app = ExeProtectorApp(root) root.mainloop() 用户希望每次输出的程序减小TEXT代码段熵值 相对上次输出的程序静态特征都有很大差异 绕过qvm静态分析查杀 2025-07-10 09:57:50 恶意软件(HEUR/QVM10.2.95BA.Malware.Gen)MD5:f4722f1fd2c14e65558207bd3415ed0a已删除此文件,如果您发现误删,可从隔离区恢复此文件。 2025-07-10 10:07:34 恶意软件(HEUR/QVM10.2.95BA.Malware.Gen)MD5:3f519280c806a531c2fd494f392add06已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_2587963335de.exe 2025-07-10 10:05:41 恶意软件(HEUR/QVM10.2.95BA.Malware.Gen)MD5:ad5bf7bf68759eaa5f25587d0e977320已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_4df5eb7b2b48.exe 2025-07-10 10:04:55 恶意软件(HEUR/QVM10.2.95BA.Malware.Gen)MD5:ce816bbac00149bda721dec01d623773已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_5795dc64119b.exe 2025-07-10 10:03:42 恶意软件(HEUR/QVM10.2.95BA.Malware.Gen)MD5:224798374219b4fc6046b1da7f4eb632已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_17f73c7eda70.exe 2025-07-10 10:03:16 恶意软件(HEUR/QVM10.2.95BA.Malware.Gen)MD5:cb3c1534897e38110aeeea2aa71c9d5a已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_eb5a679318ab.exe 2025-07-10 09:57:50 恶意软件(HEUR/QVM10.2.95BA.Malware.Gen)MD5:f4722f1fd2c14e65558207bd3415ed0a已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_7e5282a2592431df.exe 2025-07-10 09:56:51 恶意软件(HEUR/QVM10.2.95BA.Malware.Gen)MD5:63d542dffd607fda49b4ca8880069471已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_0269d064dca0e33d.exe 2025-07-10 09:56:23 恶意软件(HEUR/QVM10.2.95BA.Malware.Gen)MD5:c7edea82a1abefe84502a88980b86356已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_98f344f33553ad04.exe 2025-07-10 09:55:20 恶意软件(HEUR/QVM10.2.95BA.Malware.Gen)MD5:8bb531f637cdae52b17ecab88b28b88d已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_32027bfd1919.exe 2025-07-10 09:54:37 恶意软件(HEUR/QVM10.2.95BA.Malware.Gen)MD5:f03cac215d14019e60e97a0a9dff564a已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_dc0e4952f25d.exe 2025-07-10 09:54:16 恶意软件(HEUR/QVM10.2.95BA.Malware.Gen)MD5:79f41c9ca52f656e0d14d7f99a7c0361已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_d0d314c24b51.exe 2025-07-10 09:36:22 恶意软件(HEUR/QVM10.2.958D.Malware.Gen)MD5:7a8102febd74e861b0f798e130e3bbdf已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_3766493edd57.exe 2025-07-10 09:35:48 恶意软件(HEUR/QVM10.2.958D.Malware.Gen)MD5:ceaa9c2e0ae64a9242eae202c127970a已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_e6c9d5d7be4e.exe 2025-07-10 09:34:47 恶意软件(HEUR/QVM10.2.958D.Malware.Gen)MD5:7cfe0a2c5d8fbce0d86a01613bef166e已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_e3d311d2cf8e.exe 2025-07-10 09:31:31 恶意软件(HEUR/QVM10.2.958D.Malware.Gen)MD5:416cfe49e997da0d85efc5eac7cd33f3已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server.exe 2025-07-10 09:18:33 恶意软件(HEUR/QVM10.2.958D.Malware.Gen)MD5:1dae68d1345fe77c6427f8f36ef257a3已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_100a4418.exe 2025-07-10 09:17:27 恶意软件(HEUR/QVM10.2.958D.Malware.Gen)MD5:22be3cbbdaf6adc964323e6cd7b1830e已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_a423e3f7.exe 2025-07-10 09:16:34 恶意软件(HEUR/QVM10.2.958D.Malware.Gen)MD5:19811a97d4f619ccc30fbd9355710c94已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_42c8f493.exe 2025-07-10 09:15:28 恶意软件(HEUR/QVM10.2.9551.Malware.Gen)MD5:603aa37cafcc1a97ba7d3b6944e7c44f已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_1870a4d5.exe 2025-07-10 09:15:28 恶意软件(HEUR/QVM10.2.9551.Malware.Gen)MD5:f4f3aaa34d45f6d392ab02d469529fa2已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_6ef68774.exe 2025-07-10 09:02:21 恶意软件(HEUR/QVM10.2.9551.Malware.Gen)MD5:d963a3b990e387d512c1505cc1defc2d已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\appdata\local\temp\vmware-odaycaogen'\vmwarednd\4e3bc625\server_protected_b162fbecda18.exe 2025-07-10 09:02:20 恶意软件(HEUR/QVM10.2.9551.Malware.Gen)MD5:d963a3b990e387d512c1505cc1defc2d已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_b162fbecda18.exe 2025-07-10 09:01:55 恶意软件(HEUR/QVM10.2.9551.Malware.Gen)MD5:6613a15d293baa581027037940f38123已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_0c7cdb86447c.exe 2025-07-10 09:01:13 恶意软件(HEUR/QVM10.2.9551.Malware.Gen)MD5:6e784a5d6e4c5cd3e102341571186c02已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_91770c617ba9.exe 2025-07-10 09:00:26 恶意软件(HEUR/QVM10.2.9551.Malware.Gen)MD5:ebaba98d0a9815b21c637a4f2cb2fea8已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_c5080514e48f.exe 2025-07-10 08:59:26 恶意软件(HEUR/QVM10.2.9551.Malware.Gen)MD5:3e2c4fc7477c93fe7446866dfa0c0d2a已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_917a4f029497.exe 2025-07-10 08:59:00 恶意软件(HEUR/QVM10.2.9551.Malware.Gen)MD5:fce5281cf86dca7226f2dde2764ceee1已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_e3ea24fe8204.exe 2025-07-09 20:41:17 恶意软件(HEUR/QVM10.2.9279.Malware.Gen)MD5:28391ff043ea6b95c0a22c42b827fd13已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_d94e61705c0d.exe 2025-07-09 20:39:48 恶意软件(HEUR/QVM10.2.9279.Malware.Gen)MD5:0dbbcc8071f854fa75fe485c055e9cb0已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_df81323ec213.exe 2025-07-09 20:39:17 恶意软件(HEUR/QVM10.2.9279.Malware.Gen)MD5:1d3e05e3d94613d048aff46974c9eae5已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_08d18b05d328.exe 2025-07-09 20:38:43 恶意软件(HEUR/QVM10.2.9279.Malware.Gen)MD5:cd26422e884d3110bc75080d27c1c069已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_e06bbef612d8.exe 2025-07-09 20:38:08 恶意软件(HEUR/QVM10.2.9279.Malware.Gen)MD5:8b12ffcdf948eca4636292ee8399b390已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_61f1aadc6f43.exe 2025-07-09 20:37:25 恶意软件(HEUR/QVM10.2.9279.Malware.Gen)MD5:7eb6481e075f5eeb5465e6395b55db92已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\users\odaycaogen'\desktop\server_protected_789d8774794b.exe 2025-07-09 18:54:48 恶意软件(HEUR/QVM10.2.9231.Malware.Gen)MD5:5c7d6aec8656f4850e914408c8779c35已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\program files\360\360safe\softmgr\whitelist\myapp_36171265\454336_protected_9d9289dd.exe 2025-07-09 18:54:43 恶意软件(HEUR/QVM10.2.9231.Malware.Gen)MD5:5c7d6aec8656f4850e914408c8779c35已删除此文件,如果您发现误删,可从隔离区恢复此文件。 c:\program files\360\360safe\softmgr\whitelist\myapp_36170329\454336_protected_9d9289dd.exe 2025-07-09 18:48:32 恶意软件(HEUR/QVM10.2.9231.Malware.Gen)MD5:8b18925bca5cf9c236bae2ed5f39e67c已删除此文件,如果您发现误删,可从隔离区恢复此文件。 输出完整源码
07-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值