一. 修改的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期正式班报名火爆招生中!!!