本帖最后由 十二 于 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 [espsc],ESP
- // 这里写入被注入地址的原代码
- //建立SEH链
- xxxx:
- JMP LKJ
- KJH:
- xor eax,eax
- PUSH SEH
- PUSH DWORD PTR FS:[0]
- MOV DWORD PTR FS:[0],ESP
- //JMP loader //执行备份的代码并跳到SEH,需要注释掉Xor Eax,Eax,与 Div Eax
- DIV EAX
- LKJ:
- //我能得到模块的基址
- PUSHAD
- MOV EBX,dllenter
- MOV EAX,DWORD PTR FS:[30]
- MOV ECX,EAX
- ADD ECX,8
- MOV ECX,[ECX]
- MOV [EBX],ECX
- ADD EBX,4
- MOV EAX,DWORD PTR DS:[EAX+C]
- MOV EAX,DWORD PTR DS:[EAX+1C]
- baseloop:
- MOV EDI,EAX
- MOV EAX,DWORD PTR DS:[EAX+8]
- MOV DWORD PTR DS:[EBX],EAX
- ADD EBX,4
- CMP EAX,0
- MOV EAX,EDI
- MOV EAX,DWORD PTR DS:[EAX]
- MOV EDI,EAX
- JNZ baseloop
- POPAD
- //我能获得模块导出函数
- PUSHAD
- MOV EAX,dllenter
- MOV EDI,APIAddress //API位置存放的位置
- Addressloop1:
- MOV EBX,[EAX]
- PUSH EAX
- MOV [newmem+2800],EBX
- MOV ECX,DWORD PTR DS:[newmem+2800]//获取基址
- MOV EAX,ECX
- PEhandle:
- ADD EAX,4
- MOV ECX,DWORD PTR DS:[EAX]
- CMP ECX,4550
- JNZ PEhandle
- ADD EAX,78
- MOV ECX,EAX
- MOV ECX,[ECX]
- MOV ESI,[newmem+2800]
- ADD ESI,ECX
- ADD ESI,1C
- MOV EDX,[esi-8] // 函数的数量
- ADD EBX,[ESI] //函数的地址
- MOV EAX,[EBX]
- ADD EAX,DWORD PTR DS:[newmem+2800]
- Addressloop:
- MOV ECX,[EBX]
- MOV EAX,[newmem+2800]
- ADD EAX,ECX
- ADD EBX,4
- MOV [EDI],EAX
- ADD EDI,4
- DEC EDX
- CMP EDX,-1
- JNZ Addressloop
- ADD EDI,4
- POP EAX
- PUSHFD
- ADD EAX,4
- POPFD
- CMP [EAX],0
- JNZ Addressloop1
- POPAD
- //我能遍历当前模块代码段中的的所有FSTSW AX代码(其实能遍历任意代码)
- PUSHAD
- MOV EAX,[base]
- MOV EDI,[base]
- ASD:
- ADD EAX,4
- MOV ECX,DWORD PTR DS:[EAX]
- CMP ECX,4550
- JNZ ASD
- MOV EDX,DWORD PTR DS:[EAX+100]
- MOV EAX,DWORD PTR DS:[EAX+104]
- ADD EAX,EDI //模块第一个区段的起始地址
- //↓我是备份代码-数据用的
- /*
- PUSHAD
- MOV [BCB],EAX //保存.text区段位置
- MOV [DCD],EDX //保存.text区段大小
- MOV EDI,loader
- CMP1:
- MOV BL,[EAX] //备份.text区段
- MOV [EDI],BL //开始备份
- INC EAX //OEP+1
- INC EDI
- DEC EDX //大小-1
- CMP EDX,0 //查看是否全部备份完
- JNZ CMP1
- POPAD
- */
- //----------------------------------------------------
- //↓我是还原代码-数据用的
- /*
- MOV,[HYCC],1 //标志位
- JMP GGHG
- HYIM:
- PUSH ikns
- PUSH 40
- PUSH [DCD]
- PUSH [BCB]
- CALL [vp]
- PUSHAD
- MOV EDI,[BCB]
- MOV EBX,[DCD] //还原的大小
- MOV EDX,loader
- CMP2:
- MOV BL,[EDX]
- MOV [EDI],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:[EAX]
- CMP CL,0DF //要遍历的指令HEX码
- JNZ QWE
- ADD EAX,1
- MOV CL,BYTE PTR DS:[EAX]
- CMP CL,0E0 //要遍历的指令HEX码
- JNZ SDF
- DEC EAX
- MOV [EBX],EAX
- ADD EBX,4
- INC EAX
- JMP SDF
- XCV:
- MOV EAX,DWORD PTR FS:[30] // 获取PEB
- MOV EAX,DWORD PTR DS:[EAX+A4] //获取系统版本
- CMP EAX,5
- MOV [ver],EAX
- JNZ WIN7
- WINXP:
- MOV EAX,[APIAddress+BC] //WINXP 硬编获取KiUserExceptionDispatcher异常处理函数
- WIN7:
- MOV EAX,[APIAddress+1C4] //WIN7 硬编获取KiUserExceptionDispatcher异常处理函数
- VBV:
- ADD EAX,1
- CMP BYTE PTR [EAX],E8
- JNZ VBV
- MOV EDI,EAX
- ADD EAX,1
- MOV EBX,EAX
- MOV EBX,[EBX]
- ADD EDI,EBX
- ADD EDI,5
- MOV EAX,EDI
- ZCV:
- ADD EAX,1
- CMP BYTE PTR [EAX],FF
- JNZ ZCV
- ADD EAX,1
- CMP BYTE PTR [EAX],73
- JNZ ZCV
- ADD EAX,1
- CMP BYTE PTR [EAX],04
- JNZ ZCV
- ADD EAX,1
- CMP BYTE PTR [EAX],8D
- JNZ ZCV
- ADD EAX,1
- CMP BYTE PTR [EAX],45
- JNZ ZCV
- ADD EAX,1
- CMP BYTE PTR [EAX],EC
- JNZ ZCV
- ADD EAX,1
- CMP BYTE PTR [EAX],50
- JNZ ZCV
- ADD EAX,1
- CMP BYTE PTR [EAX],FF
- JNZ ZCV
- ADD EAX,1
- CMP BYTE PTR [EAX],75
- JNZ ZCV
- ADD EAX,1
- CMP BYTE PTR [EAX],0C
- JNZ ZCV
- ADD EAX,1
- CMP BYTE PTR [EAX],53
- JNZ ZCV
- ADD EAX,1
- CMP BYTE PTR [EAX],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 [EAX],90
- INC EAX
- DEC EBX
- CMP EBX,0
- JNZ TTT9
- //KiRaiseUserExceptionDispatcher Patch Win7 SEH BUG
- POPAD
- JMP KJH
- PUSHAD //去掉ntdll的区段保护
- KMNJ:
- CMP [ver],5
- JNZ WIN7Base
- //Xp下的Kernel32.dll基址
- MOV EAX,APIAddress
- MOV EBX,2 //XP取kernel32.dll的基址
- MOV [number],DD4//硬编XP virtualprotect函数序号
- JMP JJH
- WIN7Base:
- MOV EAX,APIAddress
- MOV [number],13BC//硬编WIN7 virtualprotect函数序号
- MOV EBX,3 //WIN7取kernel32.dll的基址
- JJH:
- ADD EAX,4
- CMP DWORD PTR [EAX],0
- JNZ JJH
- DEC EBX
- CMP EBX,0
- JNZ JJH
- ADD EAX,4
- MOV ECX,[number]
- MOV EAX,[EAX+ECX] //得到virtualprotect
- MOV EBX,[dllenter+4]//ntdll基址送EBX
- MOV EDX,[dllenter+4]//ntdll基址送EDX
- BNCE:
- ADD EBX,4
- MOV EDI,DWORD PTR DS:[EBX]
- CMP EDI,7865742E
- JNZ BNCE
- ADD EBX,8
- MOV ESI,[EBX]
- ADD EBX,4
- MOV EBX,[EBX]
- ADD EBX,EDX
- PUSH ikns
- PUSH 40
- PUSH ESI
- PUSH EBX
- MOV [vp],EAX
- CALL EAX //调用virtualprotect
- CMP [HYCC],0
- JNZ HYIM
- JMP UUU9
- //读取FSTSW AX完毕,详见FSTSWAX,"newmem"+10000用SEH引发异常 JMP Loader 效果更佳
- //得到函数地址后需要对照相应系统,系统模块导出表中的序列号进行对照然后调用
- //到此这个CE脚本可以实现大部分API的调用和平时所需了
- // 在此处码任意代码即可用导出的函数地址进行 PUSH CALL 调用系统API
- //--------------------------------------------------------
- SEH:
- //这里写异常处理代码
- MOV EAX,DWORD PTR SS:[ESP+C]
- XOR ESI,ESI//---------寄存器清0
- //---------------------------------------------------------
- MOV EDI,[base]
- YBN:
- ADD EDI,4
- MOV ECX,DWORD PTR DS:[EDI]
- CMP ECX,4550
- JNZ YBN
- ADD EDI,28
- MOV ECX,[base]
- ADD ECX,[EDI]
- ADD ECX,5 // OEP 指令偏移检测是否写入硬件断点
- CMP ECX,returnhere
- JNZ MMN
- MOV EDI,[espsc]
- SUB EDI,4
- MOV DWORD PTR DS:[EAX+4],EDI//---------DR0写入ESP硬件断点
- MOV DWORD PTR DS:[EAX+18],???//硬件断点属性
- XOR EDI,EDI
- //---------------------------------------------------------
- MMN:
- //MOV DWORD PTR DS:[EAX+4],ESI//---------调试寄存器iDR0寄存器清0
- //MOV DWORD PTR DS:[EAX+8],ESI//---------调试寄存器iDR1寄存器清0
- //MOV DWORD PTR DS:[EAX+C],ESI//---------调试寄存器iDR2寄存器清0
- //MOV DWORD PTR DS:[EAX+10],ESI//---------调试寄存器iDR3寄存器清0
- //MOV DWORD PTR DS:[EAX+14],ESI//---------调试寄存器iDR6寄存器清0
- //MOV DWORD PTR DS:[EAX+18],ESI//---------调试寄存器iDR7寄存器清0
- //MOV DWORD PTR DS:[EAX+8C],ESI//---------regGs段寄存器清0
- //MOV DWORD PTR DS:[EAX+90],ESI//---------regFs段寄存器清0
- //MOV DWORD PTR DS:[EAX+94],ESI//---------regEs段寄存器清0
- //MOV DWORD PTR DS:[EAX+98],ESI//---------regDs段寄存器清0
- //MOV DWORD PTR DS:[EAX+9C],ESI//---------regEdi寄存器清0
- //MOV DWORD PTR DS:[EAX+A0],ESI//---------regEsi寄存器清0
- //MOV DWORD PTR DS:[EAX+A4],ESI//---------regEbx寄存器清0
- //MOV DWORD PTR DS:[EAX+A8],ESI//---------regEdx寄存器清0
- //MOV DWORD PTR DS:[EAX+AC],ESI//---------regEcx寄存器清0
- //MOV DWORD PTR DS:[EAX+B0],ESI//---------regEax寄存器清0
- //MOV DWORD PTR DS:[EAX+B4],ESI//---------regEbp寄存器清0
- //MOV DWORD PTR DS:[EAX+BC],ESI//---------regCs代码段寄存器清0
- //MOV DWORD PTR DS:[EAX+C0],ESI//---------regFlag标志寄存器清0
- //MOV DWORD PTR DS:[EAX+C4],ESI//---------regEsp寄存器清0
- //MOV DWORD PTR DS:[EAX+C8],ESI//---------regSs段寄存器清0
- MOV DWORD PTR DS:[EAX+B8],returnhere//---------这里是即将要跳到的位置
- XOR EAX,EAX
- RETN
- "pe.exe"+1000: //注入代码的位置
- jmp newmem //返回地址 占用5字节对应OEP字节
- returnhere:
复制代码
大部分功能都注释了 就不贴脚本功能了 另:WIN7真蛋疼 - =
|