您的位置:程序门 -> vb ->



关于跟踪读写内存问题(汇编)


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


关于跟踪读写内存问题(汇编)[已结贴,结贴人:zcsor]
发表于:2007-06-21 22:41:33 楼主
写游戏修改器,写完了生成配置、数据搜索、指针扫描功能,差跟踪内存读写问题。
这个问题是这样的:如何获取读写本进程内存的汇编代码地址?
例如:进程a.exe的地址00f00000内容为0a   00   00   00,如何跟踪a.exe读和写该地址的汇编代码,获取该汇编代码的地址?
是hook   api?hook那个呢?copymemory不行。难道是扫描内存然后分析数据?反正我是不会了,能提供这方面的详细介绍内容也可。
发表于:2007-06-21 23:21:211楼 得分:1
readprocessmemory/writeprocessmemory
发表于:2007-06-22 00:37:402楼 得分:20
跟踪内存读写   需要用调试技术,   非常麻烦
hook   api   也没用的
发表于:2007-06-22 00:53:123楼 得分:1
.........................................
发表于:2007-06-22 02:02:074楼 得分:0
1楼不对,2楼说的倒有点意思,谁能解决问题?
发表于:2007-06-22 08:13:355楼 得分:1
不是很了解,调试技术不是很懂,用过od,但是不太明白工作原理.
发表于:2007-06-22 18:57:406楼 得分:1
内存读写,最终实现,应该还是readprocessmemory/writeprocessmemory吧?

比如,我现在要读一个变量的值(vb6里),虽然print   x就行了,不过最终却还是那两个api?

如果是这样,那么lz是否想取得谁调用了它们?也就是说,想要得到print   x的汇编代码?
发表于:2007-06-22 22:27:427楼 得分:1
楼主去搜索:游戏内存修改工具  

第一个公开源码的游戏内存修改作弊程序!支持搜索过滤任意进程(核心进程除外)所在的内存中和搜索匹配的内容,并对内存值进行锁定、修改等功能!win98或2000下测试通过。
发表于:2007-06-23 12:15:588楼 得分:0
楼上,你所说的功能我已经写完了,也就是获取内存属性然后复制内存搜索的过程。
这个帖子是想问跟踪功能。
发表于:2007-06-23 14:00:309楼 得分:1
关注一下进展情况,如果楼主解决了,被忘了贴出来,谢谢
发表于:2007-06-23 17:55:2310楼 得分:0
。。。我已经n个帖子没结果都结了。。。基本到最后都是问大学同学。。。。呵呵,不要鄙视。。。。我们都不是计算机专业的。全是业余选手
发表于:2007-06-23 22:22:1311楼 得分:80
我知道在调试器怎么做
下一个内存读写断点,让程序读写这个内存的时候中断.
你查查调试的api吧
发表于:2007-06-23 22:27:0012楼 得分:1
修改器的原理都是使用writeprocessmemory()对指定内存区域进行写入。

如果要实现数值锁定功能就readprocessmemory()不断进行指定内存区域的读取,发现数值有改变就重新写入。
发表于:2007-06-23 22:28:1213楼 得分:1
读写内存的时候中断,这个时候断点所在的地方就是读写的汇编代码了
发表于:2007-06-23 23:19:2214楼 得分:1
刚才搜索了一下,有牛人说道使用drx寄存器
发表于:2007-06-24 10:31:2415楼 得分:0
感觉楼上说的很是有道理。。。。但是基本原理我是不太知道啊。。。。能给个地址之类的吗。。


我再重申啊,不是要内存读写代码,o(∩_∩)o...哈哈,,不过谢谢热心~~~~~~~~~:)
发表于:2007-06-24 10:59:2616楼 得分:1
http://www.pediy.com/bbshtml/bbs6/pediy6751.htm
文中所说的bpm断点就是读写内存的断点,可以是代码段中,也可以是在数据段中.
你要是用过softice或者是trw之类的调试器就会知道bpm断点.
^_^说实话,我只是对这些东西了解一些,并没有做过类似的东西.
发表于:2007-06-26 11:14:5117楼 得分:0
这个bmp断点可以下在数据段内吗?是下int3哦?如果是,那只是把目标地址的数据该为cc吧,可是他不是数据么,会当数据读回去吧。。。。我还发现一个问题,等待调试消息的时候,即使继续了,目标进程也被死锁了。。只有停止调试才会活动,这个应该是如何写呢?我看一些代码里面根本没有退出等待循环。。。比较奇怪啊。
发表于:2007-06-26 11:56:5918楼 得分:0
哦。。看明白一些了,上面第一问题是错误的。。哈哈。。

现在就剩下那个该死的循环了,怎么在循环中使目标进程继续执行呢?和continuedebugevent的最后一个参数有关吗,dbg_exception_not_handled还是dbg_continue是由是否成功处理调试信息决定的。。。。吧。。
发表于:2007-06-26 12:12:1519楼 得分:1
你搜索softice   bpm   这个是在内存下断点的.
ollydbg也可以的,找到你的数据,然后下内存读或者写断点,然后这个数据改变的时候就会断下来
在写地址的那句汇编上.
发表于:2007-06-26 12:25:0320楼 得分:1
学习
发表于:2007-06-26 15:56:2521楼 得分:0
现在好。。连我的调试程序都一起死了,停止相应。。
我是在一个单独线程里循环
while   waitfordebugevent(devent,   150)

end   while

发表于:2007-06-28 19:17:4922楼 得分:0
哎哟。。。。。。。。。。
今天该了无数个api声明,无数个结构声明。。终于有成果了。
成果是这样的:(比较caodan,不过总是有进步了。
可以操作进程上下文了,可能是下断点有问题,红色警戒当测试程序,一下就出来错误对话框了,虽然是我取消循环时,不过看起来上下文是操作成功了,今天下午本来想放弃用api了,看了看.net的调试接口,不知道怎么的,那个该死的com我引用不了,于是打算全部放弃了,不过突然灵机一动,想起来2个api,解决了这个问题。。


还存在很多其他的事情,就是前面说的,被调试进程死锁问题,一进入循环,就被死锁了。还得继续检查,估计离成功不远了。。说是在的,写这个修改器这个玩意,难为死我了,还有很多工作没做,前期发布的beta1版本里面加的那个搜索功能,有很多功能没实现,例如精确确定内存数据是否真的是指针、不同数据(单双浮点,byte数组,text,未知值等)的搜索等等都没做呢,本来是想完成那个再研究这部分来着。可一弄上这个,发现我牙比较软显得骨头比较硬,就放不下手了,今天程序就先写到这里了,弄不动了,搞这个东西搞的心情非常烦躁。。。。实际上,我从接触计算机开始就对修改有兴趣,无论是改里面的什么,可能这就是后来对编程有兴趣的原因吧,再就是我真就不服这个劲,你看看市面上有口皆碑的修改器是什么?gm7+,ce4.5+等等,都是老外搞的,都带有搜索及代码跟踪功能;国内的呢?都是些啥东东,以前著名的金山,现在也不动弹了,很让人郁闷的慌。各位专业选手没有兴趣也没有时间搞这东西,那我就将就着弄弄吧,就当是学.net做这个工程学的能快一点。


进度也报告完了,牢骚也发完了,最后还得问一个问题(前面问过的不问了,我自己研究吧,估计快到头了,也就是代码写的有点马虎的地方还没发现,逐步测试一下就解决了),这个问题是下一个功能的,也是现在写的跟踪必要的:内存代码和汇编代码互转问题,是互相转换。

网上有个dll,可以将内存代码转汇编,可不能转回来,有说od有个dll能用的,我不知道是哪个,怎么用。而且想自己写这个功能,写的时候是不是要参考80x86   opcodes?如何分析一个内存数据的意义是操作还是数据?
发表于:2007-06-30 14:49:4423楼 得分:0
akirya(坏[其实偶不是什么所谓的坏人])   (   )   信誉:100         blog       加为好友     2007-6-26   12:12:15     得分:   0    
 
 
     
你搜索softice   bpm   这个是在内存下断点的.
ollydbg也可以的,找到你的数据,然后下内存读或者写断点,然后这个数据改变的时候就会断下来
在写地址的那句汇编上.

   
 
好像有点问题啊。我设置断点是这么做的。
0、阻塞线程
1、读当前上下文
2、将contextflags设置为context_full
3、将dr0设置为数据的内存地址06f969a4(红色警戒的金钱地址,本次运行时为06f969a4)
4、设置dr7   =   2   ^   0   +   2   ^   1   +   2   ^   18   +   2   ^   19   (将l0   g0置位,将rwe0置位)
      设置dr6   =   2   ^   14   (将bs置位)
5、写回上下文
6、解除线程阻塞
还没切回被调试进程,调试器就返回exception_debug_event事件,并且是exception_record的exceptioncode值为exception_breakpoint,处理函数接收后,获取上下文。得到的结果很奇怪:

exceptioncode的exceptionaddress指向了目标进程的后段地址—7c921230,这个地址数据是cc   c3   8b   ff也就是:int   3   ;   ret   ;   mov   edi   edi。
首先,这个断点不是应该在写入数据时被触发吗
另外,就算这个地址一直被写入,那么exceptionaddress也应该指向写入语句地址吧。。为什么指向了dbgbreakpoint函数呢?

这时取回的上下文更不知所云:(以下是按4字节对齐以后的上下文内容)
0     5001f                   contextflags
4     6f969a4               dr0
8     0                           1
c     0                           2
10     0                         3
14     0                         dr6
18     c0001                 dr7
1c     ffff0e7f           controlword
20     ffff4021           statusword
24     ffffffff           tagword
28     708c4f               erroroffset
2c     1c9001b             errorselector
30     785738               dataoffset
34     ffff0023           dataselector
38     20000000          
3c     c773757a
40     f800bfc8
44     86ffffff
48     3ffdb560
4c     0
50     9cfc0500
54     bffe
58     0
5c     0
60     0
64     0
68     0
6c     0
70     0
74     0
78     a1000000
7c     c007
80     0
84     0
88     0                       cr0npxstate
8c     0                       seggs
90     3b                     segfs
94     23                     seges
98     23                     segds
9c     13d44c             edi
a0     0                       esi
a4     0                       ebx
a8     0                       edx
ac     76d3078           ecx
b0     78e548             eax
b4     13d474             ebp
b8     7c92eb94         eip
bc     1b                     segcs
c0     200202             eflags
c4     13d41c             esp
c8     23                     segss
根本不知道都是啥么玩意!


我的处理函数是按如下过程进行处理的,写成vb6代码大体是以下形式,当下面函数返回值为t时,将把结果显示出来,并撤销调试器。
private   function   cc   ()   as   boolean
dim   rct   as   boolean   false
select   case   exceptioncode
        case   exception_breakpoint
                阻塞进程
                读上下文
                解除阻塞
                rct   =   ture

        case   exception_single_step
                非常奇怪的是,这里根本没进入,可是dr6里面命名设置的是步进断点嘛~
        end   select
cc   =   ret

end   function


是我下断点的时候有啥问题吗?
发表于:2007-06-30 14:57:0624楼 得分:0
上面这里写错了
0、阻塞线程
1、读当前上下文
2、将contextflags设置为context_full
1、2两步倒过来,代码是这样的顺序
0、阻塞线程
1、将contextflags设置为context_full
2、读当前上下文

另外,context是这样的定义(x86方式)

        public   structure   context
                dim   contextflags   as   integer   '0x00000000                                          
                dim   dr0   as   integer     '0x00000004   context   debug   registers          
                dim   dr1   as   integer     '0x00000008   context   debug   registers  
                dim   dr2   as   integer     '0x0000000c   context   debug   registers  
                dim   dr3   as   integer     '0x00000010   context   debug   registers  
                dim   dr6   as   integer     '0x00000014   context   debug   registers  
                dim   dr7   as   integer     '0x00000018   context   debug   registers  
                dim   floatsave   as   floating_save_area   'context   floating   point  
                dim   seggs   as   integer         '0x0000008c   context   segments
                dim   segfs   as   integer         '0x00000090   context   segments
                dim   seges   as   integer         '0x00000094   context   segments
                dim   segds   as   integer         '0x00000098   context   segments
                dim   edi   as   integer             '0x0000009c   context   integer
                dim   esi   as   integer             '0x000000a0   context   integer
                dim   ebx   as   integer             '0x000000a4   context   integer
                dim   edx   as   integer             '0x000000a8   context   integer
                dim   ecx   as   integer             '0x000000ac   context   integer
                dim   eax   as   integer             '0x000000b0   context   integer
                dim   ebp   as   integer             '0x000000b4   context   control
                dim   eip   as   integer             '0x000000b8   context   control
                dim   segcs   as   integer         '0x000000bc   context   control
                dim   eflags   as   integer       '0x000000c0   context   control
                dim   esp   as   integer             '0x000000c4   context   control
                dim   segss   as   integer         '0x000000c8   context   control
                shared   extendedregisters()   as   byte       '0x000000cc...0x000002cb   context   extended   registers
                private   sub   initialize()
                        redim   extendedregisters(&h1ff)
                end   sub
        end   structure
        public   structure   floating_save_area
                dim   controlword   as   integer     '0x0000001c  
                dim   statusword   as   integer       '0x00000020  
                dim   tagword   as   integer             '0x00000024
                dim   erroroffset   as   integer     '0x00000028
                dim   errorselector   as   integer   '0x0000002c
                dim   dataoffset   as   integer       '0x00000030
                dim   dataselector   as   integer   '0x00000034
                shared   registerarea()   as   byte   '0x00000038...0x00000087
                dim   cr0npxstate   as   integer     '0x00000088
                private   sub   initialize()
                        redim   registerarea(&h4f)
                end   sub
        end   structure

这个是.net形式的。。只是在private   sub   initialize()里面将对应的数组初始化成相应的长度。难道有问题。。。。。。。我翻看了很多资料,都这个形式,当然语言不同可能不一样,我标在后面的起地址都是一样的,对齐方便嘛~:)


akirya(坏[其实偶不是什么所谓的坏人])同志继续帮忙啊。。
也邀请其他高手给小弟指点指点!!!

解决另开帖加分,呵呵,分不多了,最近问了n个200的帖子,现在还有400多,这些分解决之后全部奉上,不过感觉确实有点少…………请求捐赠……………………这已经是第2次伸手要分了,o(∩_∩)o...哈哈,谢谢大家支持~~~~~~
发表于:2007-06-30 16:26:0425楼 得分:1
关注
发表于:2007-06-30 18:26:0726楼 得分:1
呵呵~  
其实这个问题你应该去www.pediy.com那里问一下吧。
好像有人在搞调试器,问下收获应该会比较大。
发表于:2007-06-30 23:52:4427楼 得分:2
咳咳.......帮顶一下.......
发表于:2007-07-01 07:15:3928楼 得分:2
咳咳.......帮顶一下.......
发表于:2007-07-07 13:59:2429楼 得分:0
自己顶一下。。。
发表于:2007-07-09 13:47:0330楼 得分:1
楼主你总拿红警作例子,我以前写过一个红警金钱修改的小程序,我发现红警有3个内存偏移地址存放金钱值,而且相互校验,其中2个内存偏移地址为固定的,一个为动态变化的。不知道这对你有什么帮助没有!我改的是红警2.0的金钱值,在csdn资源里能找到我哪个不成器的东西
发表于:2007-07-09 14:53:4531楼 得分:1
用vb整这个难度大了点,换了我可能找点vc的代码,然后学学vc的使用(虽然也挺费劲).
发表于:2007-07-09 16:28:1632楼 得分:80
内存代码   和   汇编代码的转换问题。。。。

其实也可以说内存中的代码(应该叫机器码了)就是汇编代码
只不过汇编代码是以符号化的方式显示出来,以方便的理解

具体的转换工作。。。   目前我也很想知道,如果知道了这个
那我早就可以在vb中用汇编了。。。。。

一般的转换原理:
mov   eax,数据
原理好像是   先将   mov   按约定的机器码   or   或者   xx   与后面的参数运算后   得到
本条语句的机器码。。。   具体,研究了一段时间,但苦于找不到教材实在.....
发表于:2007-07-10 13:22:4733楼 得分:0
zzyong00(阿勇)   (   )  
谢谢热心,呵呵。。有时间你可以去我的下载区里浏览一下。。。。

theforever(碧海情天)   (   )  
其实,难度都不小不是么,只是调试的具体细节没有弄清楚,我感觉.net的功能还不错,再说没有特别的需要(例如写dll啥的),用vb还是很顺手的。

pctgl()   (   )  
od的主页上有一个dll的源文件,c写的,是用来转换的,还没来得及看,呵呵,因为回老家避暑加修养一下,所以没继续做,过些天回去再继续喽。

谢谢大家的支持。。呵呵
发表于:2007-07-21 15:03:3634楼 得分:0
准备把帖子结了,已经找到解决办法,但是代码还没写,理论上是通过了的,经过一段时间的学习把应该用的知识已经积攒的差不多了,雏形也已经出来了,就差编码和调试了。


这个帖子散分,另一个帖子的分全归akirya(坏[其实偶不是什么所谓的坏人])   (   )。
基本就是这样了。


快速检索

最新资讯
热门点击