十二 发表于 2011-10-16 16:41:24

闲着无事写了个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真蛋疼 - =

漆黑之翼 发表于 2011-10-17 12:21:06

我看都没人敢回十二神触的帖子了

十二 发表于 2011-10-17 16:04:54

。。。。。。。。。。。。修正了几个BUG,跑了趟网吧取了XP的virtualprotect序号 - =

#2L
      估计是太渣了没人看

漆黑之翼 发表于 2011-10-17 17:13:21

回复 十二 的帖子

是太触了看不懂

十二 发表于 2011-10-17 17:19:21

回复 漆黑之翼 的帖子

真心渣,用VC估计几十行就完事了,汇编是蠢B的语言。

然后借地问一下 Settransform 设置完变换矩阵的时候 顶点信息在哪里?如果这时候要取变换完得顶点数据应该怎么做?

十二 发表于 2011-10-22 11:40:31

继续更新改变了一下备份策略,囧又挖了一大坑
页: [1]
查看完整版本: 闲着无事写了个CEAA的脚本