逍遥绝尘 发表于 2015-2-24 11:03

能不能整理好再发啊!!!!{:5_185:}

月光下の魔术师 发表于 2015-2-24 11:08

本帖最后由 月光下の魔术师 于 2015-2-25 14:55 编辑

第二步,解压文件,打开VS2012{:6_207:}这个不用我教了吧
第三步,新建一个dll工程。
Q:如何创建dll工程?
A:请按照下面的图示进行操作。
1.点击新建工程
2.选择下一步来更改设置
3.将原本选中的 控制台应用程序 改为 DLL 并勾选 空项目 选项。
注:以上为创建dll通用方法,创建其它dll也可以这么玩哦。

第四步,将之前下载的.h作为头文件,.cpp作为源文件,.lib作为资源文件添加进去。

Q:如何在创建好的工程内添加现有文件?
A:请按照下面的提示进行操作,提示方法为头文件添加方法,其它文件同理。
单击 头文件 ——右键——添加——现有项——找到Plugin.h——添加

第五步,打开源.cpp文件

第六步,注释是我对这四个基本函数的描述。看完了你可以选择删也可以不删,反正编译的时候不会弄进去不会影响程序。不推荐删除,以后忘记了还可以回来查看一下。
第七步,将ODBG_Plugindata函数中“测试插件—插件名”更改为你自己的插件名。

Q:什么是插件名?
A:用SOD举例啥叫插件名https://www.52hb.com/data/attachment/forum/201502/24/104749zbzgbt4gegzw8jst.png,看清楚我箭头指的地方,没错是箭头不是鼠标,截图的时候失误了……懂插件名是啥了吧?不懂劳驾楼下回复,不回复我也不强迫你,到时候别喷我说我讲的乱七八糟人家都看不懂就行。

第八步,将ODBG_Pluginmenu函数里面的"0 一级子菜单1"(标题栏插件菜单)与"0 插件名{1 一级子菜单1}"(右键菜单插件菜单)更改为你自己的插件菜单

Q:那道“|”是干什么用的?
A:https://www.52hb.com/data/attachment/forum/201502/24/105159w0u69nxr8h0x2u23.png看到我剪头指的那道横线了吗?啥,你没看到?不好意思,麻烦你先关掉电脑,换个显示屏配副眼镜再来继续,哦卧槽给你一包辣条别动手。那个|的作用如图所示,就是那道线,可以代替逗号,当然我觉着如果不是闲着无聊的话没必要一溜|下去……

Q: if(origin == PM_MAIN) 与 if(origin == PM_DISASM) 有何作用?
A: if(origin == PM_MAIN) 的意思是判断这个插件是不是被在标题栏调用, if(origin == PM_DISASM) 的意思是判断这个插件是不是被在右键菜单调用,标题栏调用和右键调用可以有不同的项目,如果你的插件两项菜单都一样可以删掉子菜单2,将
if(origin == PM_MAIN)
{
      strcpy(data, "0 一级子菜单1");
      return 1;
}
if(origin == PM_DISASM)
{
      strcpy(data, "0 插件名{1 一级子菜单1}");
      return 1;
}
改为
if(origin == PM_MAIN || origin == PM_DISASM)
{
      strcpy(data, "0 一级子菜单1");
      return 1;
}


Q:SOD的二级子菜单是怎么做出来的?https://www.52hb.com/data/attachment/forum/201502/24/105829vfl8ftlf9ulkfz09.png
A:很简单,只要再用{}就可以了,大括号内的所有子项都会成为括号前子项的二级子项。需要注意的是,这种写法也是符合规范并且可以正常使用的,因为一级子菜单1尽管ID为0,但因为它的作用是引出二级子菜单1,所以OD并不会为它分配响应事件,它的ID取多少都无所谓。

Q:你前面讲了这么多,菜单ID到底是什么?
A:菜单ID就是这个插件的某级菜单中某个子项独一无二的标示。就像进程拥有PID,窗口拥有窗口句柄一样,菜单只有拥有自己独一无二的ID,OD才能根据这个ID为菜单确定响应事件,这也是为什么同在一个菜单中ID不能重复的原因(同在一个菜单中指同在标题栏菜单或者同在右键菜单),重复了的话OD就没有办法准确地为它分配响应事件了。

第九步,更改ODBG_Pluginaction函数里的响应事件

Q:代码 if(action == 0) 有什么作用?
A:action代表了被触发的子项的ID,也就是菜单ID,请设置好对应ID的菜单的响应事件,设置方法是在 if(action == 0) 后, if(origin == PM_MAIN || origin == PM_DISASM) 内继续添加判断,当然,你也可以使用 switch,比if效率更高,Let you go。



月光下の魔术师 发表于 2015-2-24 11:39

本帖最后由 月光下の魔术师 于 2015-2-25 14:23 编辑

第二步,解压文件(就是个.e文件),打开,可以看到具体需要的子程序的作用我都写在备注里面了
第三步,展开_ODBG_Plugindata子程序,更改“插件名”为你自己的插件名。

Q:什么是插件名?
A:用SOD举例啥叫插件名https://www.52hb.com/data/attachment/forum/201502/24/104749zbzgbt4gegzw8jst.png,看清楚我箭头指的地方,没错是箭头不是鼠标,截图的时候失误了……懂插件名是啥了吧?不懂劳驾楼下回复,不回复我也不强迫你,到时候别喷我说我讲的乱七八糟人家都看不懂就行。

第四步,看_ODBG_Pluginmenu子程序,,更改标题栏菜单和右键菜单。

Q:那道“|”是干什么用的?
A:https://www.52hb.com/data/attachment/forum/201502/24/105159w0u69nxr8h0x2u23.png看到我剪头指的那道横线了吗?啥,你没看到?不好意思,麻烦你先关掉电脑,换个显示屏配副眼镜再来继续,哦卧槽给你一包辣条别动手。那个|的作用如图所示,就是那道线,可以代替逗号,当然我觉着如果不是闲着无聊的话没必要一溜|下去……

Q: 判断 (origin = #PM_MAIN) 与 判断 (origin = #PM_DISASM) 有何作用?
A: 判断 (origin = #PM_MAIN) 的意思是判断这个插件是不是被在标题栏调用, 判断 (origin = #PM_DISASM) 的意思是判断这个插件是不是被在右键菜单调用,标题栏调用和右键调用可以有不同的项目,如果你的插件两项菜单都一样可以删掉子菜单2,将
.判断开始 (origin = #PM_MAIN)
    API_RtlMoveMemory_拷贝 (data, API_lstrcpyn (标题栏菜单, 标题栏菜单, 0), 取文本长度 (标题栏菜单) + 1)
    返回 (1)
.判断 (origin = #PM_DISASM)
    API_RtlMoveMemory_拷贝 (data, API_lstrcpyn (右键菜单, 右键菜单, 0), 取文本长度 (右键菜单) + 1)
    返回 (1)
.默认
.判断结束

改为
.如果真 (origin = #PM_MAIN 或 origin = #PM_DISASM)

    API_RtlMoveMemory_拷贝 (data, API_lstrcpyn (标题栏菜单, 标题栏菜单, 0), 取文本长度 (标题栏菜单) + 1)
    返回 (1)

Q:SOD的二级子菜单是怎么做出来的?https://www.52hb.com/data/attachment/forum/201502/24/105829vfl8ftlf9ulkfz09.png
A:很简单,只要再用{}就可以了大括号内的所有子项都会成为括号前子项的二级子项。需要注意的是,这种写法也是可以通过的,且二级子菜单1可以正常响应事件,因为一级子菜单1尽管ID为0,但因为它的作用是引出二级子菜单1,所以OD并不会为它分配响应事件,ID取多少都无所谓。

Q:你前面讲了这么多,菜单ID到底是什么?
A:菜单ID就是这个插件的某级菜单中某个子项独一无二的标示。就像进程拥有PID,窗口拥有窗口句柄一样,菜单只有拥有自己独一无二的ID,OD才能根据这个ID为菜单确定响应事件,这也是为什么同在一个菜单中ID不能重复的原因(同在一个菜单中指同在标题栏菜单或者同在右键菜单),重复了的话OD就没有办法准确地为它分配响应事件了。
第五步,看_ODBG_Pluginaction子程序,修改响应事件

Q:代码 如果真 (action = 0) 有什么作用?
A:action代表了被触发的子项的ID,也就是菜单ID,请设置好对应ID的菜单的响应事件,设置方法是在 如果真 (action = 0) 下面(是比较ID的代码下面,不是判断是否是菜单栏调用和右键调用的如果真下面,这里需要注意)继续添加如果真,当然,你也可以连续使用 判断() 子程序,Let you go。



逍遥灬泪痕 发表于 2015-2-24 11:45

久伴。 发表于 2015-2-24 09:50
.判断开始 (灌水 + 骂人 + 和泪痕说话 + 和亚轩说话 = 真)
    HB减完 = 真
    永久封号 = 真


尼玛久伴又想死了?

yating 发表于 2015-2-24 11:53

逍遥灬泪痕 发表于 2015-2-24 11:45
尼玛久伴又想死了?

看不懂他写的什么意思!!

gmh5225 发表于 2015-2-24 11:59

笑了,一个静态lib说开源。。。

月光下の魔术师 发表于 2015-2-24 12:15

本帖最后由 月光下の魔术师 于 2015-2-25 15:05 编辑

gmh5225 发表于 2015-2-24 11:59
笑了,一个静态lib说开源。。。
LIB是OD自带的。

月光下の魔术师 发表于 2015-2-25 13:40

{:6_224:}刚刚想继续写这个帖子,找了半天没找到,最后回头一看原来就在之前一篇帖子的上面{:6_209:}

月光下の魔术师 发表于 2015-2-25 15:33

本帖最后由 月光下の魔术师 于 2015-2-25 16:13 编辑

下面我们就来尝试用易语言来写一个,也是你们(写过的一看就知道绝对是顶尖大牛,求别喷)自己的第一个OD插件:清除UDD、OD的文件打开记录以及还原OD配置。
{:6_197:}为啥是易语言呢,对我来说易语言和C++没啥区别,因为我学易语言把常用功能全都封装好了{:6_197:}但是对于没这么玩的C++将来说就有点麻烦,所以我用易语言了,C++党表打我{:6_209:}
有了之前的介绍和基础,我估计这个对大家来说没难度
第一步,将模板文件复制一份,更名为清理插件.e
第二步,插入——资源——图片或图片组,名字改一个你喜欢的,内容导入上一节教程我们设置好的干净的配置文件。
啥,你上节课没来没认真听讲?那就试试我这个吧,或者回去找上节课的教程去放心好了,里面只有一个ini
第三步,回到程序集,展开_ODBG_Plugindata,插件名改成你的插件的名字,我这里改成了“万能清理插件”
第四步,因为这个不涉及到现行选定内容对功能的影响,所以可以将右键菜单与菜单栏菜单合并,也就是
.如果真 (origin = #PM_MAIN 或 origin = #PM_DISASM)
    API_RtlMoveMemory_拷贝 (data, API_lstrcpyn (菜单, 菜单, 0), 取文本长度 (菜单) + 1)
    返回 (1)
第五步,正式编写响应代码,出于与第四步同样的理由,我们选择合并菜单的方式。
作为一个合格的程序猿,最不应该的就是直接看别人的思路对不对{:6_207:}
所以我就不提供源码的思路了,我先撸去,撸好了发上来给大家做参考,也希望大家共享自己的插件源码,这东西也不是独一无二对吧……共享也不会损失啥。




lyl537c 发表于 2015-2-28 16:57

插件重来没有写过,正好学习学习。
页: 1 [2] 3 4
查看完整版本: 【星空出品】教你制作自己的OD之二:打造自己的OD插件