首页
社区
课程
招聘
[原创]自己写的显示内存的数据函数
发表于: 2009-2-15 09:59 6512

[原创]自己写的显示内存的数据函数

2009-2-15 09:59
6512

调试程序的时候 经常要查看内存数据 孤陋寡闻,不知道有什么API可以直接把内存数据以文本的形式写出来 索性自己写了一个函数 ,从中学到不少东西· 共享出来,给有和我同样需要的朋友


invoke _MemToStr,40001000h,30h
invoke        MessageBox,NULL,eax,$CTA0("TEST"),MB_OK

;invoke _MemToStr,lpDate,DateLen    lpDate 想读取的内存地址 读取长度  返回EAX为文本指针
;invoke        _DwToStr,lpStr,Date

_DwToStr        proc uses edx ebx ecx edi esi  lpStr,Date
                        Local @szTMP:DWORD
                        Local @szBuffer[512]:Byte
                        invoke        RtlZeroMemory,addr @szBuffer,sizeof @szBuffer
                        mov        esi,lpStr
                        lea        edi,@szTMP
                        mov        ebx,Date
                        mov        ax,bx
                        shr        ebx,16
                        shl        eax,16
                        add        eax,ebx
                        mov        @szTMP,eax
                        mov        ecx,4
                        @@:
                        mov        eax,0
                        mov        al,[edi]
                        shl        ax,4
                        shr        al,4
                        .if ah<0ah
                                add ah,30h
                        .else
                                add ah,37h
                        .endif
       
                        .if al<0ah
                                add al,30h
                        .else
                                add al,37h
                        .endif
                                mov        dh,al
                                mov        dl,ah
                                mov        word ptr [esi],dx
                        add        edi,1
                        add        esi,2
        loop @b
        lea eax,@szBuffer
        ret
_DwToStr        endp

_MemToStr        proc        uses ebx edx ecx edi esi lpDate,DateLen
        Local @szAddrTmpHex:Byte
        Local @szBuffer[2048]:Byte
        local        @i:byte
        invoke        RtlZeroMemory,addr @szBuffer,sizeof @szBuffer
        mov        edi,lpDate
        lea        esi,@szBuffer
        mov        ecx,6
        mov        @i,0
        mov        eax,2020h
        init:
        mov        dword ptr [esi],eax
        add        esi,2
        loop init
       
        mov        ecx,10
        mov        bx,30h
        init2:
        mov        word ptr [esi],bx
        mov        dword ptr [esi+1],eax
        add        bx,1
        add        esi,3
        loop init2
       
        mov        ecx,6
        mov        bx,41h
        init3:
        mov        word ptr [esi],bx
        mov        dword ptr [esi+1],eax
        add        bx,1
        add        esi,3
        loop init3
       
        mov        dx,0d0ah
        mov        word ptr [esi],dx
        add        esi,2
       
        mov        ecx,DateLen
        @@:       
                .if @i==0                ;新行
                        mov        dx,7830h
                        mov        word ptr [esi],dx
                        add        esi,2
                        invoke _DwToStr,esi,edi
                        mov        dl,20h
                        mov        byte ptr [esi+8],dl
                        add        esi,9
                .endif
               
        add @i,1
        mov        eax,0
        mov        al,[edi]
        shl        ax,4
        shr        al,4
        .if ah<0ah
                add ah,30h
       
        .else
                add ah,37h
        .endif
       
        .if al<0ah
                add al,30h
       
        .else
                add al,37h
        .endif
        mov        dh,al
        mov        dl,ah
        mov        word ptr [esi],dx
        mov        dl,20h
        mov        byte ptr [esi+2],dl
        .if        @i<16
                add        esi,3
               

        .else
               
                mov        dx,0d0ah
                mov        word ptr [esi+3],dx
                add        esi,5
                mov        @i,0
               
        .endif

        add        edi,1
        loop @b
       
        lea eax,@szBuffer
        ret
_MemToStr        endp
       

其中有一个似乎可以用递归的地方,结果试了N次都调试不成功  总返回 jmp too far


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (8)
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
刚看了 书呆老大 给昨天的一个问题的回复
发现这个函数写的有问题。
不要返回栈上的数据 这是基本常识。汗··现在我总算知道了。。
疑似应该是 不要返回 局部变量的地址吧。上面的程序用内部变量做字符缓冲区
函数直接返回 字符串在堆栈上的地址。。。。。。
有问题。。。各位想用的话 最好自己修改下吧。。。给_MemToStr加一个输入参数 指向 调用者自己定义的缓冲区
2009-2-15 10:07
0
雪    币: 254
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看着挺累的,不知道用WIN32汇编和C的效率差多少。
但C的开发效率是高吧?
2009-2-15 15:44
0
雪    币: 255
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
如何向显存中直接写入 2进制数据?并且保护?
2009-2-18 09:58
0
雪    币: 190
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
汇编运行效率 要在高手手上才反映的出来,
这种写法很明显没C的效率高
2009-2-18 11:24
0
雪    币: 247
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
masm自带的函数有这功能
2009-2-18 15:47
0
雪    币: 157
活跃值: (471)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
写驱动的时候写的这两个函数。很好用。

printhex proc dataaddr:dword,datalen:dword
        pushad
        mov ecx,datalen
        lea edx,buffer
        mov eax,dataaddr
        myloop:
        xor ebx,ebx
        mov bl,byte ptr[eax]
        shr ebx,4
        .if ebx<0ah
                add ebx,30h
        .else
                add ebx,37h
        .endif
        mov byte ptr[edx],bl
        inc edx
        mov bl,byte ptr[eax]
        shl ebx,01ch
        shr ebx,01ch
        .if ebx<0ah
                add ebx,30h
        .else
                add ebx,37h
        .endif
        mov byte ptr[edx],bl
        inc edx
        mov byte ptr[edx],20h
        inc edx
        inc eax
        loop myloop
        invoke DbgPrint,addr buffer
        popad
        ret
printhex endp

printunicode proc dataaddr:dword
       
        pushad
        mov eax,dataaddr
        lea edx,buffer
        xor ebx,ebx
        mov bx,word ptr[eax]
        .while ebx!=0
                mov cl,byte ptr[eax]
                .if cl!=0
                        mov byte ptr[edx],cl
                        inc edx
                .endif
                inc eax
                mov cl,byte ptr[eax]
                .if cl!=0
                        mov byte ptr[edx],cl
                        inc edx
                .endif
                inc eax
                mov bx,word ptr[eax]
        .endw
        mov byte ptr[edx],00h
        invoke DbgPrint,addr buffer
        popad
        ret
       
printunicode endp
2009-2-21 13:47
0
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk
8
masm什么时候自带了函数了。
2009-2-21 17:34
0
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk
9
DbgPrint不是有格式化功能的吗?为什么要这么麻烦?
2009-2-21 17:35
0
游客
登录 | 注册 方可回帖
返回
//