|
发表于 2021-7-7 03:29:34
|
显示全部楼层
湖北省黄冈市
.版本 2
.子程序 枚举NT功能号
.局部变量 模块计次, 整数型, , , 1=ntdll.dll 2=user32.dll 3=gdi32.dll
.局部变量 临时文件, 文本型
.局部变量 模块文件, 文本型
.局部变量 模块数据, 字节集
.局部变量 数据指针, 整数型
.局部变量 R3句柄, 整数型
.局部变量 模块句柄, 整数型
.局部变量 映像, PE_映像
.局部变量 区段, PE_区段, , "0"
.局部变量 函数, 函数导出表, , "0"
.局部变量 TEMP, NT功能号
.局部变量 指令, 字节集, , , API文件入口处的前X字节汇编机器码指令
.局部变量 指针, 整数型
.局部变量 计次, 整数型
.如果真 (取数组成员数 (NT功能号) = 0)
.计次循环首 (3, 模块计次)
.判断开始 (1 = 模块计次)
模块文件 = “ntdll.dll”
.判断 (2 = 模块计次)
模块文件 = “user32.dll”
.判断 (3 = 模块计次)
模块文件 = “gdi32.dll”
.默认
返回 ()
.判断结束
TEMP.DLL名称 = 模块计次
模块句柄 = 取模块句柄 (模块文件)
临时文件 = 取临时文件名 ()
复制文件_ (取System路径 () + “\” + 模块文件, 临时文件, 假)
模块数据 = 读入文件 (临时文件)
数据指针 = 取字节集指针 (模块数据)
删除文件 (临时文件)
.如果真 (取模块映像 (数据指针, 映像, 假) 且 映像.PE_标志 = 267) ' 验证是否32位
R3句柄 = 0
R3句柄 = VirtualAllocEx (-1, 0, 映像.映像大小, OR_ (4096, 8192), 64) ' 申请随机内存地址处装载
内存_写入内存_ (R3句柄, 数据指针, 映像.头部大小) ' 复制DOS头,PE头块,区段表等头数据
.计次循环首 (取模块区段 (数据指针, 区段, ), 计次) ' 复制DLL中的所有区块数据
内存_写入内存_ (ADD__ (R3句柄, 区段 [计次].虚拟偏移), ADD__ (数据指针, 区段 [计次].文件偏移), 区段 [计次].原始大小)
.计次循环尾 ()
修正重定位 (R3句柄, 模块句柄)
清除数组 (区段)
.计次循环首 (取模块导出表 (R3句柄, 函数), 计次)
.如果真 (模块计次 = 1) ' ntdll.dll
.如果真 (取代码 (函数 [计次].API名称, 1) ≠ 90 或 取代码 (函数 [计次].API名称, 2) ≠ 119) ' 非 Zw 开头的API跳过
到循环尾 ()
.如果真结束
.如果真结束
.如果真 (内存_读字节集_ (函数 [计次].API入口, 指令, 32) 且 184 = 指令 [1]) ' B8 XXXXXXXX MOV EAX,XXXXXXXX
TEMP.API名称 = 函数 [计次].API名称
TEMP.RETN_XX = 0
TEMP.SSDT_ID = 取字节集数据 (指令, #整数型, 2)
.判断开始 (版本.主版本号 = 5 且 版本.次版本号 = 0) ' Windows 2000
' B8 E1110000 MOV EAX,11E1 ' eax=ssdt
' 8D5424 04 LEA EDX,DWORD PTR SS:[ESP+4] ' edx=指向参数
' CD 2E INT 2E ' 转入内核.返回到下一条指令
' C2 0C00 RETN 0C ' ret
' ZwCallbackReturn ZwContinue ZwRaiseException 此三API在内核返回后可能接 JMP 指令..2K.SP4
' 77F96BE5 > B8 13000000 mov eax, 13
' 77F96BEA 8D5424 04 lea edx, dword ptr [esp+4]
' 77F96BEE CD 2E int 2E
' 77F96BF0 E9 D8350000 jmp 77F9A1CD
' 77F9A1CD C2 0C00 RETN 0C JMP到这里
.如果真 (指令 [10] = 205 且 指令 [11] = 46) ' INT 2E
.判断开始 (指令 [12] = 194) ' C2=194 C3=195
TEMP.RETN_XX = 取字节集数据 (指令, #短整数型, 13)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.判断 (指令 [12] = 195)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.判断 (指令 [12] = 233) ' JMP
指针 = ADD__ (指针, 16)
指针 = ADD__ (指针, 取字节集数据 (指令, #整数型, 13))
内存_读字节集_ (指针, 指令, 32) ' C2 0C00 RETN 0C JMP到这里
.判断开始 (指令 [1] = 194) ' C2=194 C3=195
TEMP.RETN_XX = 取字节集数据 (指令, #短整数型, 2)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.判断 (指令 [1] = 195)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.默认
.判断结束
.默认
.判断结束
.如果真结束
.判断 (版本.Win64)
TEMP.ECX = 0
.如果真 (指令 [6] = 100 且 指令 [7] = 255 且 指令 [9] = 192) ' Win8.x64
' 77621FBC > B8 97010000 mov eax, 197
' 77621FC7 64:FF15 C0000000 call dword ptr fs:[C0]
' 77621FD1 C2 1000 retn 10 ' ret
.判断开始 (指令 [13] = 194) ' temp.ECX = 0
TEMP.RETN_XX = 取字节集数据 (指令, #短整数型, 14)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.判断 (指令 [13] = 195)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.默认
.判断结束
.如果真结束
.如果真 (指令 [6] = 51 且 指令 [8] = 141 且 指令 [12] = 100) ' xor ecx, ecx
' 77621FBC > B8 97010000 mov eax, 197 ' Win7.x64 2008.x64
' 77621FC1 33C9 xor ecx, ecx
' 77621FC3 8D5424 04 lea edx, dword ptr [esp+4]
' 77621FC7 64:FF15 C0000000 call dword ptr fs:[C0]
' 77621FCE 83C4 04 add esp, 4
' 77621FD1 C2 1000 retn 10 ' ret
' 772A9808 > B8 44000000 mov eax, 44 'XP.X64 2003.x64 Vista.X64
' 77621FC1 33C9 xor ecx, ecx
' 772A9812 8D5424 04 lea edx, dword ptr [esp+4]
' 772A9816 64:FF15 C0000000 call dword ptr fs:[C0]
' 772A981D C2 0C00 retn 0C ' ret
.判断开始 (指令 [19] = 195 或 指令 [22] = 195) ' ret
加入成员 (NT功能号, TEMP)
到循环尾 ()
.判断 (指令 [19] = 194)
TEMP.RETN_XX = 取字节集数据 (指令, #短整数型, 20)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.判断 (指令 [22] = 194)
TEMP.RETN_XX = 取字节集数据 (指令, #短整数型, 23)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.默认
' temp.ECX = 0
.判断结束
.如果真结束
.如果真 (指令 [6] = 141 且 指令 [10] = 51 且 指令 [12] = 100) ' xor ecx, ecx 未知
' 76858330 > B8 18100000 mov eax, 1018 ' Vista.X64
' 76858335 8D5424 04 lea edx, dword ptr [esp+4]
' 77621FC1 33C9 xor ecx, ecx
' 7685833E 64:FF15 C0000000 call dword ptr fs:[C0]
' 77621FCE 83C4 04 add esp, 4
' 76858345 C2 1000 retn 10 ' ret
' 76858330 > B8 18100000 mov eax, 1018 ' 2003.x64 Vista.X64
' 76858335 8D5424 04 lea edx, dword ptr [esp+4]
' 77621FC1 33C9 xor ecx, ecx
' 7685833E 64:FF15 C0000000 call dword ptr fs:[C0]
' 76858345 C2 1000 retn 10 ' ret
.判断开始 (指令 [19] = 195 或 指令 [22] = 195) ' ret
加入成员 (NT功能号, TEMP)
到循环尾 ()
.判断 (指令 [19] = 194)
TEMP.RETN_XX = 取字节集数据 (指令, #短整数型, 20)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.判断 (指令 [22] = 194)
TEMP.RETN_XX = 取字节集数据 (指令, #短整数型, 23)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.默认
' temp.ECX = 0
.判断结束
.如果真结束
.如果真 (指令 [6] = 185 且 指令 [11] = 141 且 指令 [15] = 100) ' mov ecx,xxxxx
' 77621D50 > B8 7E010000 mov eax, 17E ; Win7.x64 2008.x64
' 77621D55 B9 02000000 mov ecx, 2 ; mov ecx, 0
' 77621D5A 8D5424 04 lea edx, dword ptr [esp+4]
' 77621D5E 64:FF15 C0000000 call dword ptr fs:[C0]
' 77621D65 83C4 04 add esp, 4
' 77621D68 C3 retn ; retn 0C
' 772A9808 > B8 44000000 mov eax, 44 ; XP.X64 2003.x64 Vista.X64
' 772A980D B9 0A000000 mov ecx, 0A ; mov ecx, 0
' 772A9812 8D5424 04 lea edx, dword ptr [esp+4]
' 772A9816 64:FF15 C0000000 call dword ptr fs:[C0]
' 772A981D C2 0C00 retn 0C ; retn
TEMP.ECX = 取字节集数据 (指令, #整数型, 7)
.判断开始 (指令 [22] = 195 或 指令 [25] = 195) ' ret
加入成员 (NT功能号, TEMP)
到循环尾 ()
.判断 (指令 [22] = 194)
TEMP.RETN_XX = 取字节集数据 (指令, #短整数型, 23)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.判断 (指令 [25] = 194)
TEMP.RETN_XX = 取字节集数据 (指令, #短整数型, 26)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.默认
TEMP.ECX = 0
.判断结束
.如果真结束
.如果真 (指令 [6] = 141 且 指令 [10] = 185 且 指令 [15] = 100) ' mov ecx, xxxxxxxx
' 77621D50 > B8 7E010000 mov eax, 17E ; Vista.X64
' 77621D5A 8D5424 04 lea edx, dword ptr [esp+4]
' 77621D55 B9 02000000 mov ecx, 2 ; mov ecx, 0
' 77621D5E 64:FF15 C0000000 call dword ptr fs:[C0]
' 77621D65 83C4 04 add esp, 4
' 77621D68 C3 retn ; retn 0C
' 772A9808 > B8 44000000 mov eax, 44 ; XP.64 2003.x64 Vista.X64
' 772A9812 8D5424 04 lea edx, dword ptr [esp+4]
' 772A980D B9 0A000000 mov ecx, 0A ; mov ecx, 0
' 772A9816 64:FF15 C0000000 call dword ptr fs:[C0]
' 772A981D C2 0C00 retn 0C ; retn
TEMP.ECX = 取字节集数据 (指令, #整数型, 11)
.判断开始 (指令 [22] = 195 或 指令 [25] = 195) ' ret
加入成员 (NT功能号, TEMP)
到循环尾 ()
.判断 (指令 [22] = 194)
TEMP.RETN_XX = 取字节集数据 (指令, #短整数型, 23)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.判断 (指令 [25] = 194)
TEMP.RETN_XX = 取字节集数据 (指令, #短整数型, 26)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.默认
TEMP.ECX = 0
.判断结束
.如果真结束
' 20170715从下面复制来这里,用于WIN10系统
.判断开始 (指令 [6] = 186 且 指令 [11] = 255) ' XP.SP2 2003 Vista Win7 (还有WIN10系统?20170715)
' 779394DB > B8 0D120000 MOV EAX,120D ; eax=ssdt
' 779394E0 BA 0003FE7F MOV EDX,7FFE0300
' 779394E5 FF12 CALL DWORD PTR DS:[EDX] ; ntdll.KiFastSystemCall
' 779394E7 C2 0C00 RETN 0C ; ret
' 76E770B0 > 8BD4 mov edx, esp ; ntdll.KiFastSystemCall
' 76E770B2 0F34 sysenter
' 76E770B4 > C3 retn ; ntdll.KiFastSystemCallRet
' 00872453 >/$ B8 26000000 mov eax, 26 ' 忘了哪个系统的了
' 00872458 |. BA 0003FE7F mov edx, 7FFE0300
' 0087245D |. FFD2 call edx
' 0087245F \. C2 0C00 retn 0C
.如果真 (指令 [12] = 18 或 指令 [12] = 210)
.判断开始 (指令 [13] = 194) ' C2=194 C3=195
TEMP.RETN_XX = 取字节集数据 (指令, #短整数型, 14)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.判断 (指令 [13] = 195)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.默认
.判断结束
.如果真结束
.默认
.判断结束
.判断 (指令 [6] = 232) ' WIN8.32
' 76F15B34 > B8 44010000 mov eax, 144 ntdll.dll
' 76F15B39 E8 03000000 call 76F15B41
' 76F15B3E C2 1400 retn 14
' 76F15B41 8BD4 mov edx, esp
' 76F15B43 0F34 sysenter
' 76F15B45 C3 retn
' 76A45C21 > B8 F8100000 mov eax, 10F8 user32.dll gdi32.dll
' 76A45C26 E8 08000000 call 76A45C33 1,3,6,8
' 76A45C2B C2 1800 retn 18
' 76A45C2E 90 nop
' 76A45C2F 90 nop
' 76A45C30 90 nop
' 76A45C31 90 nop
' 76A45C32 90 nop
' 76A45C33 8BD4 mov edx, esp
' 76A45C35 0F34 sysenter
' 76A45C37 C3 retn
指针 = 取字节集数据 (指令, #整数型, 7)
.如果真 (指针 > 0 且 指针 < 10) ' 11+API指针+2=15(sysenter)
指针 = ADD__ (指针, 13)
.如果真 (15 = 指令 [指针]) ' sysenter
.判断开始 (指令 [11] = 194) ' C2=194 C3=195
TEMP.RETN_XX = 取字节集数据 (指令, #短整数型, 12)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.判断 (指令 [11] = 195)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.默认
.判断结束
.如果真结束
.如果真结束
.判断 (指令 [6] = 186 且 指令 [11] = 255) ' XP.SP2 2003 Vista Win7
' 779394DB > B8 0D120000 MOV EAX,120D ; eax=ssdt
' 779394E0 BA 0003FE7F MOV EDX,7FFE0300
' 779394E5 FF12 CALL DWORD PTR DS:[EDX] ; ntdll.KiFastSystemCall
' 779394E7 C2 0C00 RETN 0C ; ret
' 76E770B0 > 8BD4 mov edx, esp ; ntdll.KiFastSystemCall
' 76E770B2 0F34 sysenter
' 76E770B4 > C3 retn ; ntdll.KiFastSystemCallRet
' 00872453 >/$ B8 26000000 mov eax, 26 ' 忘了哪个系统的了
' 00872458 |. BA 0003FE7F mov edx, 7FFE0300
' 0087245D |. FFD2 call edx
' 0087245F \. C2 0C00 retn 0C
.如果真 (指令 [12] = 18 或 指令 [12] = 210)
.判断开始 (指令 [13] = 194) ' C2=194 C3=195
TEMP.RETN_XX = 取字节集数据 (指令, #短整数型, 14)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.判断 (指令 [13] = 195)
加入成员 (NT功能号, TEMP)
到循环尾 ()
.默认
.判断结束
.如果真结束
.默认
.判断结束
.如果真结束
.计次循环尾 ()
内存_释放内存 (-1, R3句柄)
.如果真结束
.计次循环尾 ()
.如果真结束
|
|