首页
社区
课程
招聘
[原创]发一个自己写的调试工具源码
发表于: 2006-10-6 09:16 25394

[原创]发一个自己写的调试工具源码

2006-10-6 09:16
25394

自己写的一个调试工具。以前发过它的反汇编引擎,这次发的是加入了动态调试功能和脚本引擎的源代码。

这个引擎完全由脚本驱动,所有的功能如下断点、获取某寄存器的值等都得通过编写脚本才看得到(主要是我太懒了,呵呵)。

我没有什么编程的经验,所以代码写的很乱,很多地方写的也很糟糕,各位大哥们看过以后,一定给我多提意见啊,谢谢了。

示例文件kaizer.rar是根据crackme区的一篇破文写的一个破解脚本。使用方法是:首先用DSASMER.exe打开那个crackme的可执行文件,然后选择 脚本-》运行脚本 打开kaizer.lua这个文件就可以了。这个脚本文件是一个文本文件,可以用记事本打开查看和修改。我写的这个东东还有好多问题,可能会内存泄漏,引起死机等等,运行的时候请慎重,呵呵(好像也没有那么恐怖啦)。

文件太大了,有3mb多,发不到论坛上,只好放到永硕E盘上了,下载地址:hefei2.ys168.com

请各位大哥多提意见啊,谢谢了。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (46)
雪    币: 303
活跃值: (476)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
支持,谢谢
2006-10-6 09:21
0
雪    币: 128
活跃值: (10)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
好牛啊,大虾,有空介绍一下经验
2006-10-6 12:21
0
雪    币: 440
活跃值: (822)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
4
试用看看
开源的,支持
2006-10-6 16:44
0
雪    币: 50161
活跃值: (20630)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
牛人还是多,谢谢冒泡  ;)
2006-10-6 17:10
0
雪    币: 291
活跃值: (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
真是NB啊,

这种程序能耐心地编出来,不服不行
2006-10-6 21:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
牛人~~
2006-10-7 08:37
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你这个东东和其他的调试器相比有什么特点呢?就是可以自己编写调试脚本吗? 给大家介绍介绍呀。
2006-10-7 08:42
0
雪    币: 223
能力值: (RANK:130 )
在线值:
发帖
回帖
粉丝
9
你这个东东和其他的调试器相比有什么特点呢?就是可以自己编写调试脚本吗? 给大家介绍介绍呀。


我是想把它写成一个完全由脚本驱动的调试工具,在强大的脚本语言的支持下,能够把一些原本很烦碎的工作交给调试器自动化的完成。不过貌似现在离这个目标还有一定的距离。

就现在的情况来说,它几乎还不是太能用,呵呵。我把它放出来,是因为很多地方我觉得写得还很糟糕,而我自己的想法似乎也不是太完善,希望大家能够给我一些帮助,来一起完善这些不足的地方。呵呵。
2006-10-7 10:56
0
雪    币: 538
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
真厉害啊
2006-10-14 10:25
0
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
11
强啊,自己的调试工具最适合特殊用途了
2006-10-16 08:23
0
雪    币: 233
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
谢谢分享  支持继续完善  
2006-10-19 01:36
0
雪    币: 223
能力值: (RANK:130 )
在线值:
发帖
回帖
粉丝
13
目前DSASMER所提供的调试API列表:

原型:static int add(lua_State *L);//only a test
执行脚本:c = add(a,b)
功能:将两个数a、b相加,结果放在c当中

原型:static int LMessageBox(lua_State *L);//show a messagebox,:),messagebox("hello,world!")
执行脚本:messagebox(string)
功能:显示一个消息框,消息的内容是参数string的值,参数string必须是一个字符串类型
示例:

a = "hello world!" --声明一个字符串类型的变量
messagebox(a)

messagebox("hello world!") --直接使用字符串作为参数传入

原型:static int LGetFlTheFirstRow(lua_State *L);//getTheFirstRow,GetFlTheFirstRow(),return addr and par
执行脚本:addr,par1,par2,par3,par4 = getflthefirstrow()
功能:得到显示列表中第一行的地址及第一行的四个域分别显示的字符串,其中addr为地址,par1,par2,par3,par4分别是对应的四个字符串的值

原型:static int LGetFlTheLastRow(lua_State *L);//getTheLastRow,GetFlTheLastRow(),return addr and par
执行脚本:addr,par1,par2,par3,par4 = getflthelastrow()
功能:得到显示列表中最后一行的地址及最后一行的四个域分别显示的字符串,其中addr为地址,par1,par2,par3,par4分别是对应的四个字符串的值

原型:static int LGetFlTheNextRow(lua_State *L);//getTheNextRow,GetFlTheNextRow(addr),return addr and par
执行脚本:addr1,par1,par2,par3,par4 = getflthenextrow(addr2)
功能:得到当前行的下一行的地址及四个域分别显示的字符串,其中addr1为上一行的地址,par1,par2,par3,par4分别是对应的四个字符串的值,addr2为当前行地址
示例:
addr_p = getflthefirstrow() --得到第一行的地址
addr,par1,par2,par3,par4 = getflthenextrow(addr_p) --得到第二行的地址及对应四个域的字符串,addr_p参数是上一行的地址

原型:static int LSetFlText(lua_State *L);//setFlText,SetFlText(addr,index,string),null
执行脚本:setfltext(addr,index,string)
功能:将地址addr所指向的那一行的第index个域改为string的值,index从零开始计数

原型:static int LReadAByteFromFile(lua_State *L);//read a byte from image file,ReadAByteFromFile(addr),return number
执行脚本: readbyte = readabytefromfile(addr)
功能:从被调试进程的地址addr读取一个字节

原型:static int LGetString(lua_State *L);//get a string from addr,GetString(addr),return string
执行脚本:str = getstring(addr)
功能:从被调试进程的地址addr读取一个字符串,该字符串必须以零结尾,长度不能大于256个字节

//DeBug APIs
原型:static int LDDebugLoad(lua_State *L);//load a pe file to debug,null
执行脚本:ddebugload()
功能:加载当前反汇编的文件以备动态调试

原型:static int LDSetBreakPoint(lua_State *L);//set a break point,return null
执行脚本:dsetdebugbreakpoint(addr)
功能:在addr处设置断点,需要注意的是,在加载之后必须先设置一个断点之后才能在这个断点响应之后进入调试回调主函数

原型:static int LDRegisterMainFunc(lua_State *L);//register a call back function for break point,RegisterMainFunc(name),return null,call function need a address of breakpoint
执行脚本:registermainfunc(name)
功能:注册脚本调试回调主函数,参数name是函数名。调试主函数的意思是说,当被调试的程序遇到一个断点时,DSASMER就回调这个函数,并由这个函数对断点进行进一步的处理,例如获取某一个寄存器的值,或是再下另一个断点,或是对被调试程序做某些修改等等。回调函数的声明必须在注册之前。
示例:
main(addr)--addr是响应断点的地址
if(addr=breakpointaddr)
--dosomething
end
end
registermainfunc("main")

原型:static int LDGetThreadContext(lua_State *L);//
执行脚本:eax,ebx,ecx,edx,esp,ebp,esi,edi,eip,eflages,segcs,segds,segss,seges,segfs,seggs = dgetthreadcontext()
功能:获取当前被调试程序的线程上下文,该函数必须在断点响应之后执行。该函数的返回参数是可以省略的,不必全部接收。
示例:
--获取eax的值
eax = dgetthreadcontext()
--获取edx的值
eax,edx = dgetthreadcontext()
--获取eax,edx,ecx的值
eax,edx,ecx = dgetthreadcontext()
2006-10-21 11:37
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
原来楼主是个lua的高手啊
2006-10-26 12:50
0
雪    币: 201
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
真是NB啊
2006-11-3 21:13
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
真是NB啊
2006-11-10 12:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
????????????????
2006-11-10 16:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
高手一个 佩服中  学习一下
2006-11-13 10:28
0
雪    币: 232
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
试用看看
开源的,支持
2006-11-16 11:09
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
真是NB啊
2006-11-17 21:03
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
继续努力,进一步完善

2006-11-17 22:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
hefei2.ys168.com,这个地址好像下载不了了!
2006-11-20 20:43
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
hefei2.ys168.com,这个地址好像下载不了了!
2006-11-22 08:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
期待进一步完善
2006-11-22 09:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SPC
25
正在找调试软件方面的资料呢,谢谢楼主了。
2006-12-15 15:46
0
游客
登录 | 注册 方可回帖
返回
//