close

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);

}

 

arrow
arrow

    lypwell 發表在 痞客邦 留言(1) 人氣()