首页
社区
课程
招聘
修改myHiew(包括其中的一些BUG,11月30日更新)
2004-11-28 09:41 24788

修改myHiew(包括其中的一些BUG,11月30日更新)

2004-11-28 09:41
24788
一. 修改的BUG及增强的功能
    1.启用了作者不小心禁用的mov指令中的"*"功能,并使之可以用b,w,d等操作数类型来操作数据.
    2.胡乱修改了输入语句及操作指令等的缓冲区,使之足够大.
    3.为避免在计算时(此时汇编指令输入窗口未弹出)继续自动输入字符,加了一个简单的bLocked标志来进行线程同步.
    4.不需要再对您写的代码每行开头都加N个空格了.按下F12后,DLL会对输入的代码进行自动格式化,然后才自动输入汇编窗口.
    5.第4步里同时也修正了原版HIEW中" rep movsb"中(有前缀的空格)不能正确识别的问题.
    6.用户可以用前缀";"或"//"来添加表示注释的语句.
    7.解决了9x和NT内核下的兼容性问题.

二. 下载地址
附件:myHiew_noname.rar[11月30日更新]

三. 修改后的代码.(所有我修改的代码都标记在//modibyme之间,添加的代码都在//addbyme之间,删除的代码在//delbyme之间)
// myHiew.cpp : Defines the entry point for the DLL application.
//





#include "stdafx.h"
#include <stdio.h>
#include <map>
#include <string>

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    return TRUE;
}


#define getdata(buf,pos,len) {if(fseek(fh,pos,0))return 0;if(fread(buf,1,len,fh)!=len)return 0;}
#define getvalue(var,pos) getdata(&var,pos,sizeof(var))
#define getstring(buf,pos) {if(fseek(fh,pos,0))return 0;if(!fgets(buf,sizeof(buf),fh))return 0;}

static IMAGE_DOS_HEADER DOSHeader;
static IMAGE_NT_HEADERS NTHeader;
static IMAGE_SECTION_HEADER*pSecHeader;
static FILE*fh;
//addbyme
static bool bLocked = false;
//addbyme

HANDLE hConsoleOut;
HANDLE hConsoleIn;

using namespace std;
map <string,DWORD> LableMap;

void (*MsgOut)(char*msg)=(void(*)(char*))0x4249C0;
DWORD (*GetInput)(void)=(DWORD(*)(void))0x4244A0;

IMAGE_SECTION_HEADER*GetSecHeaderByRVA(DWORD RVA)
{
	int nSec=NTHeader.FileHeader.NumberOfSections;
	for(int i=0;i<nSec;i++)
	{
		if((RVA>=pSecHeader[i].VirtualAddress)&&(RVA<(pSecHeader[i].VirtualAddress+pSecHeader[i].SizeOfRawData)))
		{
			return &pSecHeader[i];
		}
	}
	return 0;
}

IMAGE_SECTION_HEADER*GetSecHeaderByFO(DWORD FO) //File Offset
{
	int nSec=NTHeader.FileHeader.NumberOfSections;
	for(int i=0;i<nSec;i++)
	{
		if((FO>=pSecHeader[i].PointerToRawData)&&(FO<(pSecHeader[i].PointerToRawData+pSecHeader[i].SizeOfRawData)))
		{
			return &pSecHeader[i];
		}
	}
	return 0;
}


IMAGE_SECTION_HEADER*GetSecHeaderByVA(DWORD VA)
{
	DWORD RVA=VA-NTHeader.OptionalHeader.ImageBase;
	return GetSecHeaderByRVA(RVA);
}

DWORD RVAtoOfs(DWORD RVA)
{
	IMAGE_SECTION_HEADER*pSection=GetSecHeaderByRVA(RVA);
	if(pSection)return RVA-pSection->VirtualAddress+pSection->PointerToRawData;
	return 0xFFFFFFFF;
}

DWORD VAtoOfs(DWORD VA)
{
	return RVAtoOfs(VA-NTHeader.OptionalHeader.ImageBase);
}

DWORD VAtoFixedOfs(DWORD VA,DWORD srcaddr)
{
	DWORD addr=VA;
	IMAGE_SECTION_HEADER*pSrcSecHeader=GetSecHeaderByFO(srcaddr);
	if(!pSrcSecHeader)return 0xFFFFFFFF;
	if(!GetSecHeaderByVA(addr))return 0xFFFFFFFF;

	//fd=fs-vs+vd=vd-(vs-fs)=vd-((srcVirtualBase+ImageBase)-srcFileBase)

	addr=addr-(pSrcSecHeader->VirtualAddress+NTHeader.OptionalHeader.ImageBase-pSrcSecHeader->PointerToRawData);

	return addr;
}

DWORD RVAtoFixedOfs(DWORD VA,DWORD srcaddr)
{
	return VAtoFixedOfs(VA+NTHeader.OptionalHeader.ImageBase,srcaddr);
}

DWORD GetThunkByName(char*dll,char*api)
{
	strlwr(api);
	IMAGE_IMPORT_DESCRIPTOR IID;
	int nIID=0;
	getvalue(IID,RVAtoOfs(NTHeader.OptionalHeader.DataDirectory[1].VirtualAddress));

	while(IID.Name)
	{
		char dllname[50];
		getstring(dllname,RVAtoOfs(IID.Name));
		strlwr(dllname);

		if(dll)
		{
			if(strstr(dllname,".dll"))
				*strstr(dllname,".dll")=0;
			strlwr(dll);
			if(strcmp(dll,dllname))
			{
				nIID++;
				getvalue(IID,RVAtoOfs(NTHeader.OptionalHeader.DataDirectory[1].VirtualAddress)+sizeof(IMAGE_IMPORT_DESCRIPTOR)*nIID);
				continue;
			}
		}

		DWORD thunk;
		int nThunk=0;
		getvalue(thunk,RVAtoOfs(IID.FirstThunk+nThunk*4));
		if(RVAtoOfs(thunk+2)==0xFFFFFFFF)
			getvalue(thunk,RVAtoOfs(IID.OriginalFirstThunk+nThunk*4));

		while(thunk)
		{
			char apiname[50];
			if(!(thunk&IMAGE_ORDINAL_FLAG32))
			{
				getstring(apiname,RVAtoOfs(thunk+2));
				strlwr(apiname);
				//WritePrivateProfileString("Debug",api,apiname,".\\Debug.ini");
				if(!strcmp(api,apiname))return IID.FirstThunk+nThunk*4;
			}

			nThunk++;
			getvalue(thunk,RVAtoOfs(IID.FirstThunk+nThunk*4));
			if(RVAtoOfs(thunk+2)==0xFFFFFFFF)
				getvalue(thunk,RVAtoOfs(IID.OriginalFirstThunk+nThunk*4));
			
		}
		
		nIID++;
		getvalue(IID,RVAtoOfs(NTHeader.OptionalHeader.DataDirectory[1].VirtualAddress)+sizeof(IMAGE_IMPORT_DESCRIPTOR)*nIID);

	}

	return 0;

}

BOOL ReadPE(char*path)
{
	//Read DOSHeader PEHeader SectionHeader

	pSecHeader=NULL;
	fh=NULL;

	fh=fopen(path,"rb");
	if(!fh)return 0;

	getvalue(DOSHeader,0);
	getvalue(NTHeader,DOSHeader.e_lfanew);
	int nSec=NTHeader.FileHeader.NumberOfSections;
	pSecHeader=new IMAGE_SECTION_HEADER[nSec];
	getdata(pSecHeader,sizeof(IMAGE_NT_HEADERS)+DOSHeader.e_lfanew,sizeof(IMAGE_SECTION_HEADER)*nSec);

	return 1;

}

BOOL ClosePE()
{
	if(pSecHeader)delete []pSecHeader;
	if(fh)fclose(fh);
	return 1;
}

BOOL ConvertIns(char*srcins,int srcaddr)
{
	char tmp[100];
	char sign[100];
	char ins[100];
	char operand[500];
	int len=strlen(srcins);
	int i;
	strcpy(tmp,srcins);
	for(i=0;i<len;i++)if(tmp[i]==0x20)tmp[i]=0;

	i=0;
	while(*(srcins+i))
	{
		if(*(srcins+i)!=0x20)goto getsign;
		i++;
	}
	goto invalid;

getsign:
	strcpy(sign,tmp+i);
	i+=strlen(tmp+i);
	while(*(srcins+i))
	{
		if(*(srcins+i)!=0x20)goto getins;
		i++;
	}
	goto invalid;

getins:
	strcpy(ins,tmp+i);
	i+=strlen(tmp+i);
	while(*(srcins+i))
	{
		if(*(srcins+i)!=0x20)goto getoperand;
		i++;
	}
	goto invalid;

getoperand:
	strcpy(operand,tmp+i);
	i+=strlen(tmp+i);

	while(*(srcins+i))
	{
		if(*(srcins+i)!=0x20)goto invalid;
		i++;
	}
	goto termin;

termin:
	strlwr(sign);


	if(!strcmp(sign,"ofslb"))
	{
		if(!strlen(operand))goto invalid;
		strlwr(operand);

		map<string,DWORD>::iterator mi=LableMap.find(operand);
		if(mi==LableMap.end())goto invalid;

		DWORD addr=mi->second;
		addr=VAtoFixedOfs(addr,srcaddr);
		if(addr==0xFFFFFFFF)goto invalid;

		sprintf(tmp,"%s 0%x",ins,addr);
		goto valid;
	}

	if(!strcmp(sign,"valb"))
	{
		if(!strlen(operand))goto invalid;
		strlwr(operand);

		map<string,DWORD>::iterator mi=LableMap.find(operand);
		if(mi==LableMap.end())goto invalid;

		sprintf(tmp,"%s 0%x",ins,mi->second);
		goto valid;
	}

	if(!strcmp(sign,"rva"))
	{
		int j=strlen(operand);
		for(i=0;i<j;i++)
		{
			if(!isxdigit(operand[i]))goto invalid;
		}

		DWORD addr;
		sscanf(operand,"%x",&addr);

		addr=RVAtoFixedOfs(addr,srcaddr);
		if(addr==0xFFFFFFFF)goto invalid;

		sprintf(tmp,"%s 0%x",ins,addr);
		goto valid;
	}

	if(!strcmp(sign,"va"))
	{
		int j=strlen(operand);
		for(i=0;i<j;i++)
		{
			if(!isxdigit(operand[i]))goto invalid;
		}

		DWORD addr;
		sscanf(operand,"%x",&addr);

		addr=VAtoFixedOfs(addr,srcaddr);
		if(addr==0xFFFFFFFF)goto invalid;

		sprintf(tmp,"%s 0%x",ins,addr);
		goto valid;
	}

	if(!strcmp(sign,"api"))
	{
		char*ptoken=strchr(operand,'.');
		char dll[50];
		char api[50];
		DWORD thunk;
		
		if(ptoken)
		{
			if(strchr(ptoken+1,'.'))goto invalid;
			*ptoken=0;
			strcpy(dll,operand);
			strcpy(api,ptoken+1);
			thunk=GetThunkByName(dll,api);
			if(thunk)
			{
				sprintf(tmp,"%s d,[0%x]",ins,thunk+NTHeader.OptionalHeader.ImageBase);
				goto valid;
			}
		}
		else
		{
			thunk=GetThunkByName(NULL,operand);
			if(thunk)
			{
				sprintf(tmp,"%s d,[0%x]",ins,thunk+NTHeader.OptionalHeader.ImageBase);
				goto valid;
			}
		}
		goto invalid;
	}

	goto invalid;

valid:
	strcpy(srcins,tmp);
	return 1;

invalid:
	return 0;
}

BOOL GetCallAddr(char*str,DWORD srcaddr)
{
	if(isdigit(*str)) // VA
	{
		DWORD addr=0xFFFFFFFF;
		sscanf(str,"%X",&addr);
		
		addr=VAtoFixedOfs(addr,srcaddr);
		if(addr==0xFFFFFFFF)return 0;

		sprintf(str,"0%X",addr);
		return 1;
	}
	
	DWORD thunk=GetThunkByName(NULL,str);
	if(thunk) //API
	{
		sprintf(str,"d,[0%x]",thunk+NTHeader.OptionalHeader.ImageBase);
		return 1;
	}

	//Lable
	strlwr(str);
	map<string,DWORD>::iterator mi=LableMap.find(str);
	if(mi==LableMap.end())return 0;
	
	DWORD addr=mi->second;
	addr=VAtoFixedOfs(addr,srcaddr);
	if(addr==0xFFFFFFFF)return 0;
	
	sprintf(str,"0%X",addr);
	
	return 1;
}

#define ifins(a) if(!strcmp(ins,a))
int myAsmEng(char*srcins,char*buf,int unknow,int srcaddr)
{
	//addbyme
	bLocked = true;
	//addbyme

	int (*AsmEng)(char*srcins,char*buf,int unknow,int srcaddr);
	AsmEng=(int (__cdecl *)(char *,char *,int,int))0x0410320;
	int MyRet=-1;

	char srcins_bak[100];
	strcpy(srcins_bak,srcins);

	char*path=*(char**)(0x441D44);
	if(!path)goto invalid;

	if(!ReadPE(path))
	{
		ClosePE();
		goto invalid;
	}

	ConvertIns(srcins,srcaddr);
	strcpy(srcins_bak,srcins);

	char tmp[100];
	char ins[100];
	char operand[500];
	int len;
	len=strlen(srcins);
	int i;
	strcpy(tmp,srcins);
	for(i=0;i<len;i++)if(tmp[i]==0x20)tmp[i]=0;

	i=0;
	while(*(srcins+i))
	{
		if(*(srcins+i)!=0x20)goto getins;
		i++;
	}
	goto invalid;

getins:
	strcpy(ins,tmp+i);
	i+=strlen(tmp+i);
	while(*(srcins+i))
	{
		if(*(srcins+i)!=0x20)goto getoperand;
		i++;
	}
	goto getoperand;

getoperand:
	strcpy(operand,srcins+i);
	goto valid;

valid:
	strlwr(ins);
	//addbyme
	//char nonename[100];
	//nonename[0]=':';
	//strcpy(nonename+1,ins);
	//MsgOut(nonename);
	//addbyme

	ifins("codexor") // codexor len,key
	{
		if(!strlen(operand))goto invalid;
		if(!strchr(operand,','))goto invalid;

		char*ptok=strchr(operand,',');
		*ptok=0;
		DWORD len=0x200;
		DWORD key=0;
		sscanf(operand,"%X",&len);
		sscanf(ptok+1,"%X",&key);
		if((len>0x100)||(!len))goto invalid;
		len=len/4;
		if(fseek(fh,srcaddr,0))goto invalid;

		DWORD*databuf=new DWORD[len];
		if(fread(databuf,4,len,fh)!=len)
		{
			delete []databuf;
			goto invalid;
		}

		int i;
		for(i=0;i<len;i++)
			*((DWORD*)buf+i)=databuf[i] ^ key;

		MyRet=len*4;
		goto end;
	}

	ifins("asc")
	{
		int lenoperand=strlen(operand);
		if(!lenoperand)goto invalid;
		strcpy(buf,operand);
		MyRet=strlen(operand)+1;
		goto end;
	}

	ifins("cinvoke")
	{
		char paramtbl[10][100];
		int nParam=0;
		char*param=strtok(operand,"/");
		while(param&&(nParam<10))
		{
			strcpy(paramtbl[nParam],param);
			param=strtok(NULL,"/");
			nParam++;
		}
		nParam--;
		if(nParam==0)goto invalid;
		if(!GetCallAddr(paramtbl[0],srcaddr))goto invalid;
		int npush=nParam;
		int ndata=0;
		char curins[100];
		int AsmEngRet;
		map<string,DWORD>::iterator mi;
		while(nParam)
		{
			strlwr(paramtbl[nParam]);
			switch(paramtbl[nParam][0])
			{
			case '@':
				
				mi=LableMap.find(¶mtbl[nParam][1]);
				if(mi==LableMap.end())
					sprintf(curins,"push %s",paramtbl[nParam]);
				else
					sprintf(curins,"push 0%x",mi->second);
				break;
				
			case '*':
				mi=LableMap.find(¶mtbl[nParam][1]);
				if(mi==LableMap.end())
					sprintf(curins,"push %s",paramtbl[nParam]);
				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
			//addbyme
			{
				bLocked = false;
				return AsmEngRet;
			}
			//addbyme

			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;
		}
		
		if(npush>1)
		{
			sprintf(curins,"add esp,0%x",npush*4);
			
			AsmEngRet=AsmEng(curins,buf+ndata,0x7FFF,srcaddr+ndata);
			
			if(AsmEngRet>0)
				ndata+=AsmEngRet;
			else
			{
				MyRet=AsmEngRet;
				goto end;
			}
		}

		//addbyme
		bLocked = false;
		//addbyme
		return ndata;
	}


	ifins("sinvoke")
	{
		char paramtbl[10][100];
		int nParam=0;
		char*param=strtok(operand,"/");
		while(param&&(nParam<10))
		{
			strcpy(paramtbl[nParam],param);
			param=strtok(NULL,"/");
			nParam++;
		}
		nParam--;
		if(nParam==0)goto invalid;
		if(!GetCallAddr(paramtbl[0],srcaddr))goto invalid;
		int npush=nParam;
		int ndata=0;
		char curins[100];
		int AsmEngRet;
		map<string,DWORD>::iterator mi;
		while(nParam)
		{
			strlwr(paramtbl[nParam]);
			switch(paramtbl[nParam][0])
			{
			case '@':
				
				mi=LableMap.find(¶mtbl[nParam][1]);
				if(mi==LableMap.end())
					sprintf(curins,"push %s",paramtbl[nParam]);
				else
					sprintf(curins,"push 0%x",mi->second);
				break;
				
			case '*':
				mi=LableMap.find(¶mtbl[nParam][1]);
				if(mi==LableMap.end())
					sprintf(curins,"push %s",paramtbl[nParam]);
				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);//受不了VC的聪明
			_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);
}


四.已知不足:
   1.对@,*的处理仍然不足.
   2.对跳转到后续标号的语句,可采用2次扫描技术来自动定位.但涉及到远近跳转字节数不一样的问题,打算先用NOP填充.
   3.原HIEW汇编输入窗口缓冲太小.
   本人没太多时间,以上BUG是在应用它改一个软件时发现的,现软件基本已经改完,也就基本不再继续改了(没时间).希望老大们再改:D

[培训]科锐软件逆向50期预科班报名即将截止,速来!!! 50期正式班报名火爆招生中!!!

收藏
免费 7
打赏
分享
最新回复 (16)
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 26 2004-11-28 09:42
2
0
雪    币: 489
活跃值: (107)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
NoneName 1 2004-11-28 09:49
3
0
为什么我发的1楼的贴子没有"编辑"这个选项啊
:D bLocked系统自己定义成int型啦:D老大们自己再改的时候注意把它改为bool型,虽然这样也不出错:D
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
qiweixue 19 2004-11-28 10:16
4
0
支持!
这里应该是地了吧!
雪    币: 38374
活跃值: (19370)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2004-11-28 10:18
5
0
最初由 NoneName 发布
为什么我发的1楼的贴子没有"编辑"这个选项啊
:D bLocked系统自己定义成int型啦:D老大们自己再改的时候注意把它改为bool型,虽然这样也不出错:D


有的,将浏览器水平滚动条往右拉到头。
雪    币: 239
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dssz 2004-11-28 11:26
6
0
在ME和98操作系统下测试,还是不能执行F12的功能,请各位大哥看看是什么原因吗?

请大哥对于新的功能,最好给出一些例子说明,大家测试和修改也方便!!

还有很奇怪,我使用VC6.0编译NoneName大哥修改的代码,结果编译出来的DLL怎么和NoneName大哥的不一样的,我的才80K,NoneName大哥附件中的DLL有92K,请教是什么原因吗?

我把我编译的DLL放上来给大家看看。
附件:myHiew.rar
雪    币: 212
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cgdxxx 2004-11-28 17:08
7
0
老大,建议你直接写一个hiew好了,这样有源代码,也方便后续的开发丫。
雪    币: 175
活跃值: (211)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
DonQuixote 8 2004-11-28 20:55
8
0
非常非常感谢NoneName兄弟再次修改myHiew,我更新了原帖

跳转到后续标号那个问题太麻烦了,当然用NOP把SHORT JMP补成LONG JMP也是个办法
我的打算是干脆加个F9,跳出个对话框窗口来,里面加个EDIT,直接在EDIT里复制汇编代码
然后就可以先分析一边代码,再处理跳转,而且摆脱了HIEW单行汇编的限制做很多扩展都会比较方便
不过这个就还需要再分析HIEW,要知道单行汇编那个窗口怎么调用的才行
(reversing)

另外我编译的DLL怎么也是80K的?
雪    币: 239
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dssz 2004-11-28 23:40
9
0
最初由 DonQuixote 发布
非常非常感谢NoneName兄弟再次修改myHiew,我更新了原帖

跳转到后续标号那个问题太麻烦了,当然用NOP把SHORT JMP补成LONG JMP也是个办法
我的打算是干脆加个F9,跳出个对话框窗口来,里面加个EDIT,直接在EDIT里复制汇编代码
然后就可以先分析一边代码,再处理跳转,而且摆脱了HIEW单行汇编的限制做很多扩展都会比较方便
........


如大哥有空对源码多写点注释,对其他修改源码的兄弟一定有很大帮助的,呵呵!!

hview有您的修改,一定会更精彩!!!!!
雪    币: 489
活跃值: (107)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
NoneName 1 2004-11-30 16:27
10
0
最初由 DonQuixote 发布
另外我编译的DLL怎么也是80K的?


我用的是Win2000ProSP4+VC6.0SP6.
雪    币: 239
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dssz 2004-11-30 21:50
11
0
11月30日修改过的代码后,在WIN9X下F12功能已经成功实现了,但还存在一点问题,请大哥有空再修正一下!

从剪贴版复制如下代码
       xor eax,eax
       pop ebp
       ret 10
       deflb DlgProc
       push ebp
       mov ebp,esp
       mov eax,[ebp+0C]

随便打开一个EXE文件,按F3--->F2---->F12,程序不能正常执行,只能执行一半代码
       xor eax,eax
       pop ebp
       ret 10----------------一直到这里都正常
       deflb DlgProc---------这里定义标签的时候,被一个红色提示框打断了,不能正常执行下去
       push ebp
       mov ebp,esp
       mov eax,[ebp+0C]
雪    币: 489
活跃值: (107)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
NoneName 1 2004-11-30 21:52
12
0
已经修正过了,是VC优化的问题.我用内嵌汇编改了
雪    币: 239
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dssz 2004-11-30 21:56
13
0
最初由 NoneName 发布
已经修正过了,是VC优化的问题.我用内嵌汇编改了


是的,的确修复了,再次感谢!!!
雪    币: 239
活跃值: (110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dssz 2004-11-30 22:04
14
0
还发现一点F12功能中新问题:

       ret 10
       deflb command
       mov eax,[ebp+10]----这行被翻译成mov eax,[ebp=10]
大哥有空再看看
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ksgkgs 2004-12-2 21:05
15
0
很久没有到这么好的PEDIY文章了,感谢!!!
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ksgkgs 2004-12-3 20:08
16
0
好文,多看有益
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ksgkgs 2004-12-5 19:30
17
0
希望NoneName老大能修复F12功能中的BUG,谢谢!!!
游客
登录 | 注册 方可回帖
返回