首页
社区
课程
招聘
[求助]实现查找内存中字符串的代码
发表于: 2010-4-9 19:40 8847

[求助]实现查找内存中字符串的代码

2010-4-9 19:40
8847
我想写个查找其他进程中字符串的代码,写了个但执行不成功,请各位大牛帮忙看看是哪的问题,小弟先谢谢了!
VirtualProtectEx和ReadProcessMemory 这2个函数都没能执行成功,我不明白是什么原因?

.386
.model flat,stdcall
option casemap:none

include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib

.data

hInstance        dd        ?
hProcess        dd        ?        ;进程句柄
szDllName        db        'kernel32.dll',0
lpAddress        dd        ?
szErrOpen        db        '无法打开远程进程!',0
lpBuffer        db        12        dup        (?)
szOk1                db        '1成功!',0
szOk2                db        '2成功!',0
szOk3                db        '3成功!',0
szOk4                db        '4成功!',0

.code

start:
                invoke        GetModuleHandle,NULL
                mov        hInstance,eax
               
                invoke        OpenProcess,PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE,FALSE,1940   ;1940是我测试的桌面进程的ID
                .if        eax
                        mov        hProcess,eax
                        mov        lpAddress,00010000h    ;这个地址是桌面进程内存的起始地址
                                        invoke        MessageBox,NULL,offset hProcess,NULL,MB_OK
                        .while        TRUE

                               
                                invoke        VirtualProtectEx,hProcess,offset lpAddress,12,PAGE_EXECUTE_READWRITE,NULL
                                .if        eax !=0
                                        invoke        MessageBox,NULL,offset szOk1,NULL,MB_OK
                                .endif
                                invoke        ReadProcessMemory,hProcess,offset lpAddress,offset lpBuffer,sizeof lpBuffer,NULL
                                .if        eax !=0
                                        invoke        MessageBox,NULL,addr szOk2,NULL,MB_OK
                                .endif
                               
                                invoke        lstrcmpi,offset lpBuffer,offset szDllName
                                .if        eax == 0
                                        invoke        MessageBox,NULL,offset szOk3,offset lpBuffer,MB_OK
                                        .break
                                .else
                                        invoke        MessageBox,NULL,offset szOk4,offset lpBuffer,MB_OK
                                .endif
                               
                                add        lpAddress,3
                               
                                ;invoke        GetThreadID
                               
                        .endw

                .else
                        invoke        MessageBox,NULL,addr szErrOpen,NULL,MB_OK or MB_ICONWARNING
                .endif

                invoke        ExitProcess,NULL
               
end        start

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

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
.data

hInstance  dd  ?
hProcess  dd  ?  ;进程句柄
szDllName  db  'kernel32.dll',0
lpAddress  dd  ?
szErrOpen  db  '无法打开远程进程!',0
lpBuffer  db  12  dup  (?)
szOk1    db  '1成功!',0
szOk2    db  '2成功!',0
szOk3    db  '3成功!',0
szOk4    db  '4成功!',0
szBuf db 20 dup(?)
szFormat db "%X",0


.code

start:
    invoke  GetModuleHandle,NULL
    mov  hInstance,eax
    
    invoke  OpenProcess,PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE,FALSE,3808   ;1940是我测试的桌面进程的ID
    .if  eax
      mov  hProcess,eax
      mov  lpAddress,00010000h    ;这个地址是桌面进程内存的起始地址
      invoke wsprintf,offset szBuf,offset szFormat,hProcess
      invoke  MessageBox,NULL,offset szBuf,NULL,MB_OK
      .while  TRUE

        
        invoke  VirtualProtectEx,hProcess,lpAddress,12,PAGE_EXECUTE_READWRITE,NULL
        .if  eax !=0
          invoke  MessageBox,NULL,offset szOk1,NULL,MB_OK
        .endif
        invoke  ReadProcessMemory,hProcess,lpAddress,offset lpBuffer,sizeof lpBuffer,NULL
        .if  eax !=0
          invoke  MessageBox,NULL,addr szOk2,NULL,MB_OK
        .endif
        
        invoke  lstrcmpi,offset lpBuffer,offset szDllName
        .if  eax == 0
          invoke  MessageBox,NULL,offset szOk3,offset lpBuffer,MB_OK
          .break
        .else
          invoke  MessageBox,NULL,offset szOk4,offset lpBuffer,MB_OK
        .endif
        
        add  lpAddress,3
        
        ;invoke  GetThreadID
        
      .endw

    .else
      invoke  MessageBox,NULL,addr szErrOpen,NULL,MB_OK or MB_ICONWARNING
    .endif

    invoke  ExitProcess,NULL
    
end  start 



不知道你是不懂英语还是不懂汇编
帮你改了一下,应该可以运行了
要达到你想要的目的还得你自己努力
2010-4-9 20:42
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我在2003下测试,VirtualProtectEx和ReadProcessMemory 函数仍然没成功执行。
麻烦兄弟再看下,我觉得是这2个函数的问题,他们没执行成功,不知道为什么。
2010-4-9 20:55
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
如果这2个函数没成功,那内存就读不出来了。
2010-4-9 20:58
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
invoke  OpenProcess,PROCESS_VM_READ or PROCESS_VM_OPERATION,FALSE,targetPid

今天我测试了,在xp下没有问题,执行成功(我没有2003可供测试)
你是否复制我的代码?
是否修改了目标pid?
再不行就自己调试
2010-4-10 14:40
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
兄弟,你没明白我的意思,OpenProcess这个函数本来就是成功的,问题的关键是ReadProcessMemory 没成功执行
2010-4-10 15:22
0
游客
登录 | 注册 方可回帖
返回
//