昨天做逆向做了半天才做出四、五个,还是找人要点好了。嘿嘿。

解决方案 »

  1.   

    //累死我了,能力所限,不过大部分应该准确吧。
    //注意比如PSetupDestroyDriverInfo3(PVOID)是表示有一个未知类型的参数!
    @1 = int __fastcall NtPrintUpgradePrinters(int,int,int,int)
    @2 = int __stdcall PSetupUpgradeClusterDriversW(int,int,LPWSTR pName)
    @3 =  int __stdcall ServerInstallW(int,int,LPCWSTR lpString)
    @4 = int __stdcall ClassInstall32(int,HDEVINFO DeviceInfoSet,PSP_DEVINFO_DATA DeviceInfoData)
    @5 = int __fastcall PSetupAssociateICMProfiles(int,int,int,int)
    @6 = int __stdcall PSetupBuildDriversFromPath(HDEVINFO DeviceInfoSet,int,int)
    @7 = int __stdcall PSetupCreateDrvSetupPage(HDEVINFO DeviceInfoSet,int)
    @8 = int __stdcall PSetupCreateMonitorInfo(int,LPWSTR pName)
    @9 = int __stdcall PSetupCreatePrinterDeviceInfoList(HWND hwndParent)
    @10 = void __stdcall PSetupDestroyDriverInfo3(PVOID)
    @11 = void __stdcall PSetupDestroyMonitorInfo(PVOID)
    @12 = void __stdcall PSetupDestroyPrinterDeviceInfoList(PVOID)
    @13 = void __stdcall PSetupDestroySelectedDriverInfo(PVOID)
    @14 = void __stdcall PSetupDriverInfoFromName(PVOID,PVOID)
    @15 = void __stdcall PSetupEnumMonitor(PVOID,PVOID,PVOID,PVOID)
    @16 = void __stdcall PSetupFindMappedDriver(PVOID,PVOID,PVOID,PVOID)
    @17 = void __stdcall PSetupFreeDrvField(PVOID)
    @18 = @10 = void __stdcall PSetupDestroyDriverInfo3(PVOID)
    @19 = int __fastcall PSetupGetDriverInfForPrinter(int,int,int,LPWSTR pPrinterName,int,int)
    @20 = void __stdcall PSetupGetDriverInfo3(PVOID)
    @21 = void __stdcall PSetupGetLocalDataField(PVOID,PVOID,PVOID)
    @22 = int __stdcall PSetupGetPathToSearch(HWND hwndParent,PCWSTR DialogTitle,PCWSTR DiskName,PCWSTR FileSought,int,DWORD PathRequiredSize)
    @23 = int __stdcall PSetupGetSelectedDriverInfo(PVOID)
    @24 = int __fastcall PSetupInstallICMProfiles(int,int,PCWSTR,int)
    @25 = void __stdcall PSetupInstallInboxDriverSilently(PVOID)
    @26 = int __fastcall PSetupInstallMonitor(int,int,int)
    @27 = int __fastcall PSetupInstallPrinterDriver(int,int,int,int,int,int,int,int,int,int,int,int,int,int)
    @28 = int __fastcall PSetupInstallPrinterDriverFromTheWeb(int,int,int,int,int,int,int,int)
    @29 = int __stdcall PSetupIsCompatibleDriver(int,PCWSTR Key,wchar_t *,int,int,int,int,int)
    @30 = int __stdcall PSetupIsDriverInstalled(LPWSTR pName,LPCWSTR lpString2,int,int)
    @31 = void __stdcall PSetupIsOemDriver(x,x,x)
    @32 = int __stdcall PSetupIsTheDriverFoundInInfInstalled(int pName,int,int,int)
    @33 = void __stdcall PSetupKillBadUserConnections()
    @34 = int __fastcall PSetupPreSelectDriver(int,int,int,int,int)
    @35 = int __stdcall PSetupProcessPrinterAdded(int,int,int pPrinterName,int)
    @36 = int __stdcall PSetupRefreshDriverList(HDEVINFO DeviceInfoSet)
    @37 = void __stdcall PSetupSelectDeviceButtons(PVOID,PVOID,PVOID)
    @38 = int __stdcall PSetupSelectDriver(HDEVINFO DeviceInfoSet)
    @39 = int __fastcall PSetupSetSelectDevTitleAndInstructions(int,int,int,LPCWSTR lpString,int,int)
    @40 = int __stdcall PSetupShowBlockedDriverUI(HWND hWnd,int)
    @41 = void __stdcall PSetupThisPlatform()
      

  2.   

    楼上的是用工具吗?好几个指针参数被你弄成了int了。不过还是谢谢了。再等半天结帖。
      

  3.   

    用的就是传说中的IDA Pro。
      

  4.   

    还有ntprint.dll中用到了一个内部定义的结构,像PSetupDriverInfoFromName就是返回那个特殊的参数指针。给我的数据几乎没用啊……不过还是谢谢你。
      

  5.   

    再等半天……郁闷来着。
    那个特殊的结构我逆向出来的不完整版本是:
    typedef struct _tagDriverInfo
    {
    LPCWSTR szDriveFileName;
    LPCWSTR szPrintName;
    LPCWSTR szType;
    LPCWSTR szUnknown1;
    LPCWSTR szInfo;
    LPCWSTR szFactory;
    DWORD szUnknown2;
    LPCWSTR szSystemInfo;
    DWORD dwUnknow1;
    DWORD dwUnknow2;
    DWORD dwUnknow3;
    DWORD dwUnknow4;
    DWORD dwUnknow5;
    LPCWSTR szShowName;
    DWORD dwUnknow7;
    DWORD dwUnknow8;
    DWORD dwUnknow9;
    }DRIVER_INFO, *PDRIVER_INFO;
    当然还有没有处理完的
      

  6.   

    IDA可能对指针和int型无法很好的识别的。
      

  7.   

    好像和你分析的不一样哦
    我得到的PSetupDriverInfoFromName的两个参数分别是
    void PSetupDriverInfoFromName(SP_DRVINFO_DATA_W *lpInfo,LPCWSTR szDriveFileName)0 _SP_DRVINFO_DATA_W struc ; (sizeof=0x60C, standard type)
    00000000 cbSize          dd ?
    00000004 DriverType      dd ?
    00000008 Reserved        dd ?
    0000000C Description     dw 256 dup(?)
    0000020C MfgName         dw 256 dup(?)
    0000040C ProviderName    dw 256 dup(?)
    0000060C _SP_DRVINFO_DATA_W ends
      

  8.   

    我是说返回值啊,不是传入值啊。
    PSetupDriverInfoFromName的原型明显是这样的:PDRIVER_INFO PSetupDriverInfoFromName(HDEVINFO, LPCWSTR);
    HDEVINFO详细见MSDN
      

  9.   

    好像不是,我坚持我的观点,PSetupDriverInfoFromName它应该是把值从参数中返回。
    .text:5F3AD376                 push    0
    .text:5F3AD378                 push    [ebp+arg_0]
    .text:5F3AD37B                 call    sub_5F3ACD84
    .text:5F3AD380                 jmp     short loc_5F3AD384
    .text:5F3AD382                 xor     eax, eax
    .text:5F3AD384                 pop     ebp
    .text:5F3AD385                 retn    8
    看看,它要么直接清调eax返回,要么返回sub_5F3ACD84的值。
    下面我们看看sub_5F3ACD84的情况:
    .text:5F3ACFD4                 mov     ecx, [ebp+var_4]
    .text:5F3ACFD7                 pop     edi
    .text:5F3ACFD8                 pop     esi
    .text:5F3ACFD9                 call    sub_5F3B10BD 
    .text:5F3ACFDE                 leave
    .text:5F3ACFDF                 retn    8
    我们在转到sub_5F3B10BD看看:
    .text:5F3B10BD                 cmp     ecx, dword_5F3B4A58
    .text:5F3B10C3                 jnz     short loc_5F3B10CE //report_gsfailure
    .text:5F3B10C5                 test    ecx, 0FFFF0000h
    .text:5F3B10CB                 jnz     short loc_5F3B10CE //report_gsfailure
    .text:5F3B10CD                 retn
    分析发现sub_5F3B10BD 是一个检查错误的函数。
    而这说明了PSetupDriverInfoFromName没有返回值。
    我不知道你是怎样分析PSetupDriverInfoFromName函数的,如果认为我说的不对请说明理由,指出你是怎样分析,为什么那么认为。
      

  10.   

    你附加explorer.exe,跟踪一下好了,你的分析是不错,但它的确在EAX里返回了一个指针。
    我用的系统是XPSP2,但应该也不会有版本不同的。
      

  11.   

    郁闷,发帖求助,成了打擂台了。
    下面我们来看看 wangk(倒之) 所说的sub_5F3ACD84的情况:
    5F3ACFBE    83BD CCF9FFFF 00 cmp dword ptr ss:[ebp-634],0
    5F3ACFC5    5B               pop ebx
    5F3ACFC6    74 04            je short ntprint.5F3ACFCC
    5F3ACFC8    8BC6             mov eax,esi    ;事实上,返回的参数开始是保存在esi里的
    5F3ACFCA    EB 08            jmp short ntprint.5F3ACFD4
    5F3ACFCC    56               push esi
    5F3ACFCD    E8 48C5FFFF      call ntprint.5F3A951A
    5F3ACFD2    33C0             xor eax,eax
    5F3ACFD4    8B4D FC          mov ecx,dword ptr ss:[ebp-4]
    5F3ACFD7    5F               pop edi
    5F3ACFD8    5E               pop esi
    5F3ACFD9    E8 DF400000      call ntprint.5F3B10BD
    5F3ACFDE    C9               leave
    5F3ACFDF    C2 0800          retn 8大哥,你能不能往上多看几行啊?尤其是能跳到返回区的那些代码。还好,因为要和你较劲,我在这儿发现了那个神秘结构的填充过程,你再看看,我逆向去了。
      

  12.   

    我的系统中ntprint.dll根本没有被加载,包括explorer.exe程序。
      

  13.   

    相互探讨,有助于共同进步嘛。
    我晕了。看来没有动态跟踪分析的不准确啊。
    .text:5F3ACDAC                 push    0B8h            ; uBytes
    .text:5F3ACDB1                 mov     [ebp+DeviceInfoData], eax
    .text:5F3ACDB7                 call    sub_5F3A946A //这里分配内存。
    .text:5F3ACDBC                 mov     esi, eax
    但是在后面,因为没有动态跟踪所以不知道下面的有没有执行,不过我认为应该执行到了:
    .text:5F3ACFCC                 push    esi
    .text:5F3ACFCD                 call    sub_5F3A951A //这里释放掉上面分配的内存。
    .text:5F3ACFD2                 xor     eax, eax
      

  14.   

    还是下不到断点,不知道是怎么回事。就是不走PSetupDriverInfoFromName函数。
    不知道是不是这种结构:
    typedef struct _DRIVER_INFO {
      LPWSTR   cVersion; 
      LPWSTR     pName;
      LPWSTR     pEnvironment;
      LPWSTR     pDriverPath;
      LPWSTR     pDataFile;
      LPWSTR     pConfigFile;
      LPWSTR     pHelpFile;
      LPWSTR     pDependentFiles;
      LPWSTR     pMonitorName;
      LPWSTR     pDefaultDataType;
      LPWSTR     pszzPreviousNames;
      FILETIME   ftDriverDate; 
      DWORDLONG  dwlDriverVersion; 
      LPWSTR     pszMfgName; 
      LPWSTR     pszOEMUrl; 
      LPWSTR     pszHardwareID; 
      LPWSTR     pszProvider; 
    } DRIVER_INFO, *PDRIVER_INFO, *LPDRIVER_INFO;
    今天看的头都大了,也不知道对不对。汗中。