1000高分求购ntprint.dll里的函数原型,结帖后另开帖给分 昨天做逆向做了半天才做出四、五个,还是找人要点好了。嘿嘿。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //累死我了,能力所限,不过大部分应该准确吧。//注意比如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() 楼上的是用工具吗?好几个指针参数被你弄成了int了。不过还是谢谢了。再等半天结帖。 用的就是传说中的IDA Pro。 还有ntprint.dll中用到了一个内部定义的结构,像PSetupDriverInfoFromName就是返回那个特殊的参数指针。给我的数据几乎没用啊……不过还是谢谢你。 再等半天……郁闷来着。那个特殊的结构我逆向出来的不完整版本是: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;当然还有没有处理完的 IDA可能对指针和int型无法很好的识别的。 好像和你分析的不一样哦我得到的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 我是说返回值啊,不是传入值啊。PSetupDriverInfoFromName的原型明显是这样的:PDRIVER_INFO PSetupDriverInfoFromName(HDEVINFO, LPCWSTR);HDEVINFO详细见MSDN 好像不是,我坚持我的观点,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函数的,如果认为我说的不对请说明理由,指出你是怎样分析,为什么那么认为。 你附加explorer.exe,跟踪一下好了,你的分析是不错,但它的确在EAX里返回了一个指针。我用的系统是XPSP2,但应该也不会有版本不同的。 郁闷,发帖求助,成了打擂台了。下面我们来看看 wangk(倒之) 所说的sub_5F3ACD84的情况:5F3ACFBE 83BD CCF9FFFF 00 cmp dword ptr ss:[ebp-634],05F3ACFC5 5B pop ebx5F3ACFC6 74 04 je short ntprint.5F3ACFCC5F3ACFC8 8BC6 mov eax,esi ;事实上,返回的参数开始是保存在esi里的5F3ACFCA EB 08 jmp short ntprint.5F3ACFD45F3ACFCC 56 push esi5F3ACFCD E8 48C5FFFF call ntprint.5F3A951A5F3ACFD2 33C0 xor eax,eax5F3ACFD4 8B4D FC mov ecx,dword ptr ss:[ebp-4]5F3ACFD7 5F pop edi5F3ACFD8 5E pop esi5F3ACFD9 E8 DF400000 call ntprint.5F3B10BD5F3ACFDE C9 leave5F3ACFDF C2 0800 retn 8大哥,你能不能往上多看几行啊?尤其是能跳到返回区的那些代码。还好,因为要和你较劲,我在这儿发现了那个神秘结构的填充过程,你再看看,我逆向去了。 我的系统中ntprint.dll根本没有被加载,包括explorer.exe程序。 相互探讨,有助于共同进步嘛。我晕了。看来没有动态跟踪分析的不准确啊。.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 还是下不到断点,不知道是怎么回事。就是不走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;今天看的头都大了,也不知道对不对。汗中。 对话框和窗口的问题 帮忙设计一下数据库结构 使用DLL注入钩子,如何能马上激活?在线等 VC 如何画虚线矩形框 合同期满,离职需要办些什么手续? 绝对高分!求简单键盘模拟源码 vc技术内幕(第四版)的看书疑问。 我想在EditBox里面显示一些特殊字符,请问该怎么做 CTreeCtrl~~~~~~~搞不定啊 在16进制中的0A转换成ASC码是什么呀??? VS6sp6 英文版本什么地方可下?微软地址不能下了 用.NET的installer制作版本时候遇到的量个问题
//注意比如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()
那个特殊的结构我逆向出来的不完整版本是:
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;
当然还有没有处理完的
我得到的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
PSetupDriverInfoFromName的原型明显是这样的:PDRIVER_INFO PSetupDriverInfoFromName(HDEVINFO, LPCWSTR);
HDEVINFO详细见MSDN
.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函数的,如果认为我说的不对请说明理由,指出你是怎样分析,为什么那么认为。
我用的系统是XPSP2,但应该也不会有版本不同的。
下面我们来看看 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大哥,你能不能往上多看几行啊?尤其是能跳到返回区的那些代码。还好,因为要和你较劲,我在这儿发现了那个神秘结构的填充过程,你再看看,我逆向去了。
我晕了。看来没有动态跟踪分析的不准确啊。
.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
不知道是不是这种结构:
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;
今天看的头都大了,也不知道对不对。汗中。