patch_new

来源:互联网 发布:怎么申请淘宝工会 编辑:程序博客网 时间:2024/05/09 16:27

int rise_pri()
{
    BOOL   rc;
    HANDLE   hToken;
    TOKEN_PRIVILEGES   *pTokenPriv;
    LUID_AND_ATTRIBUTES   la;
    DWORD   Len;
    rc=OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);
    if(rc==FALSE)return   rc;
    LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&la.Luid);
    la.Attributes=SE_PRIVILEGE_ENABLED;
    pTokenPriv   =   new   TOKEN_PRIVILEGES[2];
    pTokenPriv-> PrivilegeCount=1;
    memcpy(pTokenPriv-> Privileges,&la,sizeof(LUID_AND_ATTRIBUTES));
    rc=AdjustTokenPrivileges(hToken,FALSE,pTokenPriv,0,NULL,&Len);
    return   rc;
}

ULONG GetMyFunctionLen(DWORD pfn)
{
    ULONG res = 0;
    __asm
    {
        pushad
        MOV EAX, 0x90909090     // 新的函数以0x90909090作为结束的标志
            MOV ECX, 0xFFFFFFFF
            MOV EDI, pfn
            CLD
            REPNZ SCASD
            NOT ECX
            DEC ECX
            MOV res, ECX
            popad
    }
    return res * 4;
}

int makerw(int address,int size,int newmode)
{
    ULONG oldaccessattr = 0;
    //ULONG a;
    if(!    VirtualProtectEx(GetCurrentProcess(),(void*)address,size,PAGE_EXECUTE_READWRITE,&oldaccessattr)){        
            OutputDebugStringA("virtualprotect error");
        return -1;
    }
    //VirtualProtectEx(GetCurrentProcess(),(void*)address,size,PAGE_EXECUTE_READWRITE,&a);
    //outputdstring("address %x --> %x from %x  status %x",address,PAGE_EXECUTE_READWRITE,global_attr,a);

    return oldaccessattr;
}


DWORD Patch_new(DWORD codeaddress,int thisclausebytes, DWORD pfnNewFunction)
{
  ULONG fakefunctionlen,newplacecodelength;
  DWORD SectionGapStart;

  rise_pri();
 
  fakefunctionlen = GetMyFunctionLen( pfnNewFunction);
  OutputDebugStringApi("[Patch_new]functionlen=%d pfnNewFunction=%x codeaddress=%x thisclausebytes=%d",fakefunctionlen,pfnNewFunction,codeaddress,thisclausebytes);
 
  newplacecodelength=fakefunctionlen+thisclausebytes+5;
   
  SectionGapStart = (DWORD)new char[newplacecodelength];
  if (SectionGapStart == NULL)    return 0;

   makerw((int)SectionGapStart,newplacecodelength,0);
   makerw((int)pfnNewFunction,fakefunctionlen,0);

   OutputDebugStringApi("makerw");

   memcpy((void*)SectionGapStart,(void*)pfnNewFunction,fakefunctionlen);
   OutputDebugStringApi("copynewcode.1");
   memcpy((void*)(SectionGapStart+fakefunctionlen),(void*)codeaddress,thisclausebytes);
   OutputDebugStringApi("copyclausecode.1");

   /* 我的机器上的CreateProcessW的代码,是这样了。
    KERNEL32!CreateProcessW
    001B:77E6B252    55    PUSH     EBP
    001B:77E6B253    8BEC    MOV    EBP, ESP
    001B:77E6B255    FF752C    PUSH    DWORD PTR [EBP+2C]
    第二条和第三条指令正好是5Byte的长度,所以,我选择把第二条和第三条改成跳转指令。
    跳转指令码为0xE9,位移计算:目的地址 - 起始地址 - 跳转指令本身的长度。
  */

  *(PUCHAR)((PUCHAR)SectionGapStart +fakefunctionlen+thisclausebytes) = 0xE9;
  *(PULONG)((PUCHAR)SectionGapStart+fakefunctionlen+thisclausebytes+1) = (ULONG)(codeaddress + thisclausebytes)
                                          - (ULONG)(SectionGapStart + fakefunctionlen+thisclausebytes) - 5;
  //__asm CLI                        
  OutputDebugStringApi("[Patch_new]---2---");
  makerw((int)codeaddress,5,0);
  OutputDebugStringApi("[Patch_new]---3---");
  *(PUCHAR)((PUCHAR)codeaddress) = 0xE9;
  *(PULONG)((PCHAR)codeaddress + 1) = (ULONG)SectionGapStart - (ULONG)codeaddress- 5;
  //__asm STI
  //PTE_ENTRY((ULONG)pfnOrig) &= 0xFFD;
  OutputDebugStringApi("[Patch_new]ok");


  return SectionGapStart;
}

char string1[] = "--->condition 1";
char string2[] = "--->condition 2";
char string3[] = "--->condition 3";
char string4[] = "--->condition 4";
char string5[] = "--->condition 5";
char string6[] = "--->condition 6";
char string7[] = "--->condition 7";
char string8[] = "--->condition 8";
char string9[] = "--->condition 9";
char stringA[] = "--->condition A";

DWORD  opfn=(DWORD)OutputDebugString;
__declspec(naked) NewCreateProcessW1()
{
  __asm
  {
    PUSHAD
        lea eax, string1
        push eax
        call opfn   
    POPAD
    _emit 0x90
    _emit 0x90
    _emit 0x90
    _emit 0x90
    _emit 0x90
    _emit 0x90
    _emit 0x90
    _emit 0x90
    _emit 0x90
    _emit 0x90
    _emit 0x90
    _emit 0x90
    _emit 0x90
  }
}

__declspec(naked) NewCreateProcessW2()
{
    __asm
    {
        PUSHAD
            lea eax, string2
            push eax
            call opfn   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
  }
}

__declspec(naked) condition3()
{
    __asm
    {
        PUSHAD
            lea eax, string3
            push eax
            call opfn   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
__declspec(naked) condition4()
{
    __asm
    {
        PUSHAD
            lea eax, string4
            push eax
            call opfn   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
__declspec(naked) condition5()
{
    __asm
    {
        PUSHAD
            lea eax, string5
            push eax
            call opfn   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
__declspec(naked) condition6()
{
    __asm
    {
        PUSHAD
            lea eax, string6
            push eax
            call opfn   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
__declspec(naked) condition7()
{
    __asm
    {
        PUSHAD
            lea eax, string7
            push eax
            call opfn   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
__declspec(naked) condition8()
{
    __asm
    {
        PUSHAD
            lea eax, string8
            push eax
            call opfn   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
__declspec(naked) condition9()
{
    __asm
    {
        PUSHAD
            lea eax, string9
            push eax
            call opfn   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
__declspec(naked) conditionA()
{
    __asm
    {
        PUSHAD
            lea eax, stringA
            push eax
            call opfn   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
void __stdcall printebpwidestring(WCHAR* ebpoffsetstringptr)
{
    OutputDebugStringW(ebpoffsetstringptr);
}
void __stdcall printebpansistring(char* ebpoffsetstringptr)
{
    OutputDebugStringA(ebpoffsetstringptr);
}

typedef void (__stdcall* printebpwidestring_T)(WCHAR* ebpoffsetstringptr);
typedef void (__stdcall* printebpansistring_T)(char* ebpoffsetstringptr);

DWORD ebpoffsetwide = 0;
DWORD ebpoffsetansi = 0;
printebpwidestring_T fn_printebpwidestring = printebpwidestring;
printebpansistring_T fn_printebpansistring = printebpansistring;
__declspec(naked) _printwidestringonebp()
{
    __asm
    {
        PUSHAD
            mov eax, ebpoffsetwide
            sub ebp,eax
            mov eax,ebp
            push eax
            call fn_printebpwidestring   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
__declspec(naked) _printasnistringonebp()
{
    __asm
    {
        PUSHAD
            mov eax, ebpoffsetansi
            sub ebp,eax
            mov eax,ebp
            push eax
            call fn_printebpansistring   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}

void __stdcall printval(DWORD a)
{
    char cc[10];
    sprintf(cc,"0x%x",a);
    OutputDebugStringA(cc);
}

typedef void (__stdcall* printval_T)(DWORD a);

DWORD stackvaraddress = 0;
DWORD globalvaraddress = 0;
DWORD ecxoffsetaddress = 0;

printval_T fn_printval = printval;
DWORD offset_ecx_class_wide = 0;
__declspec(naked) _printwidestringecxclass()
{
    __asm
    {
        PUSHAD
            mov eax, offset_ecx_class_wide
            add eax,ecx
             push eax
            call fn_printebpwidestring   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
DWORD offset_ecx_class_ansi = 0;
__declspec(naked) _printansistringecxclass()
{
    __asm
    {
        PUSHAD
            mov eax, offset_ecx_class_ansi
            add eax,ecx
            push eax
            call fn_printebpansistring   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
__declspec(naked) _printecxclassmember()
{
    __asm
    {
        PUSHAD
            mov eax, ecxoffsetaddress
            add eax,ecx
            push eax
            call fn_printval   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
__declspec(naked) _printstackvar()
{
    __asm
    {
        PUSHAD
            mov eax, stackvaraddress
            sub ebp,eax
            mov eax,[ebp]
            push eax
            call fn_printval   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
__declspec(naked) _printglobalvar()
{
    __asm
    {
        PUSHAD
            mov eax, globalvaraddress
             mov eax,[eax]
            push eax
            call fn_printval   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}

void __stdcall print_regs(int eax,int ebx,int ecx,int edx,int esi,int edi,int ebp)
{
    char buffer[200];
    sprintf(buffer,"eax=%x ebx=%x ecx=%x edx=%x esi=%x edi=%x ebp=%x",eax,ebx,ecx,edx,esi,edi,ebp);
    OutputDebugStringA(buffer);
}

DWORD  fnprint_regs=(DWORD)print_regs;
__declspec(naked) printregs()
{
    __asm
    {
        PUSHAD
            push ebp
            push edi
            push esi
            push edx
            push ecx
            push ebx
            push eax
            call fnprint_regs   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
void __stdcall print_8eax(int eax)
{
    char buffer[30];
    sprintf(buffer,"[%x]=%x",eax,*(DWORD*)eax);
    OutputDebugStringA(buffer);
}
DWORD  fnprint_8eax=(DWORD)print_8eax;
__declspec(naked) printLeax()
{
    __asm
    {
        PUSHAD
             push eax
            call fnprint_8eax   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
__declspec(naked) printLebx()
{
    __asm
    {
        PUSHAD
             push ebx
            call fnprint_8eax   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
__declspec(naked) printLecx()
{
    __asm
    {
            PUSHAD
             push ecx
            call fnprint_8eax   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
__declspec(naked) printLedx()
{
    __asm
    {
        PUSHAD
            push edx
            call fnprint_8eax   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
__declspec(naked) printLesi()
{
    __asm
    {
        PUSHAD
             push esi
            call fnprint_8eax   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
__declspec(naked) printLedi()
{
    __asm
    {
        PUSHAD
             push edi
            call fnprint_8eax   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
__declspec(naked) printLebp()
{
    __asm
    {
        PUSHAD
             push ebp
            call fnprint_8eax   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
void __stdcall print_stack(DWORD* esp)
{
    char buffer[30];
    int i;
    for(i=0;i<32;i++){
     sprintf(buffer,"[%x]=%x",&esp[i],esp[i]);
     OutputDebugStringA(buffer);
    }
}
DWORD fnprint_stack=(DWORD)print_stack;
__declspec(naked) printstack()
{
    __asm
    {
        PUSHAD
            push ebp
            call fnprint_stack   
            POPAD
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
            _emit 0x90
    }
}
void  __stdcall hook_cond1(DWORD  addresshook,int instructionlen)
{
    DWORD temp = (DWORD)NewCreateProcessW1;
#ifdef _DEBUG
    DWORD* ptr =(DWORD*) (temp+1);
    temp = temp+5+ptr[0];
#endif
    Patch_new(addresshook,instructionlen,temp);
}
void __stdcall hook_cond2(DWORD  addresshook,int instructionlen)
{
    Patch_new(addresshook,instructionlen,(DWORD)NewCreateProcessW2);
}
void __stdcall hook_cond3(DWORD  addresshook,int instructionlen)
{
    Patch_new(addresshook,instructionlen,(DWORD)condition3);
}
void __stdcall hook_cond4(DWORD  addresshook,int instructionlen)
{
    Patch_new(addresshook,instructionlen,(DWORD)condition4);
}
void __stdcall hook_cond5(DWORD  addresshook,int instructionlen)
{
    Patch_new(addresshook,instructionlen,(DWORD)condition5);
}
void __stdcall hook_cond6(DWORD  addresshook,int instructionlen)
{
    Patch_new(addresshook,instructionlen,(DWORD)condition6);
}
void __stdcall hook_cond7(DWORD  addresshook,int instructionlen)
{
    Patch_new(addresshook,instructionlen,(DWORD)condition7);
}
void __stdcall hook_cond8(DWORD  addresshook,int instructionlen)
{
    Patch_new(addresshook,instructionlen,(DWORD)condition8);
}
void __stdcall hook_cond9(DWORD  addresshook,int instructionlen)
{
    Patch_new(addresshook,instructionlen,(DWORD)condition9);
}
void __stdcall hook_condA(DWORD  addresshook,int instructionlen)
{
    Patch_new(addresshook,instructionlen,(DWORD)conditionA);
}

void __stdcall hook_printregs(DWORD  addresshook,int instructionlen)
{
    Patch_new(addresshook,instructionlen,(DWORD)printregs);
}
void __stdcall hook_printstack(DWORD  addresshook,int instructionlen)
{
    Patch_new(addresshook,instructionlen,(DWORD)printstack);
}
void __stdcall hook_printmemeax(DWORD  addresshook,int instructionlen)
{
    Patch_new(addresshook,instructionlen,(DWORD)printLeax);
}
void __stdcall hook_printmemebx(DWORD  addresshook,int instructionlen)
{
    Patch_new(addresshook,instructionlen,(DWORD)printLebx);
}
void __stdcall hook_printmemecx(DWORD  addresshook,int instructionlen)
{
    Patch_new(addresshook,instructionlen,(DWORD)printLecx);
}
void __stdcall hook_printmemedx(DWORD  addresshook,int instructionlen)
{
    Patch_new(addresshook,instructionlen,(DWORD)printLedx);
}
void __stdcall hook_printmemesi(DWORD  addresshook,int instructionlen)
{
    Patch_new(addresshook,instructionlen,(DWORD)printLesi);
}
void __stdcall hook_printmemedi(DWORD  addresshook,int instructionlen)
{
    Patch_new(addresshook,instructionlen,(DWORD)printLedi);
}
void __stdcall hook_printmemebp(DWORD  addresshook,int instructionlen)
{
    Patch_new(addresshook,instructionlen,(DWORD)printLebp);
}
void __stdcall hook_printasnistringonebp(DWORD  addresshook,int instructionlen,DWORD offset)
{
    ebpoffsetansi = offset;
    Patch_new(addresshook,instructionlen,(DWORD)_printasnistringonebp);
}
void __stdcall hook_printwidestringonebp(DWORD  addresshook,int instructionlen,DWORD offset)
{
    ebpoffsetwide = offset;
    Patch_new(addresshook,instructionlen,(DWORD)_printwidestringonebp);
}
void __stdcall hook_printglobalvar(DWORD  addresshook,int instructionlen,DWORD address)
{
    globalvaraddress = address;
    Patch_new(addresshook,instructionlen,(DWORD)_printglobalvar);
}
void __stdcall hook_printstackvar(DWORD  addresshook,int instructionlen,DWORD address)
{
    stackvaraddress = address;
    Patch_new(addresshook,instructionlen,(DWORD)_printstackvar);
}
void __stdcall hook_printecxclassmember(DWORD  addresshook,int instructionlen,DWORD address)
{
    ecxoffsetaddress = address;
    Patch_new(addresshook,instructionlen,(DWORD)_printecxclassmember);
}
void __stdcall hook_printwidestringecxclass(DWORD  addresshook,int instructionlen,DWORD address)
{
    offset_ecx_class_wide = address;
    Patch_new(addresshook,instructionlen,(DWORD)_printwidestringecxclass);
}

void __stdcall hook_printansistringecxclass(DWORD  addresshook,int instructionlen,DWORD address)
{
    offset_ecx_class_ansi = address;
    Patch_new(addresshook,instructionlen,(DWORD)_printansistringecxclass);
}
0 0
原创粉丝点击