最近做一个项目:
        某第三方软件,包含一个DLL1文件,用来生成类表格界面的。在工作时候,类表格界面里的数据是实时刷新的,我要获取最新数据,应该怎么做?
目前思路:
       1、把DLL2远程注入第三方进程,调用DLL1,使用其中的函数获取实时刷新值。困难:远程注入成功后,不知道在DLL2中如何调用DLL1,而且即使调用成功后,我不知道怎么调用DLL1中的函数;即使能调用DLL中的函数,我也不知道函数求取的是不是类表格数据的数值。
       2、远程注入DLL2后,检索第三方软件进程的地址空间读取其中的刷新值。困难:我不知道怎么检索,及我不知道哪个地址是我需要的?而且在刷新以后,我也不知道新的地址是否是递增还是递减或者线性或者非线性?
       3、直接使用第三方软件带有的DLL1,使用其中的函数,但是没有头绪。
希望各位集思广益,不吝指点,谢谢大家~

解决方案 »

  1.   

    我觉得最起码你得把DLL1中各个函数的功能和参数列表搞清楚,否则需求根本无法实现
    用W32Dasm,WinDbg,OllyDbg等工具多分析一下,如果能找到说明文件那就更好
      

  2.   

    谢谢关注 ~~DLL1是第三方公司的出的一个通用DLL,叫Farpoint sheet,有函数的比较详细的说明,如果得到这些该走那条路好些呢??
      

  3.   

    1.用OD调试,分析DLL1,找到刷新界面的关键CALL,及其需要参数。
    2.注入,内嵌汇编,调用CALL。答题步骤就这样,做起来蛮复杂
      

  4.   

    能不能详细说明下?我没有很明白
    DLL1中函数是可以得到说明的,有资料。因为DLL1中包含有获取刷新后最新数据的函数:BOOL SSGetLastValidCell(HWND hWnd, LPSS_COORD lpCol, LPSS_COORD lpRow); 
    你看我的思路对不对:
    1、远程注入DLL1
    2、内嵌汇编条用SSGetLastValidCell函数,但是HWND hwnd函数调用第三方软件的窗口句柄从而获取lpcol和lprow的数值
    我不知道这样第三方有个DLL1了,我再注入一个DLL1,可以不?
    我如果无DLL远程注入,可以调用第三方软件中DLL1中的SSGetLastValidCell函数不???
    谢谢
      

  5.   

    还有一个想法:
    1、如果本地进程调用DLL1,此时DLL1的地址是否与第三方软件中调用的DLL1地址空间相同
    2、如果相同的话,直接无DLL远程注入第三方软件,然后调用DLL1中的SSSGetLastValidCell函数
    是否可以?
      

  6.   

    如果该函数没有导出的话,要实现你的要求有难度额,要涉及到外挂技术
    采用DLL2注入你的那个第三方程序进程,或者创建远程线程注入,这里推荐DLL注入,因为远程线程没编写好容易把被注入对象弄崩溃。
    DLL2里面内嵌汇编 DWORD addr = 0x12345678;
    lpRow = XXXX;
            lpCol = XXXX;
            hWnd = XXXX;
    __asm{
    push lpRow
    push lpCol
    push hWnd
    call addr
    popad
          } 怎么得到SSSGetLastValidCell的实际地址,也就是上面举例中的0x12345678,不是一两句可以说清楚的
    你可以看看看雪的加密解密。
      

  7.   


    __asm{
            push lpRow
            push lpCol
            push hWnd
            call addr
            popad       //这句多写了,去掉。  
              }    
      

  8.   

    en  谢谢~
    我现在的思路看下可以不:
    DLL2远程注入第三方进程,在DLL2的DLL_PROCESS_ATTACH中load DLL1,调用DLL1中的SSgetLastValidCell(HWN,...)函数
    其中参数HWN=GetWindowsEX(...),我选取第三方软件中的farpoint sheet窗口句柄,这是可以做的到的。
    下面看我的理解是不是正确了:
    因为DLL2是注入第三方进程了,所以DLL2的DLL_PROCESS_ATTACH中的内容都是在第三方进程的地址空间中,所以我再load 的DLL1,也是被load到第三方进程地址空间中,包括其中的SSgetLastValidCell函数。所以我可以调用这个函数,而不会存在跨界读取的问题。
    你说的没有导出是指没有定义DLLEXPORT int CALLBACK吧?
      

  9.   

    首先得知道DLL的导出接口,有的是def文件给出,如果不是的话,可以用DLL导出函数查看器看看,或者用dump output(这点记的不清楚),总之得出,DLL提供了哪些可用接口,
    然后,找到相关头文件,加入
    再在cpp文件中引入DLL,学习,关注~~~
      

  10.   

    你搞了半天,还是没弄清楚问题关键所在啊?注入什么的都是次要的,最主要的问题是,你要怎么调用SSgetLastValidCell,如果SSgetLastValidCell没有被导出,用GetProcAddress 是不行的。
    MSDN中:The spelling and case of a function name pointed to by lpProcName must be identical to that in the EXPORTS statement of the source DLL's module-definition (.def) file. 唉,到此为止了,你仔细把整个细节想想吧。