闲着无事写了个CEAA的脚本
本帖最后由 十二 于 2011-10-22 11:39 编辑好长时间没来了
//by:nt_12
alloc(newmem,9966000)
label(returnhere)
label(SEH)
label(originalcode)
label(xxxx)//SEH链
label(PEhandle)
label(Addressloop)
label(WIN7)
label(WINXP)
label(Addressloop1)
label(TTT9)
label(ASD)
label(VBV)
label(JJH)
label(IIU)
label(XCV)
label(GGHG)
label(WIN7Base)
label(UUU9)
label(BNCE)
label(ZCV)
label(MMN)
label(KJH)
label(YBN)
label(KMNJ)
label(LKJ)
label(SDF)
label(QWE)
label(baseloop)
define(base,"newmem"+800)//模块基址
define(espsc,"newmem"+7FC)//原始ESP
define(ver,"newmem"+7F8)//系统版本
define(number,"newmem"+7F4)//函数序号
define(ikns,"newmem"+7EC)//原始页面权限信息
define(vp,"newmem"+7F0)//virtualprotect函数地址
define(loader,"newmem"+100000)//备份后代码和数据的位置 //*根据自己的情况修改大小
define(BCB,"newmem"+1000)//.text区段位置
define(HYCC,"newmem"+1100)//还原代码
define(DCD,"newmem"+1200)//.text区段大小
define(dllenter,"newmem"+800)//程序载入模块基址列表 //*根据自己的情况修改大小
define(APIAddress,"newmem"+10000)//模块函数地址列表 //*根据自己的情况修改大小
define(FSTSWAX,"newmem"+80000)//FSTSW AX指令引用的所在位置 //*根据自己的情况修改大小
//label(CMP2)
//label(CMP1)
//label(HYIM)
newmem: //this is allocated memory, you have read,write,execute access
//place your code here
originalcode:
MOV ,ESP
// 这里写入被注入地址的原代码
//建立SEH链
xxxx:
JMP LKJ
KJH:
xor eax,eax
PUSH SEH
PUSH DWORD PTR FS:
MOV DWORD PTR FS:,ESP
//JMP loader //执行备份的代码并跳到SEH,需要注释掉Xor Eax,Eax,与 Div Eax
DIV EAX
LKJ:
//我能得到模块的基址
PUSHAD
MOV EBX,dllenter
MOV EAX,DWORD PTR FS:
MOV ECX,EAX
ADD ECX,8
MOV ECX,
MOV ,ECX
ADD EBX,4
MOV EAX,DWORD PTR DS:
MOV EAX,DWORD PTR DS:
baseloop:
MOV EDI,EAX
MOV EAX,DWORD PTR DS:
MOV DWORD PTR DS:,EAX
ADD EBX,4
CMP EAX,0
MOV EAX,EDI
MOV EAX,DWORD PTR DS:
MOV EDI,EAX
JNZ baseloop
POPAD
//我能获得模块导出函数
PUSHAD
MOV EAX,dllenter
MOV EDI,APIAddress //API位置存放的位置
Addressloop1:
MOV EBX,
PUSH EAX
MOV ,EBX
MOV ECX,DWORD PTR DS://获取基址
MOV EAX,ECX
PEhandle:
ADD EAX,4
MOV ECX,DWORD PTR DS:
CMP ECX,4550
JNZ PEhandle
ADD EAX,78
MOV ECX,EAX
MOV ECX,
MOV ESI,
ADD ESI,ECX
ADD ESI,1C
MOV EDX, // 函数的数量
ADD EBX, //函数的地址
MOV EAX,
ADD EAX,DWORD PTR DS:
Addressloop:
MOV ECX,
MOV EAX,
ADD EAX,ECX
ADD EBX,4
MOV ,EAX
ADD EDI,4
DEC EDX
CMP EDX,-1
JNZ Addressloop
ADD EDI,4
POP EAX
PUSHFD
ADD EAX,4
POPFD
CMP ,0
JNZ Addressloop1
POPAD
//我能遍历当前模块代码段中的的所有FSTSW AX代码(其实能遍历任意代码)
PUSHAD
MOV EAX,
MOV EDI,
ASD:
ADD EAX,4
MOV ECX,DWORD PTR DS:
CMP ECX,4550
JNZ ASD
MOV EDX,DWORD PTR DS:
MOV EAX,DWORD PTR DS:
ADD EAX,EDI //模块第一个区段的起始地址
//↓我是备份代码-数据用的
/*
PUSHAD
MOV ,EAX //保存.text区段位置
MOV ,EDX //保存.text区段大小
MOV EDI,loader
CMP1:
MOV BL, //备份.text区段
MOV ,BL //开始备份
INC EAX //OEP+1
INC EDI
DEC EDX //大小-1
CMP EDX,0 //查看是否全部备份完
JNZ CMP1
POPAD
*/
//----------------------------------------------------
//↓我是还原代码-数据用的
/*
MOV,,1 //标志位
JMP GGHG
HYIM:
PUSH ikns
PUSH 40
PUSH
PUSH
CALL
PUSHAD
MOV EDI,
MOV EBX, //还原的大小
MOV EDX,loader
CMP2:
MOV BL,
MOV ,BL
INC EDI
INC EDX
DEC EBX
CMP EBX,0
JNZ CMP2
POPAD
JMP UUU9
*/
GGHG:
MOV EBX,FSTSWAX
QWE:
CMP EDX,0
PUSHFD
DEC EDX
POPFD
JE XCV
SDF:
ADD EAX,1
MOV CL,BYTE PTR DS:
CMP CL,0DF //要遍历的指令HEX码
JNZ QWE
ADD EAX,1
MOV CL,BYTE PTR DS:
CMP CL,0E0 //要遍历的指令HEX码
JNZ SDF
DEC EAX
MOV ,EAX
ADD EBX,4
INC EAX
JMP SDF
XCV:
MOV EAX,DWORD PTR FS: // 获取PEB
MOV EAX,DWORD PTR DS: //获取系统版本
CMP EAX,5
MOV ,EAX
JNZ WIN7
WINXP:
MOV EAX, //WINXP 硬编获取KiUserExceptionDispatcher异常处理函数
WIN7:
MOV EAX, //WIN7 硬编获取KiUserExceptionDispatcher异常处理函数
VBV:
ADD EAX,1
CMP BYTE PTR ,E8
JNZ VBV
MOV EDI,EAX
ADD EAX,1
MOV EBX,EAX
MOV EBX,
ADD EDI,EBX
ADD EDI,5
MOV EAX,EDI
ZCV:
ADD EAX,1
CMP BYTE PTR ,FF
JNZ ZCV
ADD EAX,1
CMP BYTE PTR ,73
JNZ ZCV
ADD EAX,1
CMP BYTE PTR ,04
JNZ ZCV
ADD EAX,1
CMP BYTE PTR ,8D
JNZ ZCV
ADD EAX,1
CMP BYTE PTR ,45
JNZ ZCV
ADD EAX,1
CMP BYTE PTR ,EC
JNZ ZCV
ADD EAX,1
CMP BYTE PTR ,50
JNZ ZCV
ADD EAX,1
CMP BYTE PTR ,FF
JNZ ZCV
ADD EAX,1
CMP BYTE PTR ,75
JNZ ZCV
ADD EAX,1
CMP BYTE PTR ,0C
JNZ ZCV
ADD EAX,1
CMP BYTE PTR ,53
JNZ ZCV
ADD EAX,1
CMP BYTE PTR ,56
JNZ ZCV
SUB EAX,11
MOV EBX,6
PUSH EAX
PUSH EBX
IIU:
JMP KMNJ //处理VirtualProtect函数
UUU9:
POP EBX
POP EAX
TTT9:
MOV BYTE PTR ,90
INC EAX
DEC EBX
CMP EBX,0
JNZ TTT9
//KiRaiseUserExceptionDispatcher Patch Win7 SEH BUG
POPAD
JMP KJH
PUSHAD //去掉ntdll的区段保护
KMNJ:
CMP ,5
JNZ WIN7Base
//Xp下的Kernel32.dll基址
MOV EAX,APIAddress
MOV EBX,2 //XP取kernel32.dll的基址
MOV ,DD4//硬编XP virtualprotect函数序号
JMP JJH
WIN7Base:
MOV EAX,APIAddress
MOV ,13BC//硬编WIN7 virtualprotect函数序号
MOV EBX,3 //WIN7取kernel32.dll的基址
JJH:
ADD EAX,4
CMP DWORD PTR ,0
JNZ JJH
DEC EBX
CMP EBX,0
JNZ JJH
ADD EAX,4
MOV ECX,
MOV EAX, //得到virtualprotect
MOV EBX,//ntdll基址送EBX
MOV EDX,//ntdll基址送EDX
BNCE:
ADD EBX,4
MOV EDI,DWORD PTR DS:
CMP EDI,7865742E
JNZ BNCE
ADD EBX,8
MOV ESI,
ADD EBX,4
MOV EBX,
ADD EBX,EDX
PUSH ikns
PUSH 40
PUSH ESI
PUSH EBX
MOV ,EAX
CALL EAX //调用virtualprotect
CMP ,0
JNZ HYIM
JMP UUU9
//读取FSTSW AX完毕,详见FSTSWAX,"newmem"+10000用SEH引发异常 JMP Loader 效果更佳
//得到函数地址后需要对照相应系统,系统模块导出表中的序列号进行对照然后调用
//到此这个CE脚本可以实现大部分API的调用和平时所需了
// 在此处码任意代码即可用导出的函数地址进行 PUSHCALL 调用系统API
//--------------------------------------------------------
SEH:
//这里写异常处理代码
MOV EAX,DWORD PTR SS:
XOR ESI,ESI//---------寄存器清0
//---------------------------------------------------------
MOV EDI,
YBN:
ADD EDI,4
MOV ECX,DWORD PTR DS:
CMP ECX,4550
JNZ YBN
ADD EDI,28
MOV ECX,
ADD ECX,
ADD ECX,5 // OEP 指令偏移检测是否写入硬件断点
CMP ECX,returnhere
JNZ MMN
MOV EDI,
SUB EDI,4
MOV DWORD PTR DS:,EDI//---------DR0写入ESP硬件断点
MOV DWORD PTR DS:,???//硬件断点属性
XOR EDI,EDI
//---------------------------------------------------------
MMN:
//MOV DWORD PTR DS:,ESI//---------调试寄存器iDR0寄存器清0
//MOV DWORD PTR DS:,ESI//---------调试寄存器iDR1寄存器清0
//MOV DWORD PTR DS:,ESI//---------调试寄存器iDR2寄存器清0
//MOV DWORD PTR DS:,ESI//---------调试寄存器iDR3寄存器清0
//MOV DWORD PTR DS:,ESI//---------调试寄存器iDR6寄存器清0
//MOV DWORD PTR DS:,ESI//---------调试寄存器iDR7寄存器清0
//MOV DWORD PTR DS:,ESI//---------regGs段寄存器清0
//MOV DWORD PTR DS:,ESI//---------regFs段寄存器清0
//MOV DWORD PTR DS:,ESI//---------regEs段寄存器清0
//MOV DWORD PTR DS:,ESI//---------regDs段寄存器清0
//MOV DWORD PTR DS:,ESI//---------regEdi寄存器清0
//MOV DWORD PTR DS:,ESI//---------regEsi寄存器清0
//MOV DWORD PTR DS:,ESI//---------regEbx寄存器清0
//MOV DWORD PTR DS:,ESI//---------regEdx寄存器清0
//MOV DWORD PTR DS:,ESI//---------regEcx寄存器清0
//MOV DWORD PTR DS:,ESI//---------regEax寄存器清0
//MOV DWORD PTR DS:,ESI//---------regEbp寄存器清0
//MOV DWORD PTR DS:,ESI//---------regCs代码段寄存器清0
//MOV DWORD PTR DS:,ESI//---------regFlag标志寄存器清0
//MOV DWORD PTR DS:,ESI//---------regEsp寄存器清0
//MOV DWORD PTR DS:,ESI//---------regSs段寄存器清0
MOV DWORD PTR DS:,returnhere//---------这里是即将要跳到的位置
XOR EAX,EAX
RETN
"pe.exe"+1000: //注入代码的位置
jmp newmem //返回地址 占用5字节对应OEP字节
returnhere:
大部分功能都注释了 就不贴脚本功能了 另:WIN7真蛋疼 - =
我看都没人敢回十二神触的帖子了 。。。。。。。。。。。。修正了几个BUG,跑了趟网吧取了XP的virtualprotect序号 - =
#2L
估计是太渣了没人看 回复 十二 的帖子
是太触了看不懂 回复 漆黑之翼 的帖子
真心渣,用VC估计几十行就完事了,汇编是蠢B的语言。
然后借地问一下 Settransform 设置完变换矩阵的时候 顶点信息在哪里?如果这时候要取变换完得顶点数据应该怎么做? 继续更新改变了一下备份策略,囧又挖了一大坑
页:
[1]