// memreadDlg.cpp : implementation file
//
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <time.h>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
#define PAGE_NONE -1
#pragma comment(lib,"psapi.lib")
#define ELFADD(a,b) (DWORD*)((DWORD)(a) + (DWORD)(b))
#define addptr ELFADD
#define distance(a,b,c) ((DWORD)(a)-(DWORD)(b)+(DWORD)(c))
#define PAGE_SIZE 4096
#define outputdstring debug
/
// CAboutDlg dialog used for App About
/
// CMemreadDlg dialog
/
// CMemreadDlg message handlers
char timestringarr[20]={0};
char*timestring()
{
char tmpbuf[128], ampm[] = "AM";
time_t ltime;
struct tm *today;
/* Get UNIX-style time and display as number and string. */
time( <ime );
/* Convert to time structure and adjust for PM if necessary. */
today = localtime( <ime );
if( today->tm_hour > 12 )
{
strcpy( ampm, "PM" );
today->tm_hour -= 12;
}
if( today->tm_hour == 0 ) /* Adjust if midnight hour. */
today->tm_hour = 12;
strcpy(timestringarr,asctime( today ) + 11);
timestringarr[8]=0;
return 0;
}
void flog(const char*format,...)
{
va_list v;
char buffer[500];
//SYSTEMTIME systemtime;
FILE* fp=NULL;
char* ppath = "flog.txt";
if( (fp=fopen(ppath, "a+"))==NULL)
{
return;
}
va_start(v,format);
_vsnprintf(buffer,500,format,v);
va_end(v);
fprintf(fp,"[%s]%s\n",timestring(),buffer);
fclose(fp);
}
void OutputDebugStringApi(const char*format,...)
{
va_list v;
char buffer[500];
//SYSTEMTIME systemtime;
va_start(v,format);
_vsnprintf(buffer,500,format,v);
va_end(v);
OutputDebugStringA(buffer);
}
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
pushfd
MOV EAX, 0x90909090 // 新的函数以0x90909090作为结束的标志
MOV ECX, 0xFFFFFFFF
MOV EDI, pfn
CLD
REPNZ SCASD
NOT ECX
DEC ECX
MOV res, ECX
popfd
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
pushfd
lea eax, string1
push eax
call opfn
popfd
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
pushfd
lea eax, string2
push eax
call opfn
popfd
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
pushfd
lea eax, string3
push eax
call opfn
popfd
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
pushfd
lea eax, string4
push eax
call opfn
popfd
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
pushfd
lea eax, string5
push eax
call opfn
popfd
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
pushfd
lea eax, string6
push eax
call opfn
popfd
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
pushfd
lea eax, string7
push eax
call opfn
popfd
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
pushfd
lea eax, string8
push eax
call opfn
popfd
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
pushfd
lea eax, string9
push eax
call opfn
popfd
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
pushfd
lea eax, stringA
push eax
call opfn
popfd
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);
}
void __stdcall printbuffer(unsigned char* data)
{
char buffer[50];
int i=0;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
}
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
pushfd
mov eax, ebpoffsetwide
sub ebp,eax
mov eax,[ebp]
push eax
call fn_printebpwidestring
popfd
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
pushfd
mov eax, ebpoffsetansi
sub ebp,eax
mov eax,[ebp]
push eax
call fn_printebpansistring
popfd
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
}
}
#define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS (0x04) // lpModuleName是模块中的一个地址
typedef BOOL (WINAPI* GetModuleHandleExA_T)(
DWORD dwFlags,
LPCSTR lpModuleName,
HMODULE* phModule
);
HMODULE getmodulename(char* buffer,int size,void* addri)
{
HMODULE hmodule;
char FileName[MAX_PATH] = {0};
GetModuleHandleExA_T GetModuleHandleExA=(GetModuleHandleExA_T)GetProcAddress(GetModuleHandle("kernel32.dll"),"GetModuleHandleExA");
GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCSTR)addri, &hmodule);
GetModuleFileNameA(hmodule, buffer, size);
return hmodule;
}
void __stdcall printval(DWORD a)
{
char cc[50];
OutputDebugStringA("-------printval-------");
// char buffer[300];
// HMODULE hmod = getmodulename(buffer,300,(void*)a);
sprintf(cc,"printval %x",a);
// OutputDebugStringA(buffer);
OutputDebugStringA(cc);
OutputDebugStringA("-------printval end-------");
}
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
pushfd
mov eax, offset_ecx_class_wide
add eax,ecx
mov eax,[eax]
push eax
call fn_printebpwidestring
popfd
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
pushfd
mov eax, offset_ecx_class_ansi
add eax,ecx
mov eax,[eax]
push eax
call fn_printebpansistring
popfd
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
pushfd
mov eax, ecxoffsetaddress
add eax,ecx
push eax
call fn_printval
popfd
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<64;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 print_eax_ansistring(char* eax)
{
OutputDebugStringA("-----print_eax_ansistring +------------");
OutputDebugStringA(eax);
OutputDebugStringA("-----print_eax_ansistring -------------");
}
DWORD fn_printeax_ansistring=(DWORD)print_eax_ansistring;
__declspec(naked) printeaxansistring()
{
__asm
{
PUSHAD
pushfd
push eax
call fn_printeax_ansistring
popfd
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_ecx_ansistring(char* ecx)
{
OutputDebugStringA("-----print_ecx_ansistring +------------");
OutputDebugStringA(ecx);
OutputDebugStringA("-----print_ecx_ansistring -------------");
}
DWORD fn_printecx_ansistring=(DWORD)print_ecx_ansistring;
__declspec(naked) printecxansistring()
{
__asm
{
PUSHAD
pushfd
push ecx
call fn_printecx_ansistring
popfd
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_printeaxansistring(DWORD addresshook,int instructionlen)
{
Patch_new(addresshook,instructionlen,(DWORD)printeaxansistring);
}
void __stdcall hook_printecxansistring(DWORD addresshook,int instructionlen)
{
Patch_new(addresshook,instructionlen,(DWORD)printecxansistring);
}
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);
}
DWORD offset_stack_printebpindirectwidestring=0;
DWORD offset_indirect_printebpindirectwidestring=0;
__declspec(naked) _printebpindirectwidestring()
{
__asm
{
PUSHAD
mov eax, offset_stack_printebpindirectwidestring
sub ebp,eax
mov eax,[ebp]
mov ebx,offset_indirect_printebpindirectwidestring
add eax,ebx
mov eax,[eax]
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
}
}
void __stdcall hook_printebpindirectwidestring(DWORD addresshook,int instructionlen,DWORD stackoffset,DWORD classoffset)
{
offset_stack_printebpindirectwidestring = stackoffset;
offset_indirect_printebpindirectwidestring = classoffset;
Patch_new(addresshook,instructionlen,(DWORD)_printebpindirectwidestring);
}
DWORD offset_stack_printansistringstackvarclass=0;
DWORD offset_class_printansistringstackvarclass=0;
__declspec(naked) _printansistringstackvarclass()
{
__asm
{
PUSHAD
mov eax, offset_stack_printansistringstackvarclass
sub ebp,eax
mov eax,[ebp]
mov ebx,offset_class_printansistringstackvarclass
add eax,ebx
mov eax,[eax]
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 hook_printansistringstackvarclass(DWORD addresshook,int instructionlen,DWORD stackoffset,DWORD classoffset)
{
offset_stack_printansistringstackvarclass = stackoffset;
offset_class_printansistringstackvarclass = classoffset;
Patch_new(addresshook,instructionlen,(DWORD)_printansistringstackvarclass);
}
DWORD offset_stack_offset=0;
DWORD offset_stack_offset2=0;
__declspec(naked) _printstackvarIndirectVal()
{
__asm
{
PUSHAD
mov eax, offset_stack_offset
sub ebp,eax
mov eax,[ebp]
mov ebx,offset_stack_offset2
add eax,ebx
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 hook_printstackvarIndirectVal(DWORD addresshook,int instructionlen,DWORD stackoffset,DWORD indirectoffset)
{
offset_stack_offset = stackoffset;
offset_stack_offset2 = indirectoffset;
Patch_new(addresshook,instructionlen,(DWORD)_printstackvarIndirectVal);
}
typedef void (__stdcall*fn_printbuffer_T)(unsigned char* databuffer);
fn_printbuffer_T fn_printbuffer=printbuffer;
DWORD offset_ebp_base=0;
__declspec(naked) _printebpbasebuffer()
{
__asm
{
PUSHAD
mov eax, offset_ebp_base
sub ebp,eax
mov eax,[ebp]
push eax
call fn_printbuffer
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_printebpbasebuffer(DWORD addresshook,int instructionlen,DWORD stackoffset)
{
offset_ebp_base = stackoffset;
Patch_new(addresshook,instructionlen,(DWORD)_printebpbasebuffer);
}
DWORD offset_ebp_base_printbuffer=0;
DWORD offset_ebp_indirect_base_printbuffer=0;
__declspec(naked) _printebpindirectbuffer()
{
__asm
{
PUSHAD
mov eax, offset_ebp_base_printbuffer
sub ebp,eax
mov eax,[ebp]
mov ebx,offset_ebp_indirect_base_printbuffer
add eax,ebx
mov eax,[eax]
push eax
call fn_printbuffer
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_printebpindirectbuffer(DWORD addresshook,int instructionlen,DWORD stackoffset,int indirectoffset)
{
offset_ebp_base_printbuffer = stackoffset;
offset_ebp_indirect_base_printbuffer = indirectoffset;
Patch_new(addresshook,instructionlen,(DWORD)_printebpindirectbuffer);
}
DWORD offset_fn_parameter=0;
DWORD offset_indirect_fn_parameter=0;
__declspec(naked) _printfnparamterwidestringindirect()
{
__asm
{
PUSHAD
mov eax, offset_fn_parameter
add ebp,eax
mov eax,[ebp]
mov ebx,offset_indirect_fn_parameter
add eax,ebx
mov eax,[eax]
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
}
}
void __stdcall hook_printfnparamterwidestringindirect(DWORD addresshook,int instructionlen,DWORD stackoffset,int indirectoffset)
{
offset_fn_parameter = stackoffset;
offset_indirect_fn_parameter = indirectoffset;
Patch_new(addresshook,instructionlen,(DWORD)_printfnparamterwidestringindirect);
}
DWORD offset_fn_parameter_int=0;
__declspec(naked) _printfnparamterDec()
{
__asm
{
PUSHAD
mov eax, offset_fn_parameter_int
add 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
}
}
void __stdcall hook_printfnparamterDec(DWORD addresshook,int instructionlen,DWORD decoffset)
{
offset_fn_parameter_int = decoffset;
Patch_new(addresshook,instructionlen,(DWORD)_printfnparamterDec);
}
DWORD offset_get_eax_offset_val=0;
__declspec(naked) _printeaxoffsetval()
{
__asm
{
PUSHAD
mov ebx, offset_fn_parameter_int
add ebx,eax
mov ebx,[ebx]
push ebx
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 hook_printeaxoffsetval(DWORD addresshook,int instructionlen,DWORD decoffset)
{
offset_get_eax_offset_val = decoffset;
Patch_new(addresshook,instructionlen,(DWORD)_printeaxoffsetval);
}
//
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <time.h>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
#define PAGE_NONE -1
#pragma comment(lib,"psapi.lib")
#define ELFADD(a,b) (DWORD*)((DWORD)(a) + (DWORD)(b))
#define addptr ELFADD
#define distance(a,b,c) ((DWORD)(a)-(DWORD)(b)+(DWORD)(c))
#define PAGE_SIZE 4096
#define outputdstring debug
/
// CAboutDlg dialog used for App About
/
// CMemreadDlg dialog
/
// CMemreadDlg message handlers
char timestringarr[20]={0};
char*timestring()
{
char tmpbuf[128], ampm[] = "AM";
time_t ltime;
struct tm *today;
/* Get UNIX-style time and display as number and string. */
time( <ime );
/* Convert to time structure and adjust for PM if necessary. */
today = localtime( <ime );
if( today->tm_hour > 12 )
{
strcpy( ampm, "PM" );
today->tm_hour -= 12;
}
if( today->tm_hour == 0 ) /* Adjust if midnight hour. */
today->tm_hour = 12;
strcpy(timestringarr,asctime( today ) + 11);
timestringarr[8]=0;
return 0;
}
void flog(const char*format,...)
{
va_list v;
char buffer[500];
//SYSTEMTIME systemtime;
FILE* fp=NULL;
char* ppath = "flog.txt";
if( (fp=fopen(ppath, "a+"))==NULL)
{
return;
}
va_start(v,format);
_vsnprintf(buffer,500,format,v);
va_end(v);
fprintf(fp,"[%s]%s\n",timestring(),buffer);
fclose(fp);
}
void OutputDebugStringApi(const char*format,...)
{
va_list v;
char buffer[500];
//SYSTEMTIME systemtime;
va_start(v,format);
_vsnprintf(buffer,500,format,v);
va_end(v);
OutputDebugStringA(buffer);
}
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
pushfd
MOV EAX, 0x90909090 // 新的函数以0x90909090作为结束的标志
MOV ECX, 0xFFFFFFFF
MOV EDI, pfn
CLD
REPNZ SCASD
NOT ECX
DEC ECX
MOV res, ECX
popfd
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
pushfd
lea eax, string1
push eax
call opfn
popfd
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
pushfd
lea eax, string2
push eax
call opfn
popfd
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
pushfd
lea eax, string3
push eax
call opfn
popfd
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
pushfd
lea eax, string4
push eax
call opfn
popfd
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
pushfd
lea eax, string5
push eax
call opfn
popfd
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
pushfd
lea eax, string6
push eax
call opfn
popfd
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
pushfd
lea eax, string7
push eax
call opfn
popfd
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
pushfd
lea eax, string8
push eax
call opfn
popfd
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
pushfd
lea eax, string9
push eax
call opfn
popfd
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
pushfd
lea eax, stringA
push eax
call opfn
popfd
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);
}
void __stdcall printbuffer(unsigned char* data)
{
char buffer[50];
int i=0;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
i+=8;
sprintf(buffer,"%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x",data[i],data[i+1],data[i+2],data[i+3],data[i+4],data[i+5],data[i+6],data[i+7]);
OutputDebugStringA(buffer);
}
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
pushfd
mov eax, ebpoffsetwide
sub ebp,eax
mov eax,[ebp]
push eax
call fn_printebpwidestring
popfd
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
pushfd
mov eax, ebpoffsetansi
sub ebp,eax
mov eax,[ebp]
push eax
call fn_printebpansistring
popfd
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
}
}
#define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS (0x04) // lpModuleName是模块中的一个地址
typedef BOOL (WINAPI* GetModuleHandleExA_T)(
DWORD dwFlags,
LPCSTR lpModuleName,
HMODULE* phModule
);
HMODULE getmodulename(char* buffer,int size,void* addri)
{
HMODULE hmodule;
char FileName[MAX_PATH] = {0};
GetModuleHandleExA_T GetModuleHandleExA=(GetModuleHandleExA_T)GetProcAddress(GetModuleHandle("kernel32.dll"),"GetModuleHandleExA");
GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCSTR)addri, &hmodule);
GetModuleFileNameA(hmodule, buffer, size);
return hmodule;
}
void __stdcall printval(DWORD a)
{
char cc[50];
OutputDebugStringA("-------printval-------");
// char buffer[300];
// HMODULE hmod = getmodulename(buffer,300,(void*)a);
sprintf(cc,"printval %x",a);
// OutputDebugStringA(buffer);
OutputDebugStringA(cc);
OutputDebugStringA("-------printval end-------");
}
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
pushfd
mov eax, offset_ecx_class_wide
add eax,ecx
mov eax,[eax]
push eax
call fn_printebpwidestring
popfd
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
pushfd
mov eax, offset_ecx_class_ansi
add eax,ecx
mov eax,[eax]
push eax
call fn_printebpansistring
popfd
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
pushfd
mov eax, ecxoffsetaddress
add eax,ecx
push eax
call fn_printval
popfd
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<64;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 print_eax_ansistring(char* eax)
{
OutputDebugStringA("-----print_eax_ansistring +------------");
OutputDebugStringA(eax);
OutputDebugStringA("-----print_eax_ansistring -------------");
}
DWORD fn_printeax_ansistring=(DWORD)print_eax_ansistring;
__declspec(naked) printeaxansistring()
{
__asm
{
PUSHAD
pushfd
push eax
call fn_printeax_ansistring
popfd
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_ecx_ansistring(char* ecx)
{
OutputDebugStringA("-----print_ecx_ansistring +------------");
OutputDebugStringA(ecx);
OutputDebugStringA("-----print_ecx_ansistring -------------");
}
DWORD fn_printecx_ansistring=(DWORD)print_ecx_ansistring;
__declspec(naked) printecxansistring()
{
__asm
{
PUSHAD
pushfd
push ecx
call fn_printecx_ansistring
popfd
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_printeaxansistring(DWORD addresshook,int instructionlen)
{
Patch_new(addresshook,instructionlen,(DWORD)printeaxansistring);
}
void __stdcall hook_printecxansistring(DWORD addresshook,int instructionlen)
{
Patch_new(addresshook,instructionlen,(DWORD)printecxansistring);
}
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);
}
DWORD offset_stack_printebpindirectwidestring=0;
DWORD offset_indirect_printebpindirectwidestring=0;
__declspec(naked) _printebpindirectwidestring()
{
__asm
{
PUSHAD
mov eax, offset_stack_printebpindirectwidestring
sub ebp,eax
mov eax,[ebp]
mov ebx,offset_indirect_printebpindirectwidestring
add eax,ebx
mov eax,[eax]
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
}
}
void __stdcall hook_printebpindirectwidestring(DWORD addresshook,int instructionlen,DWORD stackoffset,DWORD classoffset)
{
offset_stack_printebpindirectwidestring = stackoffset;
offset_indirect_printebpindirectwidestring = classoffset;
Patch_new(addresshook,instructionlen,(DWORD)_printebpindirectwidestring);
}
DWORD offset_stack_printansistringstackvarclass=0;
DWORD offset_class_printansistringstackvarclass=0;
__declspec(naked) _printansistringstackvarclass()
{
__asm
{
PUSHAD
mov eax, offset_stack_printansistringstackvarclass
sub ebp,eax
mov eax,[ebp]
mov ebx,offset_class_printansistringstackvarclass
add eax,ebx
mov eax,[eax]
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 hook_printansistringstackvarclass(DWORD addresshook,int instructionlen,DWORD stackoffset,DWORD classoffset)
{
offset_stack_printansistringstackvarclass = stackoffset;
offset_class_printansistringstackvarclass = classoffset;
Patch_new(addresshook,instructionlen,(DWORD)_printansistringstackvarclass);
}
DWORD offset_stack_offset=0;
DWORD offset_stack_offset2=0;
__declspec(naked) _printstackvarIndirectVal()
{
__asm
{
PUSHAD
mov eax, offset_stack_offset
sub ebp,eax
mov eax,[ebp]
mov ebx,offset_stack_offset2
add eax,ebx
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 hook_printstackvarIndirectVal(DWORD addresshook,int instructionlen,DWORD stackoffset,DWORD indirectoffset)
{
offset_stack_offset = stackoffset;
offset_stack_offset2 = indirectoffset;
Patch_new(addresshook,instructionlen,(DWORD)_printstackvarIndirectVal);
}
typedef void (__stdcall*fn_printbuffer_T)(unsigned char* databuffer);
fn_printbuffer_T fn_printbuffer=printbuffer;
DWORD offset_ebp_base=0;
__declspec(naked) _printebpbasebuffer()
{
__asm
{
PUSHAD
mov eax, offset_ebp_base
sub ebp,eax
mov eax,[ebp]
push eax
call fn_printbuffer
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_printebpbasebuffer(DWORD addresshook,int instructionlen,DWORD stackoffset)
{
offset_ebp_base = stackoffset;
Patch_new(addresshook,instructionlen,(DWORD)_printebpbasebuffer);
}
DWORD offset_ebp_base_printbuffer=0;
DWORD offset_ebp_indirect_base_printbuffer=0;
__declspec(naked) _printebpindirectbuffer()
{
__asm
{
PUSHAD
mov eax, offset_ebp_base_printbuffer
sub ebp,eax
mov eax,[ebp]
mov ebx,offset_ebp_indirect_base_printbuffer
add eax,ebx
mov eax,[eax]
push eax
call fn_printbuffer
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_printebpindirectbuffer(DWORD addresshook,int instructionlen,DWORD stackoffset,int indirectoffset)
{
offset_ebp_base_printbuffer = stackoffset;
offset_ebp_indirect_base_printbuffer = indirectoffset;
Patch_new(addresshook,instructionlen,(DWORD)_printebpindirectbuffer);
}
DWORD offset_fn_parameter=0;
DWORD offset_indirect_fn_parameter=0;
__declspec(naked) _printfnparamterwidestringindirect()
{
__asm
{
PUSHAD
mov eax, offset_fn_parameter
add ebp,eax
mov eax,[ebp]
mov ebx,offset_indirect_fn_parameter
add eax,ebx
mov eax,[eax]
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
}
}
void __stdcall hook_printfnparamterwidestringindirect(DWORD addresshook,int instructionlen,DWORD stackoffset,int indirectoffset)
{
offset_fn_parameter = stackoffset;
offset_indirect_fn_parameter = indirectoffset;
Patch_new(addresshook,instructionlen,(DWORD)_printfnparamterwidestringindirect);
}
DWORD offset_fn_parameter_int=0;
__declspec(naked) _printfnparamterDec()
{
__asm
{
PUSHAD
mov eax, offset_fn_parameter_int
add 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
}
}
void __stdcall hook_printfnparamterDec(DWORD addresshook,int instructionlen,DWORD decoffset)
{
offset_fn_parameter_int = decoffset;
Patch_new(addresshook,instructionlen,(DWORD)_printfnparamterDec);
}
DWORD offset_get_eax_offset_val=0;
__declspec(naked) _printeaxoffsetval()
{
__asm
{
PUSHAD
mov ebx, offset_fn_parameter_int
add ebx,eax
mov ebx,[ebx]
push ebx
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 hook_printeaxoffsetval(DWORD addresshook,int instructionlen,DWORD decoffset)
{
offset_get_eax_offset_val = decoffset;
Patch_new(addresshook,instructionlen,(DWORD)_printeaxoffsetval);
}