显示标签为“ODbgScript”的博文。显示所有博文
显示标签为“ODbgScript”的博文。显示所有博文

2011年9月6日星期二

ODbgScript源碼學習(十八)


int setProgLineResult(int line, DWORD result)  //
{
char buf[17];
sprintf(buf, "%X", result); //打印
string str(buf);
return setProgLineResult(line, str); //使用字符串設置行
}

int setProgLineResultFloat(int line, long double result) {
char buf[128];
sprintf(buf, "%lf", result);
string str(buf);
while (true) 
{
if (str.length() <= 3) break;  //如果長度小於等於3,中斷
if (str[str.length()-1] == '0') //如果最後一個字符為0
str.erase(str.length()-1,1); //清除
else 
break; //中斷
}
return setProgLineResult(line, str); //設置行
}

int setProgLineResult(int line, string& result) //設置行返回值
{

if (line>ollylang->script.size()) return 0; //參數大於腳本大小,返回0
char values[PROG_VAL_LEN]; 
t_wndprog_data *ppl;
ppl = (t_wndprog_data *) Getsortedbyselection(&(ollylang->wndProg.data),line); //獲取分類數據
if (ppl->type & PROG_TYPE_LABEL) //類型為標籤,返回失敗
return false;

strncpy(ppl->result,CleanString(result).c_str(),PROG_RES_LEN);
if (strcmp(ppl->values,"")) 
{
if (ppl->values[0] != ',') 
{
strcpy(values,ppl->values);
strncpy(&ppl->values[1],values,PROG_VAL_LEN-2);
ppl->values[0]=',';
}
}

return true;
}

void clearProgLines()
{
ollylang->pgr_scriptpos=0;
if (!ollylang->tProgLines.empty()) //如果行不為空
{
Deletesorteddatarange(&(ollylang->wndProg.data),0,0xffffffff); //傷處分類數據域
ollylang->tProgLines.clear(); //清除行
InvalidateProgWindow();
}
}

void resetProgLines()
{
vector<t_wndprog_data>::iterator iter=ollylang->tProgLines.begin(); //使用容器vector 定義一個開始
int line=0;
t_wndprog_data *ppl;

while (iter!=ollylang->tProgLines.end()) //黨不等於結束時
{
ppl = (t_wndprog_data *) Getsortedbyselection(&(ollylang->wndProg.data),line); //獲取分類數據
//reset executed color
if ((ppl->type & PROG_TYPE_COMMAND)) //忽略標籤和註釋ignore labels/comments
ppl->type &= PROG_TYPE_COMMAND;
strcpy(ppl->result,"");
strcpy(ppl->values,"");
//ppl->jumpto = 0;
ppl->eip = 0;

line++;
iter++;
}
InvalidateProgWindow();
}


int getProgLineType(int line)  //獲取行類型
{
t_wndprog_data *ppl;
ppl = (t_wndprog_data *) Getsortedbyselection(&(ollylang->wndProg.data),line);
if (ppl==NULL)
return false; 

return (ppl->type & PROG_TYPE);

}

int setProgLineAttr(int line,int type) 
{
t_wndprog_data *ppl;
ppl = (t_wndprog_data *) Getsortedbyselection(&(ollylang->wndProg.data),line);
if (ppl==NULL)
return false;

ppl->type &= PROG_TYPE;
ppl->type |= type;

return true;
}

int isProgLineComment(int line) 
{

t_wndprog_data *ppl;
ppl = (t_wndprog_data *) Getsortedbyselection(&(ollylang->wndProg.data),line);
if (ppl==NULL)
return false;

if (ppl->type & PROG_TYPE_COMMENT) 
{
return true;
}

return false;

}

int isProgLineBP(int line) 
{

t_wndprog_data *ppl;
ppl = (t_wndprog_data *) Getsortedbyselection(&(ollylang->wndProg.data),line);
if (ppl==NULL)
return false;
if (ppl->pause && ollylang->wndProg.hw) 
{
focusonstop=4;
}

return ppl->pause;

}

2011年9月5日星期一

ODbgScript源碼學習(十七)


//Change type to 2 to hilite executed commands
int setProgLineEIP(int line, int eip)  //設置行EIP
{

if (line>ollylang->script.size()) return false; //如果參數line大於腳本大小返回假

t_wndprog_data *ppl;

ppl = (t_wndprog_data *) Getsortedbyselection(&(ollylang->wndProg.data),line); //獲取分類數據

if (!(ppl->type & PROG_TYPE_ASM)) //如果類型為彙編
ppl->type |= PROG_ATTR_EXECUTED; //執行

//if (!(ppl->type & PROG_TYPE_COMMAND) //命令
// return true; //返回真

    ppl->eip = eip; //eip指向參數eip
if (ollylang->wndProg.hw!=NULL)
{
if (!ollylang->require_ollyloop) { //如果不是循環
Selectandscroll(&ollylang->wndProg,ollylang->pgr_scriptpos,2); //選擇scroll
InvalidateProgWindow();
}
}

return true;
}

int setProgLineValue(int line, DWORD value)   //設置行值
{
char buf[17];
sprintf(buf, "%X", value); //打印值
string str(buf);
return setProgLineValue(line, str); //重載setProgLineValue
}

int setProgLineValue(int line, string  &value) 
{

if (line>ollylang->script.size()) return 0;  //參數line大於腳本大小返回0

t_wndprog_data *ppl;
ppl = (t_wndprog_data *) Getsortedbyselection(&(ollylang->wndProg.data),line);

if (!(ppl->type & PROG_TYPE_COMMAND))
return 1;

string values;

values = CleanString(value); //清除字符串

//變量歷史Variable History

if (ollylang->showVarHistory && strcmp(ppl->values,"")) { //顯示歷史
if ( values.length() < PROG_VAL_LEN-2) {
if (ppl->values[0] != ',' && ppl->values[0] != '?' && value.compare("?") != 0)
values += " ";
values.append(ppl->values);
}
}

strncpy(ppl->values,values.c_str(),PROG_VAL_LEN-1); //拷貝串

ppl->values[PROG_VAL_LEN-1] = 0;

InvalidateProgWindow();

return 1;
}

int setProgLineValueFloat(int line, long double value)  //設置行值
{
char buf[128];
sprintf(buf, "%lf", value); //打印
string str(buf); //定義字符串
while (true) //如果為真
{
if (str.length() <= 3) break;  //如果長度小於3,中斷
if (str[str.length()-1] == '0') //字符串最後一位為0
str.erase(str.length()-1,1); //刪除最後一個字符
else 
break;
}
return setProgLineValue(line, str); //設置行值
}

int setProgLineResult(int line, var& result) //設置行返回值
{
if (result.vt == DW) //如果參數var類型的vt為雙字節
setProgLineResult(line,result.dw); //調用DWORD類型的setProgLineResult
else if (result.vt == FLT)
setProgLineResultFloat(line,result.flt);
else {
if(result.str.length() && !result.isbuf)
setProgLineResult(line,"\""+result.str+"\"");
else {
setProgLineResult(line,result.str);
}
}
InvalidateProgWindow();
return true;
}