oopww 发表于 2012-4-11 13:00:25

如何获取其他进程当前读取的数据?

公司有一套加密软件,是透明加密方式!
我的想法是既然他要解密才能让我们的软件读取数据嘛,不然这么读取啊?O(∩_∩)O~
这个程序会监视指定程序保存数据(比如word),然后立马加密!
我们要做的工作就是把该程序当前读取的数据给读取出来(已经是正规的编码了,没有加密了),然后再保存!保存出来的就不是加密的,因为他监视的是word、excel等其他软件的读写操作,而不是我们的程序!



简单点说,我打开word,然后我读取word进程打开的doc的数据,然后保存成doc文件!有能实现这样的嘛?{:soso_e101:}

或者说是读取CAD进程打开的dwg文件数据,然后给另存下来?{:soso_e122:}


也许程序会hook读取进程的函数,这个都不要紧,我们恢复这个hook再读取嘛,嘿嘿!~~

马大哈 发表于 2012-4-11 15:24:56

那意思是被加密的程序WriteFile写的是明文,但存到硬盘的是密文;

而ReadFile读取的是明文罗?

这样的话,很简单嘛,注入,然后在那个进程里调用ReadFile,再把读到的内容发到自己进程,然后自己进程再保存文件.{:soso__9053858523583330587_2:}

oopww 发表于 2012-4-11 19:25:18

马大哈 发表于 2012-4-11 15:24 static/image/common/back.gif
那意思是被加密的程序WriteFile写的是明文,但存到硬盘的是密文;

而ReadFile读取的是明文罗?


有木有参考?

oopww 发表于 2012-4-11 21:10:54

/*
两个关键函数 ReadProcessMemory和VirtualQueryEx 理解得不透彻,所以可能有点小问题,但大体流程应该是这样,希望对你有帮助。另外,好多地方没有作错误检查,不保证在你的环境下一定能用。
请各路大神指正。
*/
#include<iostream>
#include <fstream>
#include<windows.h>
#include<tlhelp32.h>
using namespace std;

int main()
{
    char app;
    cout<<"请输入映像名(含.exe)\n如: ctfmon.exe\n:";
    cin>>app;
    fstream fp("dump.txt",ios::binary|ios::out);
    BOOL flag=0;
    HANDLE htoken;
    TOKEN_PRIVILEGES tkp;
    OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&htoken);
    LookupPrivilegeValue(NULL, SE_DEBUG_NAME,&tkp.Privileges.Luid);
    tkp.PrivilegeCount = 1;
    tkp.Privileges.Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(htoken,0,&tkp,NULL,NULL,0);
    CloseHandle(htoken);
    PROCESSENTRY32 pe32;
    pe32.dwSize=sizeof(pe32);
    HANDLE hprosnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if(hprosnap==INVALID_HANDLE_VALUE)
    {
      cout<<"Snapshot failed!"<<endl;
    }
    if(Process32First(hprosnap,&pe32))
    {
      do
      {
            if(!strcasecmp(app,pe32.szExeFile))
            {
                cout<<"Program is dumping..."<<endl;
                flag=true;
                break;
            }
      }
      while(::Process32Next(hprosnap,&pe32));
    }
    CloseHandle(hprosnap);
    if(!flag)
    {
      cout<<"Process not found!\n";
      system("pause");
      return 1;
    }
    SYSTEM_INFO si;
    GetSystemInfo(&si);
    HANDLE htarget=OpenProcess(PROCESS_ALL_ACCESS,0,pe32.th32ProcessID);
    if(htarget==NULL)
    {
      cout<<"Open Process Error!\n";
      return 2;
    }
    MEMORY_BASIC_INFORMATION mbi;
    char *onepagebuf=new char ;
    for(DWORD start=(DWORD)si.lpMinimumApplicationAddress; start<(DWORD)si.lpMaximumApplicationAddress-si.dwPageSize; start+=si.dwPageSize)
    {
      if(!VirtualQueryEx(htarget,(void *)start,&mbi,sizeof(mbi))==sizeof(mbi))
            break;
      if(mbi.State==MEM_COMMIT)
      {
            ReadProcessMemory(htarget,(void *)start,onepagebuf,si.dwPageSize,NULL);
            fp.write(onepagebuf,si.dwPageSize);
      }
    }
    cout<<"done\n";
    CloseHandle(htarget);
    fp.close();
    delete []onepagebuf;
    system("pause");
    return 0;
}新电脑没装VC,欢迎翻译成VB!~

马大哈 发表于 2012-4-12 15:16:38

VB变态应用之"移花接木",陈辉原创(VB6.0)

这是VB6的远程执行函数的封装,你注入WORD再执行看看

oopww 发表于 2012-4-16 13:04:00

没人了》???我苦等10多天~!~

WG102514 发表于 2012-4-19 16:43:35

kk1025 发表于 2013-4-9 21:15:21

支持
页: [1]
查看完整版本: 如何获取其他进程当前读取的数据?