⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myhiew.cpp

📁 my hiew,hiew修改
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				else
					sprintf(curins,"push d,[0%x]",mi->second);
				break;
				
			default:				
				sprintf(curins,"push %s",paramtbl[nParam]);
				break;
			}

			AsmEngRet=AsmEng(curins,buf+ndata,0x7FFF,srcaddr+ndata);

			if(AsmEngRet>0)
				ndata+=AsmEngRet;
			else
			{
				MyRet=AsmEngRet;
				goto end;
			}

			nParam--;
		}
		sprintf(curins,"call %s",paramtbl[0]);

		AsmEngRet=AsmEng(curins,buf+ndata,0x7FFF,srcaddr+ndata);

		if(AsmEngRet>0)
			ndata+=AsmEngRet;
		else
		{
			MyRet=AsmEngRet;
			goto end;
		}

		MyRet=ndata;
		goto end;
	}

	ifins("deflb")
	{
		char msg[100];
		if(!strlen(operand))goto invalid;
		if(!GetSecHeaderByFO(srcaddr))
		{
			strcpy(msg," CurrentAddress is invalid! Lable defined faild! ");
			MsgOut(msg);
			goto invalid;
		}

		if(strchr(operand,' '))*strchr(operand,' ')=0;
		strlwr(operand);
		LableMap[string(operand)]=srcaddr-GetSecHeaderByFO(srcaddr)->PointerToRawData+GetSecHeaderByFO(srcaddr)->VirtualAddress+NTHeader.OptionalHeader.ImageBase;

		wsprintf(msg," Lable(\"%s\")=0x%X defined successfully!!! ",operand,LableMap[operand]);
		MsgOut(msg);

		MyRet=-1;
		goto end;
	}

	ifins("mov")
	{
		if(!strchr(operand,','))goto invalid;
		//modibyme
		if((!strchr(operand,'@'))&&(!strchr(operand,'*')))goto invalid;
		//modibyme

		char opdes[100];
		char opsrc[100];
		char*p;

		if(operand[0]=='@')
		{
			p=strchr(operand,',');
			*p=0;
			strcpy(opdes,operand+1);
			strcpy(opsrc,p+1);
			
			strlwr(opdes);
			map<string,DWORD>::iterator mi=LableMap.find(opdes);
			if(mi==LableMap.end())
				goto invalid;
			else
				sprintf(opdes,"0%x",mi->second);
			
			char curins[100];
			wsprintf(curins,"mov %s,%s",opdes,opsrc);
			MyRet=AsmEng(curins,buf,0x7FFF,srcaddr);
			goto end;
			
		}

		if(p=strstr(operand,",@"))
		{
			*p=0;
			strcpy(opdes,operand);
			strcpy(opsrc,p+2);
			
			strlwr(opsrc);
			map<string,DWORD>::iterator mi=LableMap.find(opsrc);
			if(mi==LableMap.end())
				goto invalid;
			else
				sprintf(opsrc,"0%x",mi->second);
			
			char curins[100];
			wsprintf(curins,"mov %s,%s",opdes,opsrc);
			MyRet=AsmEng(curins,buf,0x7FFF,srcaddr);
			goto end;
		}

		if(operand[0]=='*')
		{
			p=strchr(operand,',');
			*p=0;
			strcpy(opdes,operand+1);
			strcpy(opsrc,p+1);
			
			strlwr(opdes);
			map<string,DWORD>::iterator mi=LableMap.find(opdes);
			if(mi==LableMap.end())
				goto invalid;
			else
				sprintf(opdes,"d,[0%x]",mi->second);
			
			char curins[100];
			wsprintf(curins,"mov %s,%s",opdes,opsrc);
			MyRet=AsmEng(curins,buf,0x7FFF,srcaddr);
			goto end;
			
		}

		//addbyme
		if(*(WORD*)&(operand[1]) == '*,')
		{
			//addbyme
			char *lpOperSize = strchr(operand,'*');
			*(lpOperSize - 1) = '\0';
			char *szOperNew = lpOperSize;
			//addbyme

			p=strchr(szOperNew,',');
			*p=0;
			strcpy(opdes,szOperNew+1);
			strcpy(opsrc,p+1);
			
			strlwr(opdes);
			map<string,DWORD>::iterator mi=LableMap.find(opdes);
			if(mi==LableMap.end())
				goto invalid;
			else
				sprintf(opdes,"%s,[0%x]",operand,mi->second);
			
			char curins[100];
			wsprintf(curins,"mov %s,%s",opdes,opsrc);
			//MsgOut(curins);
			MyRet=AsmEng(curins,buf,0x7FFF,srcaddr);
			goto end;
			
		}
		//addbyme
		
		if(p=strstr(operand,",*"))
		{
			*p=0;
			strcpy(opdes,operand);
			strcpy(opsrc,p+2);
			
			strlwr(opsrc);
			map<string,DWORD>::iterator mi=LableMap.find(opsrc);
			if(mi==LableMap.end())
				goto invalid;
			else
				sprintf(opsrc,"[0%x]",mi->second);
			
			char curins[100];
			wsprintf(curins,"mov %s,%s",opdes,opsrc);
			MyRet=AsmEng(curins,buf,0x7FFF,srcaddr);
			goto end;
		}



	}


invalid:
	ClosePE();
	//addbyme
	int temp;
	temp = AsmEng(srcins_bak,buf,unknow,srcaddr);
	bLocked = false;
	return temp;
	//addbyme

end:
	ClosePE();
	//addbyme
	bLocked = false;
	//addbyme
	return MyRet;
}


char CodeBuffer[0x100];
void*GetCodeBuffer()
{
	return CodeBuffer;
}


//modibyme
char *cliptext = NULL;
//modibyme

//addbyme
OSVERSIONINFO	ver;
HWND	hWndFore;

void	MyInputKey(TCHAR vkey)
{
	if (ver.dwPlatformId == VER_PLATFORM_WIN32_NT)
	{
		if(HIBYTE(vkey)&1)
		{
			keybd_event(VK_SHIFT,0,0,0);
			keybd_event(LOBYTE(vkey),0,0,0);
			keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
		}
		else
		{
			keybd_event(LOBYTE(vkey),0,0,0);
		}
	}
	else
	{
		Sleep(80);
		SendMessage(hWndFore, WM_KEYDOWN, LOBYTE(vkey), (MapVirtualKey(vkey,0)<<16)|0x0001);
		Sleep(80);
		SendMessage(hWndFore, WM_KEYUP, LOBYTE(vkey), (3<<30)|(MapVirtualKey(vkey,0)<<16)|0x0001);
	}
}

char*	MyFormatStr(char * ptr)
{
	//格式化输入数据
	int	l = strlen(ptr);
	char	*p = new char[l+1];
	char	*tmp = new char[l+1];
	char	*opr;
	strcpy(p, ptr);
	//清空原来的
	memset(ptr, 0, l);

	int	i, j, k;
	int	pos = 0;
	//替换所有的制表符为空格
	for (i=0; i<l; i++)
	{
		if (p[i] == '\t')
		{
			p[i] = ' ';
		}
	}

	for (i=0; i<l; i++)
	{
		//取得一行数据
		memset(tmp,0,l+1);
		j = 0;
		while((p[i]!='\0') && (p[i]!='\r') && (p[i]!='\n'))
		{
			tmp[j++] = p[i++];
		}
		if (strlen(tmp) > 0)
		{
			//去除";"或"//"引导的注释
			k = 0;
			while (tmp[k])
			{
				if ((tmp[k]==';') || (*(WORD*)(tmp+k)=='//'))
				{
					tmp[k] = '\0';
					break;
				}
				k++;
			}

			//去除尾部空格
			k = strlen(tmp);
			while (tmp[--k] == ' ');
			k++;
			tmp[k] = '\0';
			//去除行首空格空格
			opr = tmp;
			while (*opr == ' ')
			{
				opr++;
			}
			if (strlen(opr) > 0)
			{
				//保存字符串
				pos = strlen(ptr);
				strcpy(ptr+pos,opr);
				//加回车符
				pos = strlen(ptr);
				ptr[pos++] = VK_RETURN;
				ptr[pos] = '\0';
			}
		}
	}

	delete[]	p, tmp;
	return	ptr;
}
//addbyme

//modibyme
DWORD WINAPI KeyInput(void*string)
{
	//addbyme
	ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
	GetVersionEx(&ver);

	hWndFore = GetForegroundWindow();
	//addbyme

	char*ptr=(char*)string;
	SHORT VkKey;
	//addbyme
	MyFormatStr(ptr);
	bool	bNewLine = true;
	//addbyme*/
	while(*ptr)
	{
		//addbyme
		if(bNewLine)
		{
			//while (bLocked == true);
			_asm
			{
waitforfree:
				test	bLocked, 0
				jne	waitforfree
			}
			//为什么不用VK_SPACE?
			//因为对于repxx movs/stos/scas...指令,系统早就在MyAsmEng之前把指令读入缓冲区,前面加空格会出现错误操作符提示
			//那么为什么不取消这类指令之前的空格?因为空格还有一个用处是消除前续的错误对话框.是否有此对话框无法预知.

			//用空格取消当前指令框中的原指令
			Sleep(50);
			VkKey = VkKeyScan(VK_SPACE);
			MyInputKey(VkKey);
			//如果是定义的伪指令,上面的空格会消除弹出的提示框,这个空格再消除指令框中的指令
			Sleep(50);
			VkKey = VkKeyScan(VK_SPACE);
			MyInputKey(VkKey);
			//删除前面的空格
			Sleep(50);
			VkKey = VkKeyScan(VK_BACK);
			MyInputKey(VkKey);
			Sleep(50);
			VkKey = VkKeyScan(VK_BACK);
			MyInputKey(VkKey);
		}
		//addbyme
		//delbyme
		//if(*ptr=='\n')
		//{
		//	ptr++;
		//	continue;
		//}
		//delbyme
		Sleep(50);
		VkKey=VkKeyScan(*ptr);
		MyInputKey(VkKey);
		//modibyme
		if(VkKey == VK_RETURN)
		{
			//addbyme
			bNewLine = true;
		}
		else
		{
			bNewLine = false;
		}
			//addbyme
		//modibyme
		ptr++;
	}
	//addbyme
	delete[]	cliptext;
	cliptext = NULL;
	//addbyme
	return 1;
}
//modibyme

#define assert(a) if(!a){MsgOut("myHiew.dll Error:" #a " return FALSE");return 0;}
BOOL InputClipData()
{
	assert(OpenClipboard(NULL));
	HANDLE hMem=GetClipboardData(CF_TEXT);
	assert(hMem);
	char*ptr=(char*)GlobalLock(hMem);
	assert(ptr);
	//addbyme
	cliptext = new char[strlen(ptr)+1];
	assert(cliptext);
	//addbyme
	strcpy(cliptext,ptr);
	GlobalUnlock(hMem);
	assert(CloseClipboard());

	DWORD	lpThreadId;
	CreateThread(NULL,0,KeyInput,cliptext,NULL,&lpThreadId);

	return 1;
}

BOOL SetCursorVisible(BOOL bV)
{
	BOOL ret;
	HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO CursorInfo;
	GetConsoleCursorInfo(hout,&CursorInfo);
	ret=CursorInfo.bVisible;
	CursorInfo.bVisible=bV;
	SetConsoleCursorInfo(hout,&CursorInfo);
	return ret;
}

BOOL SetString(CHAR_INFO*pbuf,int lenbuf,const char*str,DWORD Attributes)
{
	int lenstr=strlen(str);
	int i;
	for(i=0;(i<lenbuf)&&(i<lenstr);i++)
	{
		pbuf[i].Attributes=Attributes;
		pbuf[i].Char.AsciiChar=str[i];
	}

	while(i<lenbuf)
	{
		pbuf[i].Attributes=Attributes;
		pbuf[i].Char.AsciiChar=' ';
		i++;
	}

	return 1;
}


void PrintLable(int n)
{
	HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
	CHAR_INFO buf[25][80];
	COORD size;
	COORD bufcoord;
	SMALL_RECT dest;

	size.X=80;
	size.Y=25;

	bufcoord.X=0;
	bufcoord.Y=0;

	dest.Top=0;
	dest.Left=0;
	dest.Right=79;
	dest.Bottom=24;

	ReadConsoleOutput(hout,&buf[0][0],size,bufcoord,&dest);

	int i=0;
	int line=0;
	if(!LableMap.empty())
	{
		map<string,DWORD>::iterator mi;
		for(mi=LableMap.begin(),i=0;(mi!=LableMap.end());i++,mi++)
		{
			if((i>=n-n%24)&&(i<n-n%24+24))
			{
				char str[100];
				wsprintf(str,"Lable(%2d/%d): %15s = %8Xh(VirtualAddress)",i+1,LableMap.size(),(*mi).first.c_str(),(*mi).second);
				SetString(buf[line],80,str,FOREGROUND_RED);
				if(i==n)SetString(buf[line],80,str,FOREGROUND_RED|BACKGROUND_BLUE);
				line++;
			}
		}
	}
	
	for(;line<24;line++)
	{
		SetString(buf[line],80,"",FOREGROUND_RED);
	}
	SetString(buf[line],80,"******** [F1=Delete Current] [F2=Delete All] [F3=Paste VA] [ESC=Return] ********",FOREGROUND_RED);

	WriteConsoleOutput(hout,&buf[0][0],size,bufcoord,&dest);

}

BOOL CopyText(const char*txt)
{
	if(!OpenClipboard(NULL))return FALSE; 
    EmptyClipboard(); 

	int lentxt=strlen(txt);
	HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,lentxt+1); 
	if(hglbCopy==NULL) 
	{
		CloseClipboard();
		return FALSE;
	}
	
	char*lpstrCopy=(char*)GlobalLock(hglbCopy);
	memcpy(lpstrCopy,txt,lentxt); 
	lpstrCopy[lentxt]=0;
	GlobalUnlock(hglbCopy);

	SetClipboardData(CF_TEXT,hglbCopy);

	CloseClipboard();
	return TRUE;
}

void LableOut()
{
	BOOL bV=SetCursorVisible(FALSE);
	int i=0;
	int max=LableMap.size();
	DWORD key;
	while(1)
	{
		key=GetInput();
		switch(key)
		{
		case 0x1B: //ESC
			SetCursorVisible(bV);
			return;
			break;
	
		case 0x0FF3B: //F1
			if(max)
			{
				int n=0;
				map<string,DWORD>::iterator mi;
				for(mi=LableMap.begin(),n=0;mi!=LableMap.end();n++,mi++)
				{
					if(n==i)
					{
						LableMap.erase(mi);
						break;
					}
				}
				if(i)i--;
			}
			break;

		case 0x0FF3C: //F2
			LableMap.clear();
			i=0;
			break;

		case 0x0FF3D: //F3
			if(max)
			{
				int n=0;
				map<string,DWORD>::iterator mi;
				for(mi=LableMap.begin(),n=0;mi!=LableMap.end();n++,mi++)
				{
					if(n==i)
					{
						char sVA[30];
						wsprintf(sVA,"0%X",(*mi).second);
						CopyText(sVA);
						break;
					}
				}
			}
			break;

		case 0xFF50: //Down
			i++;
			if(i>=max)i=0;
			break;

		case 0xFF48: //Up
			if(i)i--;else i=max-1;
			break;
		}
		PrintLable(i);
	}
}


int WINAPI GetUserInput(int key)
{
	switch(key)
	{
	case 0x0FF85: //F11
		LableOut();
		key=0;
		break;

	case 0x0FF86: //F12=PasteClipData
		InputClipData();
		key=0;
		break;
	}
	return key;
}

BOOL WINAPI FixBufferSize(HANDLE hConsoleOutput,PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
{
	hConsoleOut=hConsoleOutput;
	COORD size;
	size.X=80;
	size.Y=25;
	SetConsoleScreenBufferSize(hConsoleOutput,size);
	return GetConsoleScreenBufferInfo(hConsoleOutput,lpConsoleScreenBufferInfo);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -