首页
社区
课程
招聘
[原创]51大奉献:调试工具已经上线.
发表于: 2010-5-3 12:30 13904

[原创]51大奉献:调试工具已经上线.

2010-5-3 12:30
13904

51大奉献:调试工具已经上线.

几年来一直想搞个HOOK型分析调试工具,最近一个月发狠,终于搞得差不多了.

这次修改为第一次修正.(20100506),这次修正应为第一次完本.没什么遗憾了

主要修改有:

1.修改了线程隔离BUG,原来把调试线程隔离的代码有毛病.

2.增加进程内存写入函数,asm简易汇编函数
例子:支持已经调入的符号
var m_user_address=m_hook_code_user;//10K用户可编代码空间
var pasmwr=m_user_address;
pasmwr+=Win_Asm(pasmwr,"mov eax,0x99");
pasmwr+=Win_Asm(pasmwr,"call ★★Sleep☆☆");

3.在断点重刷或断点全清的按钮中,增加当前所有线程的context内容.以便于从头开始时,寻找入口
******************************************
无任何断点
线程    8064         Context:
Eax:        00000004        Edx:        0143FA60        Ecx:        00000004        Esi:        00000000        Edi:        0143FC60
Eip:        7C92EB94        Ebp:        0143FC88        Esp:        0143FC30        Ebx:        00515948
线程    9064         Context:
Eax:        001652B0        Edx:        00000017        Ecx:        0153FD64        Esi:        7FFFFFFF        Edi:        FFFFFFFF
Eip:        7C92EB94        Ebp:        0153F89C        Esp:        0153F860        Ebx:        00161C68
线程    9852         Context:
Eax:        00000000        Edx:        7C92EB94        Ecx:        01638424        Esi:        00000000        Edi:        01638454
Eip:        7C92EB94        Ebp:        0163847C        Esp:        01638424        Ebx:        00000144

****************************************

4.增加注释和断点在反汇编中的显示

在反汇编代码后面用;后加注释,然后点注释按钮就完成添加

本软件主要功能有:

1.属于HOOK式调试方式,以线程插入,通过网络接口来取得调试信息.程序本身有解断点自锁机制,所以,无论是做为调试分析,还是作为应用程序调入,本软件都是很有用处的

2.支持多线程类C二次描述语言编程(可以同时开16个线程来运行二次代码,时间片是ms级别),已经支持反汇编,在线调试,所以根本上拓展了调试功能
二次描述语言可以获取断点时的寄存器信息,并可修改寄存器内容

3.支持windows窗口的管理和一些界面操作.

本程序在编程时使用了看雪大能--红尘岁月--发的<<给ollydbg自动添加注释的插件>>
中的帮助头文件,另外使用了SoftSnoop2010中有关mfc动态连接库出口函数文本文件.

在此一并表示万分感谢,因为本软件定位为自用,所以使用者不可用于商业目的,

不可用于干非法勾当.

程序下载地址为:

86eK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3#2&6j5i4g2@1L8%4c8J5j5h3c8W2i4K6u0W2j5$3&6Q4x3V1k6V1L8%4N6F1i4K6u0r3M7X3#2@1k6r3g2T1N6h3N6Q4x3X3g2J5j5i4t1`.

mfc动态连接库出口函数文本文件下载地址为:(释放到autop子目录)
6abK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3#2&6j5i4g2@1L8%4c8J5j5h3c8W2i4K6u0W2j5$3&6Q4x3V1k6V1L8%4N6F1i4K6u0r3L8h3k6U0i4K6g2X3P5s2S2Q4x3X3g2J5j5i4t1`.


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (37)
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
论坛下载

两个文件都不大
上传的附件:
2010-5-3 12:43
0
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
介绍图片.

主要功能要靠自己摸索.我最近没时间作帮助文件.以后再说吧

敬请管理员把多发的图片贴删掉.
上传的附件:
2010-5-3 12:46
0
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
本软件的调试信息是多窗口并显,要通过按钮来完成切换.

有时需要点击按钮来完成对应功能

比如你要反汇编,你可以在上部窗口,点击任何8位长地址,

然后点击dasm按钮前面的U/P按钮,就能进行定位反汇编.

debug窗口有最高优先级,一有断点信息,就会自动切进
上传的附件:
2010-5-3 12:48
0
雪    币: 10683
活跃值: (467)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
下载了体验一下
2010-5-3 13:20
0
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
第一次使用,要点模块前的G按钮获得模块信息.
2010-5-3 13:35
0
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
假如安装目录为c:\jbpaint,那么安装包中的两个二次开发描述语言就会得到运行.

或者你把画面上的描述语言

var a=0;
Createsubobj="c:\jbpaint\autop\excode0000.jmp";
Createsubobj="c:\jbpaint\autop\excode0001.jmp";

的路径改为你安装的路径并上传,那么这两段线程就会得到运行

代码已经修改,路径自动修正
2010-5-3 13:39
0
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
点击函数按钮前面的G按钮,就会进行函数调用分析,用时可能会有几秒到几十秒(看程序大小).

第一次运行做完的函数分析,会得到保存,后面就不一定要做这项分析
2010-5-3 13:43
0
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
清除按钮下面的上下左右按钮是用于检查各级线程运行的二次描述语言.

上下按钮切换层次,左右按钮在本层切换.一个线程可以通过

Createsubobj="c:\jbpaint\autop\excode0000.jmp";

的Createsubobj创建子线程,最大可以有四个,目前系统限制为三层,也就可以运行16个子线程.

每个线程的描述代码在编辑后按上传,就会传送到调试模块中,并得到保存
2010-5-3 13:49
0
雪    币: 54
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
下载下来体验下~~
2010-5-3 13:50
0
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
var m_windows_info="";
m_windows_info=Win_TopInfo();
var m_mainhand_str=Win_GetMainHand1("恒生");
var m_mainhand=Win_GetMainHand("恒生");
var m_sub_wininfo=Win_SubWinInfo(m_mainhand);
wininfo=m_windows_info+m_mainhand_str+"
"+m_sub_wininfo;
//
var m_pmem_info=Win_ProcessMemInfo();
meminfo=m_pmem_info;
var m_smem_dir=Win_SearchProcessMemBYTEData(0x401000,0x600000,"34 62 37 32 33 37 35 39 CC 61 37 36");
var m_pmem_data=Win_ProcessMemData(m_smem_dir-(m_smem_dir%16),m_smem_dir+0x800);//本进程内存数据
fxinfo1="搜索到:"+m_smem_dir+appstr_enter();
fxinfo1=m_pmem_data;
var m_pmem_dasm=Win_ProcessMemDasm(0x1661000,0x1662000);//本进程dasm
fxinfo2=m_pmem_dasm;
while(TRUE)
{
Sleep(2);
}
var ee=0;
var ee1=0;
var ee2=0;
var ee3=0;
var ee4=0;
2010-5-3 13:52
0
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
上断代码是excode0001.jmp文件中的.其中

var m_pmem_info=Win_ProcessMemInfo();

就是获得模块信息
2010-5-3 13:54
0
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
支持的调试函数总汇

Win_TopInfo()  ;//获取目标进程主窗口信息
Win_GetMainHand(name0,...mame5)  ;//获取目标进程指定的主窗口句柄
Win_GetMainHand1(name0,...mame5)  ;//获取目标进程指定的主窗口句柄字串
Win_SubWinInfo(hwnd,level)  ;//获取指定窗口的子窗口信息
Win_PopWnd_Proc(m_process_id,hmainWnd)  ;//关闭提示类主窗口
Win_SearchXDWnd(hWnd,name)  ;//搜索tbutton类名子按钮
Win_SearchZTWnd(hWnd)  ;//搜索hwnd的父窗口中类名为tpanel的子窗口
Win_SearchWnd(hWnd,id,name text);//搜索hwnd的子窗口,name text为可选参数
Win_SearchWnd_MFCxGridBase(hWnd,level);//搜索hwnd的子窗口
Win_GetParent(hWnd)  ;//获取父窗口
Win_GetTopWindow(hWnd)  ;//获取第一个子窗口
Win_GetNextWindow(hWnd)  ;//获取hwnd下一窗口
Win_GetClassName(hWnd)  ;//获取窗口类名
Win_GetDlgCtrlID(hWnd)  ;//获取窗口ID
Win_GetText(hWnd)  ;//获取窗口文字
Win_GetDlgItem(hWnd,id)  ;//获取子窗口
Win_SearchWnd_Tree(hWnd,level);//搜索hwnd的systree类子窗口
Win_SearchWnd_Tool(hWnd,level);//搜索hwnd的toolbar类子窗口
Win_SearchWnd_Dialog(hWnd,id,DisWnd1,DisWnd2,...);//搜索hwnd的子窗口,不能是DisWnd...
Win_GotoTreeItem(hWnd,text,notext);//切换到树窗口的text(非notext)条目
Win_CheckTreeItem(hWnd,text,notext);//检查当前是不是树窗口的text(非notext)条目
Win_GetListCtrl_Info(hWnd,size);//获取listctrl的字段信息
Win_GetListCtrl_Data(hWnd,index,size);//获取listctrl的第index条数据
Win_DBLCLK_ListCtrl(hWnd,index);//双击listctrl条目
Win_MFC_BNCLK(hWnd,id);//VC程序点击按钮
Win_SetWindowText(hWnd,text);//VC程序点击按钮
Win_SetWindowText_EX(hWnd,text);//VC程序点击按钮
Win_MOUSECLK(hWnd);//点击
Win_SetActiveWindow(hWnd);//激活
Win_SW_HIDE(hWnd);//隐藏
Win_SW_RESTORE(hWnd);//恢复
Win_WM_KEYDOWN(hWnd,VK_val);//键按下
Win_WM_CHAR(hWnd,VK_val);//键消息
Win_ALT_KEY(hWnd,m_char);//alt+键消息
Win_CB_SETCURSEL(hWnd,sel);//控件选择
Win_ProcessMemInfo();//本进程内存模块信息
Win_ProcessMemData(start,end);//本进程内存数据
Win_ProcessMemDasm(start,end);//本进程内存反汇编
Win_GetProcessMoudleImport(CString name);//调入本进程指定模块输入表,返回添加数量
Win_GetProcessMoudleExport(CString name);//调入本进程指定模块输出表,返回添加数量
Win_GetProcessMoudleNameList(CString name);//获取本进程指定模块的名称列表
Win_GetProcessMoudleCallList(CString name);//获取本进程指定模块的调用列表
Win_WriteProcessMemBYTEData(pwr_at,byte str);//写入进程数据BYTE字串12 23
Win_Asm(pwr,src)//汇编单条指令并写入,返回长度,若含有函数名称,请以★★开头,☆☆结束来界定

Win_ReadMemToBuf(start,end);//读进程内存数据到缓冲区
Win_ReadMemBufByteData(dir);//读内存数据缓冲区byte
Win_ReadMemBufWORDData(dir);//读内存数据缓冲区word
Win_ReadMemBufDWORDData(dir);//读内存数据缓冲区word
Win_ReadMemBufIntData(dir);//读内存数据缓冲区int
Win_ReadMemBufFloatData(dir);//读内存数据缓冲区float
Win_ReadMemBufDoubleData(dir);//读内存数据缓冲区double
Win_ReadMemBufStringData(dir,len,endbyte);//读内存数据缓冲区字串
Win_SearchProcessMemDWORDData(start,end,dword str);//搜索进程数据word
Win_SearchProcessMemIntData(start,end,int str);//搜索进程数据int
Win_SearchProcessMemFloatData(start,end,float str);//搜索进程数据float
Win_SearchProcessMemDoubleData(start,end,double str);//搜索进程数据double
Win_SearchProcessMemStringData(start,end,str);//搜索进程数据字串*忽略
Win_SearchProcessMemBYTEData(start,end,byte str);//搜索进程数据BYTE字串12 23 ...忽略cc
*****************************************
XDebug_SetInt3Break(Address,js);//置int3断点
XDebug_SetMemBreak(Address,js);//置内存断点
XDebug_SetDebugBreak(Address,js);//置硬断点
XDebug_ClearInt3Break(Address);//清int3断点
XDebug_ClearMemBreak(Address);//清内存断点
XDebug_ClearDebugBreak(Address);//清硬断点
XDebug_FlashInt3Break();//刷int3断点
XDebug_FlashMemBreak();//刷内存断点
XDebug_FlashDebugBreak();//刷硬断点
XDebug_ClearAllInt3Break();//清所有int3断点
XDebug_ClearAllMemBreak();//清所有内存断点
XDebug_ClearAllDebugBreak();//清所有硬断点
Xdebug_ClearBreakWait_Goto(index);//等同于go命令
Xdebug_ClearBreakWait_Call(index);//等同于call后命令
Xdebug_ClearBreakWait_ToCall(index);//等同于call前命令
Xdebug_ClearBreakWait_ToJmp(index);//等同于jmp前命令
Xdebug_ClearBreakWait_Proc_Head(index);//等同于函数头命令
Xdebug_ClearBreakWait_Proc_Ret(index);//等同于函数返回命令
Xdebug_ClearBreakWait_ToCmp(index);//等同于cmp前命令
Xdebug_ClearBreakWait_Step(index);//等同于单步命令
Xdebug_GetBreakWait(index);//获得等待状态
Xdebug_GetBreakWait_Flag(index);//获得等待处理标记
Xdebug_ClearBreakWait_Flag(index);//清除等待处理标记,以示已处理
Xdebug_GetBreakReg_Eax(index);//获取中断点寄存器
Xdebug_GetBreakReg_Ebx(index);//获取中断点寄存器
Xdebug_GetBreakReg_Ecx(index);//获取中断点寄存器
Xdebug_GetBreakReg_Edx(index);//获取中断点寄存器
Xdebug_GetBreakReg_Edi(index);//获取中断点寄存器
Xdebug_GetBreakReg_Esi(index);//获取中断点寄存器
Xdebug_GetBreakReg_Ebp(index);//获取中断点寄存器
Xdebug_GetBreakReg_Esp(index);//获取中断点寄存器
Xdebug_GetBreakReg_Eip(index);//获取中断点寄存器
Xdebug_GetBreakReg_Eflags(index);//获取中断点寄存器
Xdebug_GetBreakReg_Dr0(index);//获取中断点寄存器
Xdebug_GetBreakReg_Dr1(index);//获取中断点寄存器
Xdebug_GetBreakReg_Dr2(index);//获取中断点寄存器
Xdebug_GetBreakReg_Dr3(index);//获取中断点寄存器
Xdebug_GetBreakReg_Dr6(index);//获取中断点寄存器
Xdebug_GetBreakReg_Dr7(index);//获取中断点寄存器
Xdebug_SetBreakReg_Eax(index,value);//修改中断点寄存器,慎用!!
Xdebug_SetBreakReg_Ebx(index,value);//修改中断点寄存器
Xdebug_SetBreakReg_Ecx(index,value);//修改中断点寄存器
Xdebug_SetBreakReg_Edx(index,value);//修改中断点寄存器
Xdebug_SetBreakReg_Edi(index,value);//修改中断点寄存器
Xdebug_SetBreakReg_Esi(index,value);//修改中断点寄存器
Xdebug_SetBreakReg_Ebp(index,value);//修改中断点寄存器
Xdebug_SetBreakReg_Esp(index,value);//修改中断点寄存器
Xdebug_SetBreakReg_Eip(index,value);//修改中断点寄存器
Xdebug_SetBreakReg_Eflags(index,value);//修改中断点寄存器
*****************************************
2010-5-3 13:57
0
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
在语言中使用

debuginfo
wininfo
meminfo
hookinfo
fxinfo1
fxinfo2
fxinfo3
fxinfo4

这八个外部变量(不需要用var定义的变量)来将调试信息发到调试终端的对应窗口

比如你使用
meminfo="very good!";

那么very good!字串就会被发到模块窗口

(这里名字是开始搞时起的,比较不达意)
2010-5-3 14:13
0
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
使用内存搜索函数可以快速定位,就象这个

Win_SearchProcessMemBYTEData(0x401000,0x600000,"34 62 37 32 33 37 35 39 CC 61 37 36");

搜索数据中的 CC表示这位不论数据
2010-5-3 14:16
0
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
搞程序分析主要在于目标定位,所以特征搜索功能很重要.

一但目标有了,就可以利用内存断点来断程序,来确认调用部位

我个人不大喜欢int3断点,因为调试时有可能因为某种情况不能恢复原指令,就容易引起程序崩溃.

要尽量利用硬断点.

我个人比较看好Cheat Engine的ring0的调试技术,可惜我个人水平有限.

搞不了ring0.不过以后有可能会去试试,看能不能使用Cheat Engine的dbk32.dll
2010-5-3 14:23
0
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
本程序只能用于分析打开的进程,所以不能用于入口分析.
2010-5-3 14:26
0
雪    币: 237
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
打开notepad后点插入调试,插入notepad进程,没反应了。。。LZ给点简单的文挡好么
2010-5-3 14:28
0
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
有什么问题请跟帖.我会抽时间来回复.
2010-5-3 14:29
0
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
插入后要稍等.

你是什么平台?有可能是防火墙挡住了.

另外在windows 2008/vista/win7上要以管理员权限运行,
不然就要出问题.
2010-5-3 14:32
0
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
被防火墙或系统挡住有两个环节

1,插入myrmt00.dll,不让插

2.myrmt00.dll调试模块到调试终端rmtdebug.exe的网络端口被封.

所以假如有问题,请从这两方面着手
2010-5-3 14:35
0
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
我已经知道notepad为什么不能调试了,因为他没有网络部分
2010-5-3 14:57
0
雪    币: 291
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
我已经在myrmt00.dll中把网络库加上,本贴下载的文件已经修改更新.

你更新一下,就可以调试notepad等没网络连接的程序了
2010-5-3 15:01
0
雪    币: 386
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
24
靠前膜拜牛人
2010-5-3 15:03
0
雪    币: 7
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
牛人,手下了,放暑假再回来看,哈哈
2010-5-3 15:25
0
游客
登录 | 注册 方可回帖
返回