📄 myhiew.cpp
字号:
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 + -