首页
社区
课程
招聘
[讨论]深思四加密狗模拟关键函数交流!
发表于: 2010-1-20 18:09 28931

[讨论]深思四加密狗模拟关键函数交流!

2010-1-20 18:09
28931

第一步
1.1,模拟SetupDiEnumDeviceInterfaces
函数原型如下:WINSETUPAPI   
  BOOL   
  WINAPI   
    SetupDiEnumDeviceInterfaces(   
          IN     HDEVINFO                                     DeviceInfoSet,   
          IN     PSP_DEVINFO_DATA                     DeviceInfoData,           OPTIONAL   
          IN     LPGUID                                         InterfaceClassGuid,   
          IN     DWORD                                           MemberIndex,   
          OUT   PSP_DEVICE_INTERFACE_DATA   DeviceInterfaceData   
          );   

看了TSSD的模拟汇编代码如下:
00391ECA >  55              push    ebp
00391ECB    8BEC            mov     ebp, esp
00391ECD    53              push    ebx
00391ECE    56              push    esi
00391ECF    57              push    edi
00391ED0    8B45 04         mov     eax, dword ptr [ebp+4]
00391ED3    66:33C0         xor     ax, ax
00391ED6    A3 FC723A00     mov     dword ptr [3A72FC], eax
00391EDB    FF35 FC723A00   push    dword ptr [3A72FC]
00391EE1    E8 59FFFFFF     call    00391E3F===================================这个CALL用于比较进程是否是TSSD.EXE,也就是控制是否是要模拟的进程.
00391EE6    59              pop     ecx
00391EE7    85C0            test    eax, eax
00391EE9    74 09           je      short 00391EF4==============如果是就跳转进行相关模拟,否则执行原函数。

00391EEB    8BE5            mov     esp, ebp
00391EED    5D              pop     ebp
00391EEE  - FF25 68803A00   jmp     dword ptr [3A8068]               ; Setupa_1.SetupDiEnumDeviceInterfaces
执行原函数

进行模拟
00391EF4    837D 14 00      cmp     dword ptr [ebp+14], 0==========比较第五个参数,DeviceInterfaceData是否是0,是的话进行动态返回值为1或者0,不是的话返回值为0
00391EF8    75 14           jnz     short 00391F0E
00391EFA    A1 7C193A00     mov     eax, dword ptr [3A197C]这个是变量,初始值为1
00391EFF    83F0 01         xor     eax, 1
00391F02    A3 7C193A00     mov     dword ptr [3A197C], eax
00391F07    A1 7C193A00     mov     eax, dword ptr [3A197C]
00391F0C    EB 02           jmp     short 00391F10

00391F0E    33C0            xor     eax, eax
00391F10    5F              pop     edi
00391F11    5E              pop     esi
00391F12    5B              pop     ebx
00391F13    5D              pop     ebp
00391F14    C2 1400         retn    14
这个过程总共调用三次,满足条件的话,返回值分别为0,1,0是通过上面的那个变量在控制。

第二步,模拟SetupDiGetDeviceInterfaceDetailA
函数原型如下:WINSETUPAPI   
  BOOL   
  WINAPI   
  SetupDiGetDeviceInterfaceDetailA(   
          IN     HDEVINFO                                                       DeviceInfoSet,   
          IN     PSP_DEVICE_INTERFACE_DATA                     DeviceInterfaceData,   
          OUT   PSP_DEVICE_INTERFACE_DETAIL_DATA_A   DeviceInterfaceDetailData,           OPTIONAL   
          IN     DWORD                                                             DeviceInterfaceDetailDataSize,   
          OUT   PDWORD                                                           RequiredSize,                                     OPTIONAL   
          OUT   PSP_DEVINFO_DATA                                       DeviceInfoData                                   OPTIONAL   
          );   
看了TSSD的模拟汇编代码如下:
00391F17 >  55              push    ebp
00391F18    8BEC            mov     ebp, esp
00391F1A    53              push    ebx
00391F1B    56              push    esi
00391F1C    57              push    edi
00391F1D    8B45 04         mov     eax, dword ptr [ebp+4]
00391F20    66:33C0         xor     ax, ax
00391F23    A3 FC723A00     mov     dword ptr [3A72FC], eax
00391F28    FF35 FC723A00   push    dword ptr [3A72FC]
00391F2E    E8 0CFFFFFF     call    00391E3F=====================与上面一样
00391F33    59              pop     ecx
00391F34    85C0            test    eax, eax
00391F36    74 09           je      short 00391F41
00391F38    8BE5            mov     esp, ebp
00391F3A    5D              pop     ebp
00391F3B  - FF25 F8803A00   jmp     dword ptr [3A80F8]               ; Setupa_1.SetupDiGetDeviceInterfaceDetailA

00391F41    837D 10 00      cmp     dword ptr [ebp+10], 0
00391F45    74 06           je      short 00391F4D
00391F47    837D 14 00      cmp     dword ptr [ebp+14], 0
00391F4B    75 14           jnz     short 00391F61
00391F4D    837D 18 00      cmp     dword ptr [ebp+18], 0
00391F51    74 09           je      short 00391F5C
00391F53    8B45 18         mov     eax, dword ptr [ebp+18]
00391F56    C700 54000000   mov     dword ptr [eax], 54
00391F5C    6A 01           push    1
00391F5E    58              pop     eax
00391F5F    EB 19           jmp     short 00391F7A
00391F61    6A 50           push    50
00391F63    68 80193A00     push    003A1980 ; ASCII "\\?\usb#vid_0471&pid_485d#5&2ad6af9d&0&5#{171638f7-1ead-4873-ba98-c966abcf0142}"
00391F68    8B45 10         mov     eax, dword ptr [ebp+10]
00391F6B    83C0 04         add     eax, 4
00391F6E    50              push    eax
00391F6F    E8 7C050000     call    003924F0
00391F74    83C4 0C         add     esp, 0C
00391F77    6A 01           push    1
00391F79    58              pop     eax
00391F7A    5F              pop     edi
00391F7B    5E              pop     esi
00391F7C    5B              pop     ebx
00391F7D    5D              pop     ebp
00391F7E    C2 1800         retn    18
这个函数也调用两次,
第一次第四个参数为0,第六个参数<>0,返回第六个参数为0x54,返回值1
第二次第四个参数不为0,第五个参数为0x54,DeviceInfoData返回值\\?\usb#vid_0471&pid_485d#5&3afbe3e0&0&2#{171638f7-1ead-4873-ba98-c966abcf0142}

第三步:CreateFileA(“\\?\usb#vid_0471&pid_485d#5&3afbe3e0&0&2#{171638f7-1ead-4873-ba98-c966abcf0142}”)
0012FC44   0040683D  /CALL 到 CreateFileA
0012FC48   0040A178  |FileName = "\\?\usb#vid_0471&pid_485d#5&3afbe3e0&0&2#{171638f7-1ead-4873-ba98-c966abcf0142}"
0012FC4C   80000000  |Access = GENERIC_READ
0012FC50   00000001  |ShareMode = FILE_SHARE_READ
0012FC54   00000000  |pSecurity = NULL
0012FC58   00000003  |Mode = OPEN_EXISTING
0012FC5C   00000000  |Attributes = 0
0012FC60   00000000  \hTemplateFile = NULL
HOOK CreateFileA(“\\?\usb#vid_0471&pid_485d#5&3afbe3e0&0&2#{171638f7-1ead-4873-ba98-c966abcf0142}”)返回有效句柄

第四步就可以HOOK DEVICEIOCONTROL,进行数据的操作,从而达到模拟的目的。
同时将TSSD的SETUPAPI.DLL上传,请大家研究,只要将其它深思四的程序重命名为TSSD.EXE,就可以跟踪这个是如何实现的


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (36)
雪    币: 2093
活跃值: (3469)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
希望高手能积极参与讨论,完成SETUPAPI.CPP架构文件.
2010-1-20 18:15
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
支持,我也在研究这东西,能否留个QQ呀什么的,我的是396893767
2010-1-20 19:21
0
雪    币: 2093
活跃值: (3469)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
希望高手来看看哦
2010-1-20 21:33
0
雪    币: 2093
活跃值: (3469)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
第三步和第四步没太大问题,基本是相对固定的,就是前面函数的模拟,希望高手出来指导一下。
2010-1-20 21:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
最近也在研究加密狗的程序
2010-1-20 21:59
0
雪    币: 2093
活跃值: (3469)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
一起学习 //---------------------------------------------------------------------------
// 获取优盘序列号的代码, by ccrun(老妖)
// 参考: http://www.2ccc.com/article.asp?articleid=4167
// 以下代码在 C Builder 6.0 和 VC 6.0 中编译通过
// 看帖请回帖, 转帖请留名.
//---------------------------------------------------------------------------

#include <setupapi.h>
#include <stdio.h>
#include <objbase.h>

#ifndef __BORLANDC__
#pragma comment(lib, "setupapi.lib")
#endif

//---------------------------------------------------------------------------
char g_strCrnVerify[] =
{
0xBB, 0xB6, 0xD3, 0xAD, 0xB9, 0xE2, 0xC1, 0xD9, 0x20, 0x43,
0x2B, 0x2B, 0x42, 0x75, 0x69, 0x6C, 0x64, 0x65, 0x72, 0xD1,
0xD0, 0xBE, 0xBF, 0x20, 0x2D, 0x20, 0x68, 0x74, 0x74, 0x70,
0x3A, 0x2F, 0x2F, 0x77, 0x77, 0x77, 0x2E, 0x63, 0x63, 0x72,
0x75, 0x6E, 0x2E, 0x63, 0x6F, 0x6D
};
//---------------------------------------------------------------------------
void CrnReplaceString(LPSTR lpBuf, char c1, char c2)
{
int nLen = strlen(lpBuf);
LPSTR lpTemp = new char[nLen];
memset(lpTemp, 0, nLen);
int j=0;
for(int i=0; i < nLen; i )
{
if(lpBuf[i] == c1)
{
if(c2 != 0x00)
{
lpTemp[j] = c2;
j ;
}
}
else
{
lpTemp[j] = lpBuf[i];
j ;
}
}
//
memset(lpBuf, 0, nLen);
strncpy(lpBuf, lpTemp, nLen);
delete []lpTemp;
}
//---------------------------------------------------------------------------
// 获取指定盘符的序列号(针对USB优盘有效)
// char cDiskID: 指定盘符,如 'L'
// LPSTR lpPID : 序列号存放的缓冲,如char szPID[32]
// by ccrun(老妖) info@ccrun.com
//---------------------------------------------------------------------------
bool CrnGetUSBDiskID(char cDiskID, LPSTR lpPID)
{
char szDrv[4];
sprintf(szDrv, "%c:\\", cDiskID);
if(GetDriveType(szDrv) != DRIVE_REMOVABLE)
{
MessageBox(0, "指定的盘不是有效的优盘.",
"错误", MB_OK | MB_ICONWARNING);
return false;
}

char lpRegPath[512] = { 0 };
char lpRegValue[256] = { 0 };
sprintf(lpRegPath, "SYSTEM\\MountedDevices");
sprintf(lpRegValue, "\\DosDevices\\%c:", cDiskID);
//
DWORD dwDataSize(0);
DWORD dwRegType(REG_BINARY);
LPBYTE lpRegBinData(NULL);
LPSTR lpUSBKeyData(NULL);

// 查询注册表中映射驱动器的设备信息
HKEY hKey;
long lRet = ::RegOpenKeyEx(
HKEY_LOCAL_MACHINE, // root key
lpRegPath, // 要访问的键的位置
0, //
KEY_READ, // 以查询的方式访问注册表
&hKey); // hKEY保存此函数所打开的键的句柄
if(lRet != ERROR_SUCCESS)
return false;
else
{
lRet = ::RegQueryValueEx(hKey, // 所打开的键的句柄
lpRegValue, // 要查询的键值名
NULL,
&dwRegType, // 查询数据的类型
lpRegBinData, // 保存所查询的数据
&dwDataSize); // 预设置的数据长度
if(lRet != ERROR_SUCCESS)
{
::RegCloseKey(hKey);
return false;
}
else
{
lpRegBinData = new BYTE[dwDataSize];
lpUSBKeyData = new char[dwDataSize];
memset(lpUSBKeyData, 0, dwDataSize);
lRet = ::RegQueryValueEx(hKey,
lpRegValue,
NULL,
&dwRegType,
lpRegBinData,
&dwDataSize);
if(lRet != ERROR_SUCCESS)
{
delete []lpRegBinData;
delete []lpUSBKeyData;
::RegCloseKey(hKey);
return false;
}
}
}
::RegCloseKey(hKey);
// 过滤二进制串中的无用信息(将0x0字符去除)
int j = 0;
for(DWORD i=0; i<dwDataSize; i )
{
if(lpRegBinData[i] != 0x0)
{
lpUSBKeyData[j] = lpRegBinData[i];
j ;
}
}
delete []lpRegBinData;

// I'm sorry: You can remove under line in your Code.
MessageBox(0, g_strCrnVerify, "CrnGetUSBDiskID", 0);
// I'm sorry: Only for [Zhuan Tie Bu Liu Ming]. - -#

// 截取lpUSBKeyData中的有用信息, 例: 7&100a16f&0
// \??\STORAGE#RemovableMedia#7&100a16f&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}
// 63 63 72 75 6E 2E 63 6F 6D
LPSTR lpPos1 = strstr(lpUSBKeyData, "#RemovableMedia#") 16;
LPSTR lpPos2 = strstr(lpUSBKeyData, "RM");
strncpy(lpUSBKeyData, lpPos1, int(lpPos2) - int(lpPos1));
lpUSBKeyData[int(lpPos2) - int(lpPos1) - 1] = 0x0;
strcpy(lpUSBKeyData, strupr(lpUSBKeyData));

// Disk Device(磁盘设备)的GUID
GUID guidUSB;
CLSIDFromString(L"{53f56307-b6bf-11d0-94f2-00a0c91efb8b}", &guidUSB);

//
HDEVINFO hUSB = SetupDiGetClassDevs(
&guidUSB, NULL, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if(hUSB == INVALID_HANDLE_VALUE)
{
delete []lpUSBKeyData;
return false;
}
//
int nDevIndex = 0;
bool bSuccess;
SP_DEVINFO_DATA DevData;
SP_DEVICE_INTERFACE_DATA DevIntData;
PSP_DEVICE_INTERFACE_DETAIL_DATA lpDevIntDetailData;
DWORD dwBytesReturned;

// 遍历磁盘设备
do
{
DevIntData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
bSuccess = SetupDiEnumDeviceInterfaces(hUSB, NULL, &guidUSB,
nDevIndex, &DevIntData) > 0;
// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=1021&d=fgp83l
if(bSuccess)
{
// 获取接口详细信息
DevData.cbSize = sizeof(SP_DEVINFO_DATA);
dwBytesReturned = 0;
SetupDiGetDeviceInterfaceDetailA(hUSB, &DevIntData,
NULL, 0, &dwBytesReturned, &DevData);
if(dwBytesReturned != 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
lpDevIntDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)
GlobalAlloc(GMEM_FIXED, dwBytesReturned);
lpDevIntDetailData->cbSize =
sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if(SetupDiGetDeviceInterfaceDetailA(hUSB, &DevIntData,
lpDevIntDetailData, dwBytesReturned, &dwBytesReturned, &DevData))
{
// 取得设备接口详细信息并根据转化后的路径在注册表中查询
LPSTR lpPathTemp = new char[strlen(lpDevIntDetailData->DevicePath) 256];
strcpy(lpRegPath, "SYSTEM\\CurrentControlSet\\Enum\\");
strcpy(lpPathTemp, lpDevIntDetailData->DevicePath);
lpPos1 = LPSTR(int(lpPathTemp) 4);
lpPos2 = LPSTR(int(strstr(lpPathTemp, "{")) - 1);
strncpy(lpPathTemp, lpPos1, int(lpPos2) - int(lpPos1));
lpPathTemp[int(lpPos2) - int(lpPos1)] = 0x0;
CrnReplaceString(lpPathTemp, '#', '\\');

strcat(lpRegPath, lpPathTemp);
//
if(RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
lpRegPath,
0,
KEY_READ,
&hKey) == ERROR_SUCCESS)
{
dwRegType = REG_SZ;
LPSTR lpRegSzData = NULL;
dwDataSize = 0;
lRet = ::RegQueryValueEx(hKey,
"ParentIdPrefix",
NULL,
&dwRegType,
(LPBYTE)lpRegSzData,
&dwDataSize);
if(lRet == ERROR_SUCCESS)
{
lpRegSzData = new char[dwDataSize];
lRet = ::RegQueryValueEx(hKey,
"ParentIdPrefix",
NULL,
&dwRegType,
(LPBYTE)lpRegSzData,
&dwDataSize);
if(lRet == ERROR_SUCCESS)
{
strcpy(lpRegSzData, strupr(lpRegSzData));
if(!strcmp(lpUSBKeyData, lpRegSzData))
{
// 经比对,找到要查询的磁盘设备
strcpy(lpPathTemp, LPSTR(int(strstr(
lpDevIntDetailData->DevicePath, "#")) 1));
lpPos1 = LPSTR(int(strstr(lpPathTemp, "#")) 1);
lpPos2 = LPSTR(int(strstr(lpPathTemp, "#{")));
strncpy(lpPathTemp, lpPos1, int(lpPos2) - int(lpPos1));
lpPathTemp[int(lpPos2) - int(lpPos1)] = 0x0;

// 获取最终的磁盘序列号
CrnReplaceString(lpPathTemp, '&', 0x00);
if(lpPID)
strncpy(lpPID, strupr(lpPathTemp), 32);
//
delete []lpRegSzData;
delete []lpPathTemp;
GlobalFree(lpDevIntDetailData);
::RegCloseKey(hKey);
break;
}
}
delete []lpRegSzData;
}
::RegCloseKey(hKey);
}
delete []lpPathTemp;
nDevIndex ;
}
GlobalFree(lpDevIntDetailData);
}
}
}while(bSuccess);

SetupDiDestroyDeviceInfoList(hUSB);

delete []lpUSBKeyData;

return true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char lpPID[32];
if(CrnGetUSBDiskID('L', lpPID))
ShowMessage(lpPID);
}
2010-1-20 22:38
0
雪    币: 2093
活跃值: (3469)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
一下是我给一个USB设备写的通过GUID来获得其HANDLE的程序,其中Interface_Guid就是这个硬件的驱动中的定义的GUID

// {B5E3D611-EEEF-4471-9D42-CF6BB6E950DE}
static const GUID Interface_Guid =
{ 0xb5e3d611, 0xeeef, 0x4471, { 0x9d, 0x42, 0xcf, 0x6b, 0xb6, 0xe9, 0x50, 0xde } };

HANDLE ListDev()
{
HDEVINFO hDevInfo;
DWORD dwBytesNeeded = 0;
SP_DEVICE_INTERFACE_DETAIL_DATA_A InterfaceInfoDetailData;
PSP_DEVICE_INTERFACE_DETAIL_DATA_A pDetailInfo;
SP_DEVICE_INTERFACE_DATA InterfaceData;
HANDLE hToy;

// Create a HDEVINFO with all present devices.
hDevInfo = SetupDiGetClassDevsA(&Interface_Guid,
0, // Enumerator
0,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

InterfaceInfoDetailData.cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A);
InterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

SetupDiEnumDeviceInterfaces(hDevInfo,
NULL,
&Interface_Guid,
0,
&InterfaceData);
SetupDiGetDeviceInterfaceDetailA(hDevInfo,
&InterfaceData,
NULL,
0,
&dwBytesNeeded,
NULL);

if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
pDetailInfo = (PSP_DEVICE_INTERFACE_DETAIL_DATA_A)VirtualAlloc(NULL,
dwBytesNeeded + sizeof(DWORD) + 2,
MEM_COMMIT,
PAGE_EXECUTE_READWRITE) ;
pDetailInfo->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A);
printf("%d\n",pDetailInfo->cbSize);
SetupDiGetDeviceInterfaceDetailA(hDevInfo,
&InterfaceData,
pDetailInfo,
dwBytesNeeded + sizeof(DWORD) + 2,
NULL,
NULL);
printf("%s\n",pDetailInfo->DevicePath);

hToy = CreateFileA(pDetailInfo->DevicePath,
GENERIC_ALL,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

VirtualFree(pDetailInfo,0,MEM_RELEASE);
}
else
hToy = INVALID_HANDLE_VALUE;

//  Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);

return hToy;
}
2010-1-20 22:45
0
雪    币: 474
活跃值: (96)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
学习啊,楼主厉害啊@
2010-1-20 23:32
0
雪    币: 2093
活跃值: (3469)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
顶一下,高手出来交流一下哦,,,
2010-1-21 20:07
0
雪    币: 390
活跃值: (15)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
强悍,看不懂!
2010-1-21 21:08
0
雪    币: 218
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
BOOL __stdcall SetupDiEnumDeviceInterfaces(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, const GUID *InterfaceClassGuid, DWORD MemberIndex, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
{
  int v5; // eax@1
  BOOL result; // eax@2
  int v7; // [sp-4h] [bp-10h]@1
  void *v8; // [sp+10h] [bp+4h]@1

  HIWORD(v5) = HIWORD(v8);
  LOWORD(v5) = 0;
  dword_100172FC = v5;
  if ( sub_10001E3F(dword_100172FC) )
  {
    result = dword_10018068(v7, DeviceInfoSet, DeviceInfoData, InterfaceClassGuid, MemberIndex, DeviceInterfaceData);
  }
  else
  {
    if ( MemberIndex )
    {
      result = 0;
    }
    else
    {
      dword_1001197C ^= 1u;
      result = dword_1001197C;
    }
  }
  return result;
}
bool __cdecl sub_10001E3F(DWORD a1)
{
  unsigned int v1; // ebp@1
  bool result; // eax@2
  DWORD v3; // eax@3
  HMODULE v4; // ebx@3
  unsigned int v5; // esi@3

  HIWORD(v1) = HIWORD(a1);
  LOWORD(v1) = 0;
  if ( v1 > 0x30000000 )
    goto LABEL_16;
  v3 = a1;
  v5 = 0;
  v4 = (HMODULE)v1;
  do
  {
    if ( v1 <= v5 )
      break;
    v3 = GetModuleFileNameA(v4, &Filename, 0x3E8u);
    if ( v3 )
      break;
    v5 += 65536;
    v4 -= 16384;
  }
  while ( v5 < 0x989680 );
  if ( v5 >= 0x10000000 )
  {
LABEL_16:
    result = 1;
  }
  else
  {
    while ( *(&Filename + v3) != 92 )
    {
      if ( !v3 )
      {
        if ( Filename != 92 )
          goto LABEL_13;
        break;
      }
      --v3;
    }
    ++v3;
LABEL_13:
    result = sub_10001DFE(&Filename + v3, "tssd") != 0;
  }
  return result;
}
BOOL __stdcall SetupDiGetDeviceInterfaceDetailA(HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, PSP_DEVICE_INTERFACE_DETAIL_DATA_A DeviceInterfaceDetailData, DWORD DeviceInterfaceDetailDataSize, PDWORD RequiredSize, PSP_DEVINFO_DATA DeviceInfoData)
{
  int v6; // eax@1
  BOOL result; // eax@2
  int v8; // [sp-4h] [bp-10h]@1
  void *v9; // [sp+10h] [bp+4h]@1

  HIWORD(v6) = HIWORD(v9);
  LOWORD(v6) = 0;
  dword_100172FC = v6;
  if ( sub_10001E3F(dword_100172FC) )
  {
    result = dword_100180F8(
               v8,
               DeviceInfoSet,
               DeviceInterfaceData,
               DeviceInterfaceDetailData,
               DeviceInterfaceDetailDataSize,
               RequiredSize,
               DeviceInfoData);
  }
  else
  {
    if ( DeviceInterfaceDetailData && DeviceInterfaceDetailDataSize )
    {
      memcpy(
        DeviceInterfaceDetailData->DevicePath,
        "\\\\?\\usb#vid_0471&pid_485d#5&2ad6af9d&0&5#{171638f7-1ead-4873-ba98-c966abcf0142}",
        0x50u);
      result = 1;
    }
    else
    {
      if ( RequiredSize )
        *RequiredSize = 84;
      result = 1;
    }
  }
  return result;
}
这是我用IDA弄出来的setupapi.dll中的你的第一、二步中的源代码,你可以调试对比一下看看。
2010-1-22 07:53
0
雪    币: 221
活跃值: (2326)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
顶一下.好像编译不了?
2010-1-22 13:19
0
雪    币: 86
活跃值: (1188)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
是你不会编译吧
2010-1-22 22:32
0
雪    币: 2093
活跃值: (3469)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
将setupapi的代码上传,将zengtm兄完善一下。我qq是:1016104046,希望能多交流。
上传的附件:
2010-1-23 12:35
0
雪    币: 2093
活跃值: (3469)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
再完善一下,估计就能用了
2010-1-23 22:27
0
雪    币: 2093
活跃值: (3469)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
讨论一下吧,如何实现函数的重定向,就是#pragma comment(linker, "/EXPORT:SetupDiEnumDeviceInterfaces=_AheadLib_SetupDiEnumDeviceInterfaces,@288")这个导出函数,如何定向到typedef BOOL (__stdcall WINAPI*pSetupDiEnumDeviceInterfaces)(HDEVINFO DeviceInfoSet,
PSP_DEVINFO_DATA DeviceInfoData,
DWORD InterfaceClassGuid,
DWORD MemberIndex,
PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData);

}自己写的这个函数
2010-1-27 22:19
0
雪    币: 221
活跃值: (2326)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
模拟代码在哪里?
2010-1-28 12:45
0
雪    币: 2093
活跃值: (3469)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
#define EXTERNC extern "C"
#define NAKED __declspec(naked)
#define EXPORT __declspec(dllexport)

#define ALCPP EXPORT NAKED
#define ALSTD EXTERNC EXPORT NAKED void __stdcall
#define ALCFAST EXTERNC EXPORT NAKED void __fastcall
#define ALCDECL EXTERNC NAKED void __cdecl
#pragma comment(linker, "/EXPORT:SetupDiEnumDeviceInterfaces=_AheadLib_SetupDiEnumDeviceInterfaces,@288")
原来指向下面这个函数
ALCDECL AheadLib_SetupDiEnumDeviceInterfaces(void)
{

        // 保存返回地址
        __asm POP m_dwReturn[287 * TYPE long];
     
        // 调用原始函数
        

       GetAddress("SetupDiEnumDeviceInterfaces")();

        // 转跳到返回地址
        __asm JMP m_dwReturn[287 * TYPE long];
}
现在要让他执行下面这个函数
typedef BOOL (__stdcall WINAPI*pSetupDiEnumDeviceInterfaces)(HDEVINFO DeviceInfoSet,
PSP_DEVINFO_DATA DeviceInfoData,
DWORD InterfaceClassGuid,
DWORD MemberIndex,
PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData);
{
}
这一句要怎么改:SetupDiEnumDeviceInterfaces=_AheadLib_SetupDiEnumDeviceInterfaces
2010-1-28 14:21
0
雪    币: 208
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
太高深了!还需要多努力
2010-1-31 08:54
0
雪    币: 215
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
看到一些似乎熟悉的函数名,我想起了那个06年的冬天,和没日没夜的统计分析,那份最原始的setupapi.dll源代码终究找不到了,这些对于我也只能成为一个回忆而已.
2010-1-31 12:40
0
雪    币: 229
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
你搜索一下微软的一个HOOK 引擎就知道有些事比你想像中简单
2010-2-5 00:23
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
楼上的如果能做一个模拟狗出来就好啦?
2010-7-16 15:58
0
雪    币: 229
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
只完成了S4Enum,S4Open,S4contron,别的未尝试,老早的东西了。对于这种狗,个人建议还是带只狗来完成达到目地。
上传的附件:
2010-7-17 19:20
0
雪    币: 86
活跃值: (1188)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
牛人出现了
2010-7-20 00:21
0
游客
登录 | 注册 方可回帖
返回
//