Baihaqi_RNC Super Moderators
Jumlah posting : 134 Points : 2147483638 Reputation : 261680 Join date : 06.04.11 Lokasi : _ATJ3H_
| Subyek: contoh Source Code W* Thu May 12, 2011 2:13 am | |
| Source Code nech hanya untuk yg lebih pengalaman memakai Dev C++
nech hanya sebagian aj SC nya klo saya shere semuua nya gak muat ,.,.,.
ADE32.cpp
- Spoiler:
// ADE32 version 2.02c -- C edition
#define WIN32_LEAN_AND_MEAN #define WIN32_EXTRA_LEAN
#include <windows.h>
#include "ADE32.h"
DWORD ade32_table[512] = { /* 00 */ C_MODRM, /* 01 */ C_MODRM, /* 02 */ C_MODRM, /* 03 */ C_MODRM, /* 04 */ C_DATA1, /* 05 */ C_DATA66, /* 06 */ C_BAD, /* 07 */ C_BAD, /* 08 */ C_MODRM, /* 09 */ C_MODRM, /* 0A */ C_MODRM, /* 0B */ C_MODRM, /* 0C */ C_DATA1, /* 0D */ C_DATA66, /* 0E */ C_BAD, /* 0F */ C_OPCODE2, /* 10 */ C_MODRM+C_BAD, /* 11 */ C_MODRM, /* 12 */ C_MODRM+C_BAD, /* 13 */ C_MODRM, /* 14 */ C_DATA1+C_BAD, /* 15 */ C_DATA66+C_BAD, /* 16 */ C_BAD, /* 17 */ C_BAD, /* 18 */ C_MODRM+C_BAD, /* 19 */ C_MODRM, /* 1A */ C_MODRM, /* 1B */ C_MODRM, /* 1C */ C_DATA1+C_BAD, /* 1D */ C_DATA66+C_BAD, /* 1E */ C_BAD, /* 1F */ C_BAD, /* 20 */ C_MODRM, /* 21 */ C_MODRM, /* 22 */ C_MODRM, /* 23 */ C_MODRM, /* 24 */ C_DATA1, /* 25 */ C_DATA66, /* 26 */ C_SEG+C_BAD, /* 27 */ C_BAD, /* 28 */ C_MODRM, /* 29 */ C_MODRM, /* 2A */ C_MODRM, /* 2B */ C_MODRM, /* 2C */ C_DATA1, /* 2D */ C_DATA66, /* 2E */ C_SEG+C_BAD, /* 2F */ C_BAD, /* 30 */ C_MODRM, /* 31 */ C_MODRM, /* 32 */ C_MODRM, /* 33 */ C_MODRM, /* 34 */ C_DATA1, /* 35 */ C_DATA66, /* 36 */ C_SEG+C_BAD, /* 37 */ C_BAD, /* 38 */ C_MODRM, /* 39 */ C_MODRM, /* 3A */ C_MODRM, /* 3B */ C_MODRM, /* 3C */ C_DATA1, /* 3D */ C_DATA66, /* 3E */ C_SEG+C_BAD, /* 3F */ C_BAD, /* 40 */ 0, /* 41 */ 0, /* 42 */ 0, /* 43 */ 0, /* 44 */ C_BAD, /* 45 */ 0, /* 46 */ 0, /* 47 */ 0, /* 48 */ 0, /* 49 */ 0, /* 4A */ 0, /* 4B */ 0, /* 4C */ C_BAD, /* 4D */ 0, /* 4E */ 0, /* 4F */ 0, /* 50 */ 0, /* 51 */ 0, /* 52 */ 0, /* 53 */ 0, /* 54 */ 0, /* 55 */ 0, /* 56 */ 0, /* 57 */ 0, /* 58 */ 0, /* 59 */ 0, /* 5A */ 0, /* 5B */ 0, /* 5C */ C_BAD, /* 5D */ 0, /* 5E */ 0, /* 5F */ 0, /* 60 */ C_BAD, /* 61 */ C_BAD, /* 62 */ C_MODRM+C_BAD, /* 63 */ C_MODRM+C_BAD, /* 64 */ C_SEG, /* 65 */ C_SEG+C_BAD, /* 66 */ C_66, /* 67 */ C_67, /* 68 */ C_DATA66, /* 69 */ C_MODRM+C_DATA66, /* 6A */ C_DATA1, /* 6B */ C_MODRM+C_DATA1, /* 6C */ C_BAD, /* 6D */ C_BAD, /* 6E */ C_BAD, /* 6F */ C_BAD, /* 70 */ C_DATA1+C_REL+C_BAD, /* 71 */ C_DATA1+C_REL+C_BAD, /* 72 */ C_DATA1+C_REL, /* 73 */ C_DATA1+C_REL, /* 74 */ C_DATA1+C_REL, /* 75 */ C_DATA1+C_REL, /* 76 */ C_DATA1+C_REL, /* 77 */ C_DATA1+C_REL, /* 78 */ C_DATA1+C_REL, /* 79 */ C_DATA1+C_REL, /* 7A */ C_DATA1+C_REL+C_BAD, /* 7B */ C_DATA1+C_REL+C_BAD, /* 7C */ C_DATA1+C_REL, /* 7D */ C_DATA1+C_REL, /* 7E */ C_DATA1+C_REL, /* 7F */ C_DATA1+C_REL, /* 80 */ C_MODRM+C_DATA1, /* 81 */ C_MODRM+C_DATA66, /* 82 */ C_MODRM+C_DATA1+C_BAD, /* 83 */ C_MODRM+C_DATA1, /* 84 */ C_MODRM, /* 85 */ C_MODRM, /* 86 */ C_MODRM, /* 87 */ C_MODRM, /* 88 */ C_MODRM, /* 89 */ C_MODRM, /* 8A */ C_MODRM, /* 8B */ C_MODRM, /* 8C */ C_MODRM+C_BAD, /* 8D */ C_MODRM, /* 8E */ C_MODRM+C_BAD, /* 8F */ C_MODRM, /* 90 */ 0, /* 91 */ 0, /* 92 */ 0, /* 93 */ C_BAD, /* 94 */ C_BAD, /* 95 */ C_BAD, /* 96 */ C_BAD, /* 97 */ C_BAD, /* 98 */ C_BAD, /* 99 */ 0, /* 9A */ C_DATA66+C_DATA2+C_BAD, /* 9B */ 0, /* 9C */ C_BAD, /* 9D */ C_BAD, /* 9E */ C_BAD, /* 9F */ C_BAD, /* A0 */ C_ADDR67, /* A1 */ C_ADDR67, /* A2 */ C_ADDR67, /* A3 */ C_ADDR67, /* A4 */ 0, /* A5 */ 0, /* A6 */ 0, /* A7 */ 0, /* A8 */ C_DATA1, /* A9 */ C_DATA66, /* AA */ 0, /* AB */ 0, /* AC */ 0, /* AD */ C_BAD, /* AE */ 0, /* AF */ C_BAD, /* B0 */ C_DATA1, /* B1 */ C_DATA1, /* B2 */ C_DATA1, /* B3 */ C_DATA1, /* B4 */ C_DATA1, /* B5 */ C_DATA1, /* B6 */ C_DATA1+C_BAD, /* B7 */ C_DATA1+C_BAD, /* B8 */ C_DATA66, /* B9 */ C_DATA66, /* BA */ C_DATA66, /* BB */ C_DATA66, /* BC */ C_DATA66+C_BAD, /* BD */ C_DATA66, /* BE */ C_DATA66, /* BF */ C_DATA66, /* C0 */ C_MODRM+C_DATA1, /* C1 */ C_MODRM+C_DATA1, /* C2 */ C_DATA2+C_STOP, /* C3 */ C_STOP, /* C4 */ C_MODRM+C_BAD, /* C5 */ C_MODRM+C_BAD, /* C6 */ C_MODRM+C_DATA1, /* C7 */ C_MODRM+C_DATA66, /* C8 */ C_DATA2+C_DATA1, /* C9 */ 0, /* CA */ C_DATA2+C_STOP+C_BAD, /* CB */ C_STOP+C_BAD, /* CC */ C_BAD, /* CD */ C_BAD, /* CE */ C_BAD, /* CF */ C_STOP+C_BAD, /* D0 */ C_MODRM, /* D1 */ C_MODRM, /* D2 */ C_MODRM, /* D3 */ C_MODRM, /* D4 */ C_DATA1+C_BAD, /* D5 */ C_DATA1+C_BAD, /* D6 */ C_BAD, /* D7 */ C_BAD, /* D8 */ C_MODRM, /* D9 */ C_MODRM, /* DA */ C_MODRM, /* DB */ C_MODRM, /* DC */ C_MODRM, /* DD */ C_MODRM, /* DE */ C_MODRM, /* DF */ C_MODRM, /* E0 */ C_DATA1+C_REL+C_BAD, /* E1 */ C_DATA1+C_REL+C_BAD, /* E2 */ C_DATA1+C_REL, /* E3 */ C_DATA1+C_REL, /* E4 */ C_DATA1+C_BAD, /* E5 */ C_DATA1+C_BAD, /* E6 */ C_DATA1+C_BAD, /* E7 */ C_DATA1+C_BAD, /* E8 */ C_DATA66+C_REL, /* E9 */ C_DATA66+C_REL+C_STOP, /* EA */ C_DATA66+C_DATA2+C_BAD, /* EB */ C_DATA1+C_REL+C_STOP, /* EC */ C_BAD, /* ED */ C_BAD, /* EE */ C_BAD, /* EF */ C_BAD, /* F0 */ C_LOCK+C_BAD, /* F1 */ C_BAD, /* F2 */ C_REP, /* F3 */ C_REP, /* F4 */ C_BAD, /* F5 */ C_BAD, /* F6 */ C_MODRM, /* F7 */ C_MODRM, /* F8 */ 0, /* F9 */ 0, /* FA */ C_BAD, /* FB */ C_BAD, /* FC */ 0, /* FD */ 0, /* FE */ C_MODRM, /* FF */ C_MODRM, /* 00 */ C_MODRM, /* 01 */ C_MODRM, /* 02 */ C_MODRM, /* 03 */ C_MODRM, /* 04 */ C_ERROR, /* 05 */ C_ERROR, /* 06 */ 0, /* 07 */ C_ERROR, /* 08 */ 0, /* 09 */ 0, /* 0A */ 0, /* 0B */ 0, /* 0C */ C_ERROR, /* 0D */ C_ERROR, /* 0E */ C_ERROR, /* 0F */ C_ERROR, /* 10 */ C_ERROR, /* 11 */ C_ERROR, /* 12 */ C_ERROR, /* 13 */ C_ERROR, /* 14 */ C_ERROR, /* 15 */ C_ERROR, /* 16 */ C_ERROR, /* 17 */ C_ERROR, /* 18 */ C_ERROR, /* 19 */ C_ERROR, /* 1A */ C_ERROR, /* 1B */ C_ERROR, /* 1C */ C_ERROR, /* 1D */ C_ERROR, /* 1E */ C_ERROR, /* 1F */ C_ERROR, /* 20 */ C_ERROR, /* 21 */ C_ERROR, /* 22 */ C_ERROR, /* 23 */ C_ERROR, /* 24 */ C_ERROR, /* 25 */ C_ERROR, /* 26 */ C_ERROR, /* 27 */ C_ERROR, /* 28 */ C_ERROR, /* 29 */ C_ERROR, /* 2A */ C_ERROR, /* 2B */ C_ERROR, /* 2C */ C_ERROR, /* 2D */ C_ERROR, /* 2E */ C_ERROR, /* 2F */ C_ERROR, /* 30 */ C_ERROR, /* 31 */ C_ERROR, /* 32 */ C_ERROR, /* 33 */ C_ERROR, /* 34 */ C_ERROR, /* 35 */ C_ERROR, /* 36 */ C_ERROR, /* 37 */ C_ERROR, /* 38 */ C_ERROR, /* 39 */ C_ERROR, /* 3A */ C_ERROR, /* 3B */ C_ERROR, /* 3C */ C_ERROR, /* 3D */ C_ERROR, /* 3E */ C_ERROR, /* 3F */ C_ERROR, /* 40 */ C_ERROR, /* 41 */ C_ERROR, /* 42 */ C_ERROR, /* 43 */ C_ERROR, /* 44 */ C_ERROR, /* 45 */ C_ERROR, /* 46 */ C_ERROR, /* 47 */ C_ERROR, /* 48 */ C_ERROR, /* 49 */ C_ERROR, /* 4A */ C_ERROR, /* 4B */ C_ERROR, /* 4C */ C_ERROR, /* 4D */ C_ERROR, /* 4E */ C_ERROR, /* 4F */ C_ERROR, /* 50 */ C_ERROR, /* 51 */ C_ERROR, /* 52 */ C_ERROR, /* 53 */ C_ERROR, /* 54 */ C_ERROR, /* 55 */ C_ERROR, /* 56 */ C_ERROR, /* 57 */ C_ERROR, /* 58 */ C_ERROR, /* 59 */ C_ERROR, /* 5A */ C_ERROR, /* 5B */ C_ERROR, /* 5C */ C_ERROR, /* 5D */ C_ERROR, /* 5E */ C_ERROR, /* 5F */ C_ERROR, /* 60 */ C_ERROR, /* 61 */ C_ERROR, /* 62 */ C_ERROR, /* 63 */ C_ERROR, /* 64 */ C_ERROR, /* 65 */ C_ERROR, /* 66 */ C_ERROR, /* 67 */ C_ERROR, /* 68 */ C_ERROR, /* 69 */ C_ERROR, /* 6A */ C_ERROR, /* 6B */ C_ERROR, /* 6C */ C_ERROR, /* 6D */ C_ERROR, /* 6E */ C_ERROR, /* 6F */ C_ERROR, /* 70 */ C_ERROR, /* 71 */ C_ERROR, /* 72 */ C_ERROR, /* 73 */ C_ERROR, /* 74 */ C_ERROR, /* 75 */ C_ERROR, /* 76 */ C_ERROR, /* 77 */ C_ERROR, /* 78 */ C_ERROR, /* 79 */ C_ERROR, /* 7A */ C_ERROR, /* 7B */ C_ERROR, /* 7C */ C_ERROR, /* 7D */ C_ERROR, /* 7E */ C_ERROR, /* 7F */ C_ERROR, /* 80 */ C_DATA66+C_REL, /* 81 */ C_DATA66+C_REL, /* 82 */ C_DATA66+C_REL, /* 83 */ C_DATA66+C_REL, /* 84 */ C_DATA66+C_REL, /* 85 */ C_DATA66+C_REL, /* 86 */ C_DATA66+C_REL, /* 87 */ C_DATA66+C_REL, /* 88 */ C_DATA66+C_REL, /* 89 */ C_DATA66+C_REL, /* 8A */ C_DATA66+C_REL, /* 8B */ C_DATA66+C_REL, /* 8C */ C_DATA66+C_REL, /* 8D */ C_DATA66+C_REL, /* 8E */ C_DATA66+C_REL, /* 8F */ C_DATA66+C_REL, /* 90 */ C_MODRM, /* 91 */ C_MODRM, /* 92 */ C_MODRM, /* 93 */ C_MODRM, /* 94 */ C_MODRM, /* 95 */ C_MODRM, /* 96 */ C_MODRM, /* 97 */ C_MODRM, /* 98 */ C_MODRM, /* 99 */ C_MODRM, /* 9A */ C_MODRM, /* 9B */ C_MODRM, /* 9C */ C_MODRM, /* 9D */ C_MODRM, /* 9E */ C_MODRM, /* 9F */ C_MODRM, /* A0 */ 0, /* A1 */ 0, /* A2 */ 0, /* A3 */ C_MODRM, /* A4 */ C_MODRM+C_DATA1, /* A5 */ C_MODRM, /* A6 */ C_ERROR, /* A7 */ C_ERROR, /* A8 */ 0, /* A9 */ 0, /* AA */ 0, /* AB */ C_MODRM, /* AC */ C_MODRM+C_DATA1, /* AD */ C_MODRM, /* AE */ C_ERROR, /* AF */ C_MODRM, /* B0 */ C_MODRM, /* B1 */ C_MODRM, /* B2 */ C_MODRM, /* B3 */ C_MODRM, /* B4 */ C_MODRM, /* B5 */ C_MODRM, /* B6 */ C_MODRM, /* B7 */ C_MODRM, /* B8 */ C_ERROR, /* B9 */ C_ERROR, /* BA */ C_MODRM+C_DATA1, /* BB */ C_MODRM, /* BC */ C_MODRM, /* BD */ C_MODRM, /* BE */ C_MODRM, /* BF */ C_MODRM, /* C0 */ C_MODRM, /* C1 */ C_MODRM, /* C2 */ C_ERROR, /* C3 */ C_ERROR, /* C4 */ C_ERROR, /* C5 */ C_ERROR, /* C6 */ C_ERROR, /* C7 */ C_ERROR, /* C8 */ 0, /* C9 */ 0, /* CA */ 0, /* CB */ 0, /* CC */ 0, /* CD */ C_DATA1, /* CE */ 0, /* CF */ 0, /* D0 */ C_ERROR, /* D1 */ C_ERROR, /* D2 */ C_ERROR, /* D3 */ C_ERROR, /* D4 */ C_ERROR, /* D5 */ C_ERROR, /* D6 */ C_ERROR, /* D7 */ C_ERROR, /* D8 */ C_ERROR, /* D9 */ C_ERROR, /* DA */ C_ERROR, /* DB */ C_ERROR, /* DC */ C_ERROR, /* DD */ C_ERROR, /* DE */ C_ERROR, /* DF */ C_ERROR, /* E0 */ C_ERROR, /* E1 */ C_ERROR, /* E2 */ C_ERROR, /* E3 */ C_ERROR, /* E4 */ C_ERROR, /* E5 */ C_ERROR, /* E6 */ C_ERROR, /* E7 */ C_ERROR, /* E8 */ C_ERROR, /* E9 */ C_ERROR, /* EA */ C_ERROR, /* EB */ C_ERROR, /* EC */ C_ERROR, /* ED */ C_ERROR, /* EE */ C_ERROR, /* EF */ C_ERROR, /* F0 */ C_ERROR, /* F1 */ C_ERROR, /* F2 */ C_ERROR, /* F3 */ C_ERROR, /* F4 */ C_ERROR, /* F5 */ C_ERROR, /* F6 */ C_ERROR, /* F7 */ C_ERROR, /* F8 */ C_ERROR, /* F9 */ C_ERROR, /* FA */ C_ERROR, /* FB */ C_ERROR, /* FC */ C_ERROR, /* FD */ C_ERROR, /* FE */ C_ERROR, /* FF */ C_ERROR }; // ade32_table[]
int disasm(BYTE* opcode0, disasm_struct* diza){ BYTE* opcode = opcode0;
memset(diza, 0x00, sizeof(disasm_struct)); diza->disasm_defdata = 4; diza->disasm_defaddr = 4;
if(*(WORD*)opcode == 0x0000) return 0; if(*(WORD*)opcode == 0xFFFF) return 0;
DWORD flag = 0;
repeat_prefix:
BYTE c = *opcode++; DWORD t = ade32_table[ c ];
if(t & C_ANYPREFIX){ if(flag & t) return 0;
flag |= t;
if(t & C_67) diza->disasm_defaddr ^= 2^4; else if(t & C_66) diza->disasm_defdata ^= 2^4; else if(t & C_SEG) diza->disasm_seg = c; else if(t & C_REP) diza->disasm_rep = c; // LOCK
goto repeat_prefix; } // C_ANYPREFIX
flag |= t; diza->disasm_opcode = c;
if(c == 0x0F){ c = *opcode++; diza->disasm_opcode2 = c; flag |= ade32_table[256+c]; // 2nd flagtable half if(flag == C_ERROR) return 0; }else if(c == 0xF7){ if(((*opcode) & 0x38) == 0) flag |= C_DATA66; }else if(c == 0xF6){ if(((*opcode) & 0x38) == 0) flag |= C_DATA1; }else if(c == 0xCD){ if(*opcode == 0x20) flag |= C_DATA4; }
if(flag & C_MODRM){ c = *opcode++; diza->disasm_modrm = c;
if(((c & 0x38) == 0x20) && (diza->disasm_opcode == 0xFF)) flag |= C_STOP;
BYTE mod = c & 0xC0; BYTE rm = c & 0x07;
if(mod != 0xC0){ if(diza->disasm_defaddr == 4){ if(rm == 4){ flag |= C_SIB; c = *opcode++; diza->disasm_sib = c; rm = c & 0x07; }
if(mod == 0x40) flag |= C_ADDR1; else if(mod == 0x80) flag |= C_ADDR4; else if (rm == 5) flag |= C_ADDR4; }else{ // MODRM 16-bit if(mod == 0x40) flag |= C_ADDR1; else if(mod == 0x80) flag |= C_ADDR2; else if(rm == 6) flag |= C_ADDR2; } } } // C_MODRM
diza->disasm_flag = flag;
DWORD a = flag & (C_ADDR1 | C_ADDR2 | C_ADDR4); DWORD d = (flag & (C_DATA1 | C_DATA2 | C_DATA4)) >> 8;
if(flag & C_ADDR67) a += diza->disasm_defaddr; if(flag & C_DATA66) d += diza->disasm_defdata;
diza->disasm_addrsize = a; diza->disasm_datasize = d;
DWORD i; for(i = 0; i < a; i++) diza->disasm_addr_b[i] = *opcode++;
for(i = 0; i < d; i++) diza->disasm_data_b[i] = *opcode++;
diza->disasm_len = opcode - opcode0;
return diza->disasm_len; } // disasm()
int oplen(BYTE *opcode){ disasm_struct diza; memset(&diza,0,sizeof(diza)); disasm((BYTE*)opcode,&diza);
if((diza.disasm_flag == C_ERROR) || ((diza.disasm_flag&C_STOP) == C_STOP) || ((diza.disasm_flag&C_REL)==C_REL) || ((diza.disasm_flag&C_BAD)==C_BAD)) return -1;
return diza.disasm_len; }
detours.h
- Spoiler:
/* Name: DetourXS Description: DetourXS is a library for function detouring Version: 1.0 Author: Sinner Website: [You must be registered and logged in to see this link.] & [You must be registered and logged in to see this link.] Credits: z0mbie (ADE32), LanceVorgin's CDetour (some ideas) */ #define WIN32_LEAN_AND_MEAN #define WIN32_EXTRA_LEAN #include <windows.h> #include "ADE32.h" //#pragma comment(lib, "detourxs") #include <windows.h> #define DETOUR_LEN_AUTO 0 // Finds the detour length automatically enum { DETOUR_TYPE_JMP, // min detour len: 5 DETOUR_TYPE_PUSH_RET, // min detour len: 6 DETOUR_TYPE_NOP_JMP, // min detour len: 6 DETOUR_TYPE_NOP_NOP_JMP, // min detour len: 7 DETOUR_TYPE_STC_JC, // min detour len: 7 DETOUR_TYPE_CLC_JNC, // min detour len: 7 }; LPVOID DetourCreate(LPVOID lpFuncOrig, LPVOID lpFuncDetour, int patchType, int detourLen=DETOUR_LEN_AUTO); LPVOID DetourCreate(LPCSTR lpModuleName, LPCSTR lpProcName, LPVOID lpFuncDetour, int patchType, int detourLen=DETOUR_LEN_AUTO); BOOL DetourRemove(LPVOID lpDetourCreatePtr); #pragma warning(disable: 4311) #pragma warning(disable: 4312) #pragma warning(disable: 4244) #define DETOUR_MAX_SRCH_OPLEN 64 #define JMP32_SZ 5 #define BIT32_SZ 4 // jmp32 sig #define SIG_SZ 3 #define SIG_OP_0 0xCC #define SIG_OP_1 0x90 #define SIG_OP_2 0xC3 static DWORD dwOldProt; int GetDetourLen(int patchType); int GetDetourLenAuto(PBYTE &pbFuncOrig, int minDetLen); // Thin wrapper for APIs LPVOID DetourCreate(LPCSTR lpModuleName, LPCSTR lpProcName, LPVOID lpFuncDetour, int patchType, int detourLen) { LPVOID lpFuncOrig = NULL; if((lpFuncOrig = GetProcAddress(GetModuleHandle(lpModuleName), lpProcName)) == NULL) return NULL; return DetourCreate(lpFuncOrig, lpFuncDetour, patchType, detourLen); } LPVOID DetourCreate(LPVOID lpFuncOrig, LPVOID lpFuncDetour, int patchType, int detourLen) { LPVOID lpMallocPtr = NULL; DWORD dwProt = NULL; PBYTE pbMallocPtr = NULL; PBYTE pbFuncOrig = (PBYTE)lpFuncOrig; PBYTE pbFuncDetour = (PBYTE)lpFuncDetour; PBYTE pbPatchBuf = NULL; int minDetLen = 0; int detLen = 0; // Get detour length if((minDetLen = GetDetourLen(patchType)) == 0) return NULL; if(detourLen != DETOUR_LEN_AUTO) detLen = detourLen; else if((detLen = GetDetourLenAuto(pbFuncOrig, minDetLen)) < minDetLen) return NULL; // Alloc mem for the overwritten bytes if((lpMallocPtr = (LPVOID)malloc(detLen+JMP32_SZ+SIG_SZ)) == NULL) return NULL; pbMallocPtr = (PBYTE)lpMallocPtr; // Enable writing to original VirtualProtect(lpFuncOrig, detLen, PAGE_READWRITE, &dwProt); // Write overwritten bytes to the malloc memcpy(lpMallocPtr, lpFuncOrig, detLen); pbMallocPtr += detLen; pbMallocPtr[0] = 0xE9; *(DWORD*)(pbMallocPtr+1) = (DWORD)((pbFuncOrig+detLen)-pbMallocPtr)-JMP32_SZ; pbMallocPtr += JMP32_SZ; pbMallocPtr[0] = SIG_OP_0; pbMallocPtr[1] = SIG_OP_1; pbMallocPtr[2] = SIG_OP_2; // Create a buffer to prepare the detour bytes pbPatchBuf = new BYTE[detLen]; memset(pbPatchBuf, 0x90, detLen); switch(patchType) { case DETOUR_TYPE_JMP: pbPatchBuf[0] = 0xE9; *(DWORD*)&pbPatchBuf[1] = (DWORD)(pbFuncDetour - pbFuncOrig) - 5; break; case DETOUR_TYPE_PUSH_RET: pbPatchBuf[0] = 0x68; *(DWORD*)&pbPatchBuf[1] = (DWORD)pbFuncDetour; pbPatchBuf[5] = 0xC3; break; case DETOUR_TYPE_NOP_JMP: pbPatchBuf[0] = 0x90; pbPatchBuf[1] = 0xE9; *(DWORD*)&pbPatchBuf[2] = (DWORD)(pbFuncDetour - pbFuncOrig) - 6; break; case DETOUR_TYPE_NOP_NOP_JMP: pbPatchBuf[0] = 0x90; pbPatchBuf[1] = 0x90; pbPatchBuf[2] = 0xE9; *(DWORD*)&pbPatchBuf[3] = (DWORD)(pbFuncDetour - pbFuncOrig) - 7; break; case DETOUR_TYPE_STC_JC: pbPatchBuf[0] = 0xF9; pbPatchBuf[1] = 0x0F; pbPatchBuf[2] = 0x82; *(DWORD*)&pbPatchBuf[3] = (DWORD)(pbFuncDetour - pbFuncOrig) - 7; break; case DETOUR_TYPE_CLC_JNC: pbPatchBuf[0] = 0xF8; pbPatchBuf[1] = 0x0F; pbPatchBuf[2] = 0x83; *(DWORD*)&pbPatchBuf[3] = (DWORD)(pbFuncDetour - pbFuncOrig) - 7; break; default: return NULL; } // Write the detour for(int i=0; i<detLen; i++) pbFuncOrig[i] = pbPatchBuf[i]; delete [] pbPatchBuf; // Reset original mem flags VirtualProtect(lpFuncOrig, detLen, dwProt, &dwOldProt); return lpMallocPtr; } BOOL DetourRemove(LPVOID lpDetourCreatePtr) { PBYTE pbMallocPtr = NULL; DWORD dwFuncOrig = NULL; DWORD dwProt = NULL; int i=0; if((pbMallocPtr = (PBYTE)lpDetourCreatePtr) == NULL) return FALSE; // Find the orig jmp32 opcode sig for(i=0; i<=DETOUR_MAX_SRCH_OPLEN; i++) { if(pbMallocPtr[i] == SIG_OP_0 && pbMallocPtr[i+1] == SIG_OP_1 && pbMallocPtr[i+2] == SIG_OP_2) break; if(i == DETOUR_MAX_SRCH_OPLEN) return FALSE; } // Calculate the original address pbMallocPtr += (i-JMP32_SZ+1); // Inc to jmp dwFuncOrig = *(DWORD*)pbMallocPtr; // Get 32bit jmp pbMallocPtr += BIT32_SZ; // Inc to end of jmp dwFuncOrig += (DWORD)pbMallocPtr; // Add this addr to 32bit jmp dwFuncOrig -= (i-JMP32_SZ); // Dec by detour len to get to start of orig // Write the overwritten bytes back to the original VirtualProtect((LPVOID)dwFuncOrig, (i-JMP32_SZ), PAGE_READWRITE, &dwProt); memcpy((LPVOID)dwFuncOrig, lpDetourCreatePtr, (i-JMP32_SZ)); VirtualProtect((LPVOID)dwFuncOrig, (i-JMP32_SZ), dwProt, &dwOldProt); // Memory cleanup free(lpDetourCreatePtr); return TRUE; } int GetDetourLen(int patchType) { switch(patchType) { case DETOUR_TYPE_JMP: return 5; case DETOUR_TYPE_PUSH_RET: case DETOUR_TYPE_NOP_JMP: return 6; case DETOUR_TYPE_NOP_NOP_JMP: case DETOUR_TYPE_STC_JC: case DETOUR_TYPE_CLC_JNC: return 7; default: return 0; } } int GetDetourLenAuto(PBYTE &pbFuncOrig, int minDetLen) { int len = 0; PBYTE pbCurOp = pbFuncOrig; while(len < minDetLen) { int i = oplen(pbCurOp); if(i == 0 || i == -1) return 0; if(len > DETOUR_MAX_SRCH_OPLEN) return 0; len += i; pbCurOp += i; } return len; }
nech sekedar contoh aj scoure code nya,.,,
hanya untuk yg udah pengalaman aj .,...,,
Terakhir diubah oleh BaihaqI(RNC) tanggal Mon Jun 06, 2011 11:17 pm, total 1 kali diubah | |
|