首页
社区
课程
招聘
怎么从运行的一个进程里面读出数据
发表于: 2011-12-8 14:47 4632

怎么从运行的一个进程里面读出数据

2011-12-8 14:47
4632
有一个软件W在运行的时候不断重复运行一个函数memmove,这个函数有3个参数,一个是源地址,一个是目的地址,还有一个应该是move的内容长度
见截图。

我需要编写一个程序,将这个函数move到某个地址(这个地址我跟踪出来了是0012F78C)的内容显示出来。
截图中此次要显示的内容就是保存在0012F78C的内容。
我参考一位大侠写的http://kssd.pediy.com/pediy09/pediy09-127.htm内容尝试读取这个数据,好像显示出来的结果不对。
因为我对基址、偏移什么的不太懂,只是依葫芦画瓢。请有空的老师指导一下,谢谢。
程序代码如下:
高手写的类:
 class ProcessMemoryWorkApi
    {
        //HANDLE OpenProcess(
        //    DWORD dwDesiredAccess,// access flag
        //    BOOL bInheritHandle, // handle inheritance flag
        //    DWORD dwProcessId  // process identifier
        //    );
        [DllImport("kernel32.dll")]
        public static extern
            IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32 dwProcessId);

        //BOOL CloseHandle(
        //    HANDLE hObject  // handle to object to close
        //    );
        [DllImport("kernel32.dll")]
        public static extern
            Int32 CloseHandle(IntPtr hObject);

        //BOOL WriteProcessMemory(
        //    HANDLE hProcess, // handle to process whose memory is written to
        //    LPVOID lpBaseAddress, // address to start writing to
        //    LPVOID lpBuffer, // pointer to buffer to write data to
        //    DWORD nSize, // number of bytes to write
        //    LPDWORD lpNumberOfBytesWritten  // actual number of bytes written
        //    );
        [DllImport("kernel32.dll")]
        public static extern
            Int32 WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, uint[] lpBuffer, UInt32 nSize, IntPtr lpNumberOfBytesWritten);

        //BOOL ReadProcessMemory(
        //    HANDLE hProcess, // handle of the process whose memory is read
        //    LPCVOID lpBaseAddress, // address to start reading
        //    LPVOID lpBuffer, // address of buffer to place read data
        //    DWORD nSize, // number of bytes to read
        //    LPDWORD lpNumberOfBytesRead  // address of number of bytes read
        //    );
        [DllImport("kernel32.dll")]
        public static extern
            Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, uint[] lpBuffer, UInt32 nSize, IntPtr lpNumberOfBytesRead);

    }

我参照他写的内容改了一下
  private void button1_Click(object sender, EventArgs e)
        {
            IntPtr WHandle;
            IntPtr PinballScoreAddressPointer = (IntPtr)0x0012F78C;  //这里我改成了我跟到的那个地址
            uint[] PinballScoreAddress = new uint[1];               //显示值的内存地址
            uint[] PinballScoreRead = new uint[1];                  //用来存放当前值
           System.Diagnostics.Process[] TdxProcessID
                = System.Diagnostics.Process.GetProcessesByName("W"); //根据进程名获取进程ID

            if (WProcessID.Length != 0)
            {
                WHandle = ProcessMemoryWorkApi.OpenProcess(0x1F0FFF, 0, (UInt32)WProcessID[0].Id);  //PROCESS_ALL_ACCESS=0x1F0FFF
                ProcessMemoryWorkApi.ReadProcessMemory(WHandle, PinballScoreAddressPointer, PinballScoreAddress, 4, (IntPtr)0);//通过指针得到PinballScoreAddress
                MessageBox.Show(PinballScoreAddressPointer.ToString(), "W_Demo");
               
            }
            else
                MessageBox.Show("\"W\" 还没有运行吧?", "WP_Demo");


        }

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 3
活跃值: (118)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
你确定这个地址每次跟都一样么?
2011-12-8 14:50
0
雪    币: 195
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
重复了几次,发现不对。不过调用函数那行
00482236 都是一样的,请指导一下该如何把这个值读出来,谢谢。
2011-12-8 15:20
0
雪    币: 1556
活跃值: (310)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
可以调试么?可以调试就好办,以调试子程序运行
2011-12-8 15:31
0
雪    币: 195
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谁能解释一下,汇编代码里的地址,数据窗口的地址,还有堆栈里的地址,以及基址,偏移之类的关系吗,这块好久没搞懂。谢谢了。
2011-12-8 17:27
0
雪    币: 195
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
今天买了本汇编语言和加密与解密,搞懂了一些,有了一些进展。
楼上的提醒了内存的地址每次都不一样的。我结合一个教程,修改了汇编代码

004821B1                        8915 83214800   mov dword ptr ds:[482183],edx 这里从下面跳上来的,选了一段空白的,把内存地址复制到固定的地址,便于取出来
004821B7                        90              nop
004821B8                        FF15 B8E16800   call dword ptr ds:[<&MSVCRT.memmove>]              ; msvcrt.memmove   这里恢复原来的
004821BE                        EB 7C           jmp short W.0048223  C                            ; 这里跳回接着执行
004821C0                        8B5424 04       mov edx,dword ptr ss:[esp+4]
004821C4                        57              push edi
004821C5                        8BFA            mov edi,edx
004821C7                        83C9 FF         or ecx,FFFFFFFF
004821CA                        33C0            xor eax,eax
004821CC                        F2:AE           repne scas byte ptr es:[edi]
004821CE                        F7D1            not ecx
004821D0                        49              dec ecx
004821D1                        5F              pop edi
004821D2                        83F9 01         cmp ecx,1
004821D5                        7C 18           jl short W.004821EF
004821D7                        81F9 FF000000   cmp ecx,0FF
004821DD                        7F 10           jg short W.004821EF
004821DF                        807C11 FF 5C    cmp byte ptr ds:[ecx+edx-1],5C
004821E4                        74 09           je short W.004821EF
004821E6                        C60411 5C       mov byte ptr ds:[ecx+edx],5C
004821EA                        C64411 01 00    mov byte ptr ds:[ecx+edx+1],0
004821EF                        C3              retn
004821F0                        56              push esi
004821F1                        8B7424 08       mov esi,dword ptr ss:[esp+8]                       004821F5                        33D2            xor edx,edx
004821F7                        57              push edi
004821F8                        85F6            test esi,esi
004821FA                        74 5F           je short W.0048225B
004821FC                        8BFE            mov edi,esi
004821FE                        83C9 FF         or ecx,FFFFFFFF
00482201                        33C0            xor eax,eax
00482203                        F2:AE           repne scas byte ptr es:[edi]
00482205                        F7D1            not ecx
00482207                        49              dec ecx
00482208                        74 51           je short W.0048225B
0048220A                        803E 20         cmp byte ptr ds:[esi],20
0048220D                        75 30           jnz short W.0048223F
0048220F                        8A4432 01       mov al,byte ptr ds:[edx+esi+1]
00482213                        42              inc edx
00482214                        3C 20           cmp al,20
00482216                      ^ 74 F7           je short W.0048220F
00482218                        85D2            test edx,edx
0048221A                        74 23           je short W.0048223F
0048221C                        8BFE            mov edi,esi
0048221E                        83C9 FF         or ecx,FFFFFFFF
00482221                        33C0            xor eax,eax
00482223                        F2:AE           repne scas byte ptr es:[edi]
00482225                        F7D1            not ecx
00482227                        B8 01000000     mov eax,1
0048222C                        49              dec ecx
0048222D                        2BC2            sub eax,edx
0048222F                        03D6            add edx,esi
00482231                        03C8            add ecx,eax
00482233                        51              push ecx
00482234                        52              push edx                                           ; 这里准备动刀子
00482235                        56              push esi
00482236                      ^ E9 76FFFFFF     jmp W.004821B1                                  ; memmove 原来这里是 call memmove函数
0048223B                        90              nop



现在能从软件里面读取固定的地址出来了。
现在问题来了。
取出来的是16进制值,翻译成10进制有时候是3位数有时候是2位数,有时候是1位数









edx的值是保存的一个内存地址,怎么样才能想od一样能把值显示出来呢?
我用那个函数读取的时候是需要制定长度的,这个长度不固定,但是od是怎么知道只提取了edx那个地址的值得呢?请老师指点。
上传的附件:
2011-12-9 15:22
0
雪    币: 56
活跃值: (1448)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这个东西我可以用E语言写出来,c和汇编功夫不行,要用到内存—读内存整数型,需要进程ID,进程地址,就可以读写进程数据了,一般写辅助时候用到
2011-12-9 15:26
0
雪    币: 195
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
EDX 0012F792 数据窗口里面的数据,怎么正好就读出来那个数据的呢?
2011-12-9 16:39
0
雪    币: 2210
活跃值: (12)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
用这个函数不行吗?
但读几个字节要知道
::ReadProcessMemory(hProcess,pCountBase,(LPVOID)(&num),4,&byread);
2011-12-11 10:52
0
游客
登录 | 注册 方可回帖
返回
//