2011年9月3日星期六

ODbgScript源碼學習(十三)

Progress.cpp:
LRESULT CALLBACK wndprog_winproc(HWND hw,UINT msg,WPARAM wp,LPARAM lp) {
int i,m,shiftkey,controlkey; //定義整型變量
HMENU menu,mLoad,mCmd,mRun,mLabels=NULL,mVars=NULL; //定義多項菜單句柄
t_wndprog_data *ppl; //定義一個程序數據結構變量

switch (msg)
{
case WM_LBUTTONDBLCLK: //如果是鼠標左鍵雙擊事件
i=ollylang->wndProg.data.selected; //使用ollylang類中的定義的t_table變量wndProg的t_sorted結構中data的入口索引
//ppl=(t_wndprog_data *)Getsortedbyselection(&ollylang->wndProg.data,ollylang->wndProg.data.selected);
if (i > 0) //如果i大於0
{
i=ollylang->GetFirstCodeLine(i-1)+1; //獲取i的第一代碼行
ollylang->jumpToLine(i); //跳轉到行
InvalidateRect(hw, NULL, FALSE); //重畫
}
break;

case WM_DESTROY:
case WM_MOUSEMOVE:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_RBUTTONDOWN:
case WM_RBUTTONDBLCLK:
case WM_HSCROLL:
case WM_VSCROLL:
case WM_TIMER:
case WM_SYSKEYDOWN: //如果是系统按键消息
Tablefunction(&ollylang->wndProg,hw,msg,wp,lp); //傳遞腳本窗口消息
break;                           // 傳遞消息到DefMDIChildProc() Pass message to DefMDIChildProc()
// 自定義消息Custom messages responsible for scrolling and selection. User-drawn
// windows must process them, standard OllyDbg windows without extra
// functionality pass them to Tablefunction()
case WM_USER_SCR:
case WM_USER_VABS:
case WM_USER_VREL:
case WM_USER_VBYTE:
case WM_USER_STS:
case WM_USER_CNTS:
case WM_USER_CHGS:
case WM_WINDOWPOSCHANGED: //接收SetWindowPos
return Tablefunction(&ollylang->wndProg,hw,msg,wp,lp); //傳遞消息
case WM_USER_MENU:
menu=CreatePopupMenu(); //建立頂部菜單

mRun=CreatePopupMenu(); //建立頂部菜單
AppendMenu(menu,MF_POPUP,(DWORD) mRun,"运行脚本");  //添加一項菜單
AppendMenu(mRun,MF_MENUBREAK,20,"打开...");
AppendMenu(mRun,MF_SEPARATOR,0,"-");
mruGetCurrentMenu(mRun,20);

mLoad=CreatePopupMenu();
AppendMenu(menu,MF_POPUP,(DWORD) mLoad,"载入脚本");
AppendMenu(mLoad,MF_MENUBREAK,10,"打开...");
AppendMenu(mLoad,MF_SEPARATOR,0,"-");
mruGetCurrentMenu(mLoad,10);

//mCmd=CreatePopupMenu();
//AppendMenu(mCmd,MF_SEPARATOR,0,"-");
//mruCmdMenu(mCmd,50);

ppl=(t_wndprog_data *)Getsortedbyselection(&ollylang->wndProg.data,ollylang->wndProg.data.selected); //ppl為由選擇獲取分類數據
if (menu!=NULL && ppl!=NULL)  //如果菜單句柄不為空,而且獲取到數據
{
AppendMenu(menu,MF_STRING, 30,"编辑脚本...");
AppendMenu(menu,MF_SEPARATOR,0,"-");
AppendMenu(menu,MF_DEFAULT,31,"&跟踪\tEnter");
AppendMenu(menu,MF_STRING, 32,"脚本断点切换\tF2");
AppendMenu(menu,MF_STRING, 36,"在光标处下断点并执行\tF4");
AppendMenu(menu,MF_STRING, 33,"单步\tTAB");

if (script_state==SS_PAUSED)
AppendMenu(menu,MF_STRING, 34,"继续\tSPC");
else
AppendMenu(menu,MF_STRING, 34,"暂停\tSPC");

AppendMenu(menu,MF_STRING, 35,"放弃\tESC");

AppendMenu(menu,MF_DEFAULT,37,"&编辑行\tE");
}
if (ollylang->labels.size() > 0)  //如果有標籤
{
mLabels=CreatePopupMenu(); //建立頂部菜單
AppendMenu(menu,MF_SEPARATOR,0,"-");
AppendMenu(menu,MF_POPUP,(DWORD) mLabels,"Scroll to Label");
ollylang->menuListLabels(mLabels,0x100); //菜單列表標籤函數
}

if (ollylang->variables.size() > 0)  //如果是變量
{
mVars=CreatePopupMenu();
AppendMenu(menu,MF_SEPARATOR,0,"-");
AppendMenu(menu,MF_POPUP,(DWORD) mVars,"编辑变量");  //天際變量菜單
ollylang->menuListVariables(mVars,40); //菜單列表變量函數
}
if (Getstatus() == STAT_STOPPED)  //獲取狀態是停止的話,添加手工執行腳本命令菜單
{
AppendMenu(menu,MF_SEPARATOR,0,"-");
AppendMenu(menu,MF_STRING, 39,"手工执行脚本命令...\tX");
}

// Even when menu is NULL, call to Tablefunction is still meaningful.
i=Tablefunction(&ollylang->wndProg,hw,WM_USER_MENU,0,(LPARAM)menu); //自定義消息

if (menu!=NULL) DestroyMenu(menu); //釋放菜單
if (mLoad!=NULL) DestroyMenu(mLoad); //釋放菜單
//if (mCmd!=NULL) DestroyMenu(mCmd); //釋放菜單
if (mRun!=NULL) DestroyMenu(mRun); //釋放菜單
if (mLabels!=NULL) DestroyMenu(mLabels); //釋放菜單
if (mVars!=NULL) DestroyMenu(mVars); //釋放菜單

if (i>10 && i<=15 || i>20 && i<=25)  //如果i為10~15或者20~25之間
{

char key[5]="MRU "; //mru
key[3]=(i%10)+0x30;

ZeroMemory(&buff, sizeof(buff));
Pluginreadstringfromini(hinstModule(),key,buff,0); //讀ini中的mru

// Load script
ollylang->LoadScript(buff); //加載腳本

mruAddFile(buff); //添加文件

// Save script directory
char* buf2;
GetFullPathName(buff,sizeof(buff),buff,&buf2);  //獲取路徑
*buf2=0;
Pluginwritestringtoini(hinstModule(), "ScriptDir", buff); //寫入腳本路徑

// Pause script (From Load Script MRU)暫停腳本
if (i<20)  //如果i小於20
{
ollylang->Pause(); //暫停腳本
}
return 1; //返回1
}
else if (i>=40 && i<0x100)  //如果i在40~0x100
{
if (ollylang->editVariable(i-40)) //編輯變量
InvalidateRect(hw, NULL, FALSE); //重畫
return 1;
}
else if (i>=0x100 && i<0x200)  //如果i為0x100~0x200
{
Selectandscroll(&ollylang->wndProg,i-0xFE,2); //選擇卷軸
InvalidateRect(hw, NULL, FALSE); //重畫
return 1;
}
else //其他

switch (i)  //除此之外消息循環
{
case 20: // 打開運行Open Run
ODBG_Pluginaction(PM_MAIN,0,NULL);
return 1;
case 10: // 加載Open Load
ODBG_Pluginaction(PM_MAIN,0,NULL);
ollylang->Pause();
return 1;
case 30: // 編輯腳本Edit Script
ShellExecute(hwndOllyDbg(),"open",ollylang->scriptpath.c_str(),NULL,ollylang->currentdir.c_str(),SW_SHOWDEFAULT);
return 1;
case 31: // 反彙編跟隨Follow in Disassembler
if (ppl!=NULL) Setcpu(0,ppl->eip,0,0,CPU_ASMHIST|CPU_ASMCENTER|CPU_ASMFOCUS);
InvalidateRect(hw, NULL, FALSE);
return 1;
case 32: // 切換腳本斷點Toggle Script BP
if (ppl!=NULL) if (ppl->pause) ppl->pause=0; else ppl->pause=1;
InvalidateRect(hw, NULL, FALSE);
return 1;
case 36:
                    if (ppl!=NULL) ppl->pause=1;
                    ollylang->Resume(); //重新獲取
   return 1;
case 37:
if (ppl!=NULL) editProgLine(ppl); //編輯行
   return 1;
case 33: // 單步Step
ollylang->Pause(); //for right click step when running
ollylang->Step(1);
script_state = ollylang->script_state;
focusonstop=5;
return 1;
case 34: // 暫停/重設Pause/Resume
if (script_state==SS_PAUSED)
{
ollylang->Resume();
}
else
{
ollylang->Pause();
script_state = ollylang->script_state;
}
return 1;
case 35: // 終止Abort
ollylang->Reset();
ollylang->Pause();
return 1;
case 39: // 執行命令Execute Command
if (Getstatus() == STAT_STOPPED)
{
ollylang->execCommand(); //執行命令
InvalidateRect(hw, NULL, FALSE);
}
return 1;
case 51: //esp運行
if (Getstatus() == STAT_STOPPED)
{
ESPRun();
}
return 1;
default:;
}
return 0;

case WM_USER_DBLCLK: //用戶
ppl=(t_wndprog_data *)Getsortedbyselection(&(ollylang->wndProg.data),ollylang->wndProg.data.selected);
if (ppl!=NULL)
{
if (ppl->eip) Setcpu(0,ppl->eip,0,0,CPU_ASMHIST|CPU_ASMCENTER|CPU_ASMFOCUS);
InvalidateRect(hw, NULL, FALSE);
return 1;
}

case WM_KEYDOWN: //按鍵
shiftkey=GetKeyState(VK_SHIFT) & 0x8000; //獲取按鍵
controlkey=GetKeyState(VK_CONTROL) & 0x8000; //控制鍵
if (wp==VK_RETURN && shiftkey==0 && controlkey==0)
{ //如果為VK_RETURN
// 在反彙編返回Return key follows in Disassembler.
ppl=(t_wndprog_data *)Getsortedbyselection(&(ollylang->wndProg.data),ollylang->wndProg.data.selected);
if (ppl!=NULL)  //如果ppl不為空
{
if (ppl->eip) Setcpu(0,ppl->eip,0,0,CPU_ASMHIST|CPU_ASMCENTER|CPU_ASMFOCUS); //ppl指向eip,設置cpu
InvalidateRect(hw, NULL, FALSE);
}
}
else if (wp==VK_F2)  //F2
{ // && shiftkey==0 && controlkey==0) {
// Toggle Script BP
ppl=(t_wndprog_data *)Getsortedbyselection(&(ollylang->wndProg.data),ollylang->wndProg.data.selected);
if (ppl!=NULL)
{
if (ppl->pause) ppl->pause=0; else ppl->pause=1;
InvalidateRect(hw, NULL, FALSE);
}
}
else if (wp==VK_F4)  //F4
{
// go Script BP
ppl=(t_wndprog_data *)Getsortedbyselection(&(ollylang->wndProg.data),ollylang->wndProg.data.selected);
if (ppl!=NULL)
{
if (ppl->pause) ppl->pause=0; else ppl->pause=1;
InvalidateRect(hw, NULL, FALSE);
                   ollylang->Resume();
}
            }
else if (wp==VK_TAB || wp=='S')
{

// Step
ollylang->Pause();
ollylang->Step(1);
script_state = ollylang->script_state;
focusonstop=4;
return 1;

}
else if (wp=='X')
{

// Command
if (Getstatus() == STAT_STOPPED)
{
ollylang->execCommand();
InvalidateRect(hw, NULL, FALSE);
}
return 1;

}
else if (wp=='E')
{
ppl=(t_wndprog_data *)Getsortedbyselection(&(ollylang->wndProg.data),ollylang->wndProg.data.selected);
if (ppl!=NULL)
editProgLine(ppl);
return 1;

}
else if (wp==' ')
{ // Pause/Resume

if (script_state==SS_PAUSED)
{
ollylang->Resume();
}
else
{
ollylang->Pause();
script_state = ollylang->script_state;
}
return 1;
}
else if (wp==VK_ESCAPE)
{
// Resume
ollylang->Reset();
ollylang->Pause();
return 1;
}
Tablefunction(&ollylang->wndProg,hw,msg,wp,lp);
break;
        case WM_USER_CHALL:
        case WM_USER_CHMEM:
            InvalidateRect(hw, NULL, FALSE);
            return 0;
        case WM_PAINT:
ollylang->pgr_scriptpos_paint=ollylang->pgr_scriptpos;
Painttable(hw, &ollylang->wndProg, wndprog_get_text);
return 0;
default:
break;
}
return DefMDIChildProc(hw,msg,wp,lp);
}


没有评论:

发表评论