首页
社区
课程
招聘
[旧帖] OD插件开发 0.00雪花
发表于: 2011-10-25 00:25 7988

[旧帖] OD插件开发 0.00雪花

2011-10-25 00:25
7988
自己写一个插件,需要让OD一步一步的走,类似F7的效果,我查了下手册,步进的函数有个地址,我只需要让程序执行一步,或者怎么得知下个指令的地址呢

//手册说明
Go
继续执行调试程序,如果不能继续执行,返回 -1。不适当地使用这一功能可能会给 OllyDbg 带来不稳定或一些未知的状态。对于简单的任务,可以考虑使用 Sendshortcut.

int Go(ulong threadid,ulong tilladdr,int stepmode,int givechance,int backupregs);
参数:

threadid ?要继续的线程id 。如果threadid为 0,函数假定线程为最后调试事件发生时线程;

tilladdr - 如果 stepmode 是 STEP_SKIP,函数请求跳过所有指令立即执行到 tilladdr。要调用的子程序必须保证 tilladdr 的指令是该子程序一连串指令的首指令,且其内部指令连续的分布于期间,没有跳转/返回到其外。否则,将设置临时断点于其上;

tilladdr - 这样进程将暂停在该点(就像反汇编器中的“运行到所选”);

stepmode - 步进模式,执行下列步骤之一:与前面调用Go 具有相同动作:

STEP_SAME        与前面调用 Go 具有动作相同
STEP_RUN        运行程序
STEP_OVER        步过 (立即执行子程序调用)
STEP_IN        步入(进入子程序)
STEP_SKIP        连续跳过直到指定地址
givechance - 如果调试进程因异常暂停,且本参数不为 0,将传递到由应用程序设置的异常处理程序中;
backupregs -如果不是0 ,更新旧的线程寄存器(t_thread 结构的 oldreg 成元)。或备份到已修改值高亮的寄存器中。

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 549
活跃值: (42)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
请问,你想做什么事情?你把事情讲清楚具体一些,我也帮忙想想办法好吗?
2011-10-25 08:16
0
雪    币: 13
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
就是写一个插件,让OD单步走,就和F7效果一样,我需要获取CPU寄存器的值,所以需要让OD不停的以单步运行,但是我看手册上面的函数,里面有个运行到某地址的地址,类似F4的效果吧,我不知道下个指令的地址是哪里,也不知道怎么计算,总是,就是让插件做到按F7一样的效果
2011-10-25 12:31
0
雪    币: 166
活跃值: (392)
能力值: ( LV13,RANK:357 )
在线值:
发帖
回帖
粉丝
4
把od插件发一下,同研究
2011-10-25 14:58
0
雪    币: 13
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
虽然这几天自己勉强解决了问题,但是插件的效率自己实在不敢恭维,其实我需要的就是监视FPU,当出现指定的浮点数的时候中断,所以需要让OD不停单步运行,我的做法是调用Sendshortcut,使用快捷键来完成,但是速度极慢,我记得OD的内存断点也是每执行一步就会进行判断的,但是速度起码比我用快捷键的方式快很多,还有一个原因,内存断点他只会在后台不断的判断,但是我这种方法每运行一步都会显示到界面上去,拖慢速度,所以我希望能像内存断点那样,不知道那是怎么实现的.希望高手指点下!

// OD_FPU.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "Plugin.h"
#include "stdio.h"
#include "math.h"
#include <memory.h>
#include <string.h>

char g_szPluginName[] = "OD_FPU";
HANDLE        hinst;                // DLL instance
HWND             hwmain;               // Handle of main OllyDbg window
bool   test=false;
static unsigned char FstEnvSave[32];
static char Fst_0_str[200];
double fst_0;
long int top;

double RelativeError=0.01;
double DesDouble=0.0;
bool        Debug=false;
bool    find=false;

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                         )
{
        hinst=hModule;
    return TRUE;
}

extc int _export cdecl ODBG_Plugindata(char shortname[32])
{
    strcpy(shortname, g_szPluginName);        //插件名
        return PLUGIN_VERSION;                                //版本
}

//插件初始化函数
extc int _export ODBG_Plugininit(int ollydbgversion,HWND hw,ulong *features)
{
        hwmain=hw;
        return 0;
}

extc int _export cdecl ODBG_Pluginmenu(int origin, char data[4096], void *item)
{
        if (origin == PM_MAIN)
        {
                strcpy(data, "0 误差, | 1 关于");
                return 1;
        }
        else if (origin == PM_CPUREGS )
        {
                if (Debug==FALSE)
                {
                        strcpy(data, "0 FPU断点");
                }
                else
                {
                        strcpy(data, "0 FPU_PLUGIN 停止");
                }
               
                return 1;
        }
        return 0;
}
extc void _export cdecl ODBG_Pluginaction(int origin, int action, void *item)
{
        if (PM_MAIN == origin && 0 == action )
        {
                _Getfloat("误差范围",(void *) &RelativeError,8,0,0);
        }
        else if (origin == PM_MAIN && action == 1)
        {
                MessageBox(0,"\tOD_FPU_PLUGIN ver1.0\t\t\n\t\tby no comment\n","OD_FPU_PLUGIN",MB_OK);
                return ;
        }
        else if (origin == PM_CPUREGS && action ==0 )
        {
                if (Debug==FALSE)
                {
                        _Getfloat("设定浮点数",(void *) &DesDouble,8,0,0);
                        Debug=TRUE;
                        _Sendshortcut(PM_MAIN,0,WM_KEYDOWN,0,0,VK_F7);
                }
                else
                {
                        Debug=FALSE;
                }
               
        }
        return ;

}

int ODBG_Paused(int reason, t_reg *reg)
{
        switch(reason)
        {
        case PP_EVENT:        //暂停于调试事件
               
                {
                        if        (!Debug)   //未开启调试功能
                        {
                                return        1;
                        }

                        t_thread *pthread;
                        ulong pid;
                        find =false;

                        pid=_Plugingetvalue(VAL_MAINTHREADID);
               
                        pthread=_Findthread(pid);
                        if (pthread!=NULL)
                        {
                                __asm FSTENV [FstEnvSave]

                                unsigned char *pStart,*pEnd;
                                pStart=        (unsigned char *) &pthread->context.FloatSave.RegisterArea[0];
                                pEnd =        (unsigned char *) &pthread->context.FloatSave.RegisterArea[80];
                       
                                for (;pStart<pEnd;pStart+=10)
                                {
                                        __asm
                                        {
                                                push eax
                                                mov eax,[pStart]
                                                fld tbyte ptr [eax]
                                                fstp qword ptr [fst_0]
                                                pop eax
                                        }
                                       
                                        _Printfloat8(Fst_0_str,fst_0);
                                        fst_0=atof(Fst_0_str);
                                       
                                        if (fabs(fst_0 - DesDouble)<RelativeError)
                                        {
                                                find=true;
                                        }
                                }
                                __asm FLDENV [FstEnvSave];
                        }
                       
                        if (find)
                        {
                                _Sendshortcut(PM_DISASM        ,0,WM_KEYDOWN,0,0,VK_F2);
                                //MessageBox(0,"FInd","t",MB_OK);
                                Debug=FALSE;
                        }
                        else
                        {
                                _Sendshortcut(PM_MAIN,0,WM_KEYDOWN,0,0,VK_F7);
                        }                       
                }

                break;
        case PP_PAUSE:        //暂停于用户请求
//                MessageBox(0,"break","o",MB_OK);
                break;
        case PP_TERMINATED:        //应用程序终止
                //MessageBox(0,"3","o",MB_OK);
                break;
        }
       
        return 1;
}
2011-10-26 09:09
0
游客
登录 | 注册 方可回帖
返回
//