CALL DWORD PTR DS:[> 如果找到软件与验证文件的码在什么地方?(程序里的码在什么地方)

时间:2022-03-08 03:09:25
10006FA1  |.  6A 00                   PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
10006FA3  |.  68 18730110             PUSH srf.10017318                        ; |err没找到正确的文件编号referencecount
10006FA8  |.  68 1C730110             PUSH srf.1001731C                        ; |没找到正确的文件编号referencecount
10006FAD  |.  6A 00                   PUSH 0                                   ; |hOwner = NULL
10006FAF  |.  FF15 DC410110           CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
10006FB5  |.  C785 9CFEFFFF 00000000  MOV DWORD PTR SS:[EBP-164],0
10006FBF  |.  33C0                    XOR EAX,EAX
10006FC1  |.  E9 93000000             JMP srf.10007059
10006FC6  |>  8D4D AC                 LEA ECX,DWORD PTR SS:[EBP-54]
10006FC9  |.  51                      PUSH ECX                                 ; /pBufSize
10006FCA  |.  8D55 B0                 LEA EDX,DWORD PTR SS:[EBP-50]            ; |
10006FCD  |.  52                      PUSH EDX                                 ; |Buffer
10006FCE  |.  8D85 A0FEFFFF           LEA EAX,DWORD PTR SS:[EBP-160]           ; |
10006FD4  |.  50                      PUSH EAX                                 ; |pValueType
10006FD5  |.  6A 00                   PUSH 0                                   ; |Reserved = NULL
10006FD7  |.  68 24730110             PUSH srf.10017324                        ; |referencecount




就在红色的部分,弹出 "没找到正确的文件编号" 程序就用不起了. 怎么找到输入内的编号存储的地方?

37 个解决方案

#1


网上跟踪,应该有个跳转,可以跳过这个MessageBox

#2


10006F86  |.  50                      PUSH EAX                                 ; |Subkey
10006F87  |.  68 02000080             PUSH 80000002                            ; |hKey = HKEY_LOCAL_MACHINE
10006F8C  |.  FF15 04400110           CALL DWORD PTR DS:[<&ADVAPI32.RegOpenKey>; \RegOpenKeyExA
10006F92  |.  8985 A8FEFFFF           MOV DWORD PTR SS:[EBP-158],EAX
10006F98  |.  83BD A8FEFFFF 00        CMP DWORD PTR SS:[EBP-158],0
10006F9F  |.  74 25                   JE SHORT srf.10006FC6
10006FA1  |.  6A 00                   PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
10006FA3  |.  68 18730110             PUSH srf.10017318                        ; |err没找到正确的文件编号referencecount
10006FA8  |.  68 1C730110             PUSH srf.1001731C                        ; |没找到正确的文件编号referencecount
10006FAD  |.  6A 00                   PUSH 0                                   ; |hOwner = NULL
10006FAF  |.  FF15 DC410110           CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
10006FB5  |.  C785 9CFEFFFF 00000000  MOV DWORD PTR SS:[EBP-164],0
10006FBF  |.  33C0                    XOR EAX,EAX
10006FC1  |.  E9 93000000             JMP srf.10007059
10006FC6  |>  8D4D AC                 LEA ECX,DWORD PTR SS:[EBP-54]
10006FC9  |.  51                      PUSH ECX                                 ; /pBufSize
10006FCA  |.  8D55 B0                 LEA EDX,DWORD PTR SS:[EBP-50]            ; |
10006FCD  |.  52                      PUSH EDX                                 ; |Buffer
10006FCE  |.  8D85 A0FEFFFF           LEA EAX,DWORD PTR SS:[EBP-160]           ; |
10006FD4  |.  50                      PUSH EAX                                 ; |pValueType
10006FD5  |.  6A 00                   PUSH 0                                   ; |Reserved = NULL

刚刚前面的少复制了一节

#3


多贴点代码

再往上看代码,肯定有一个条件跳转指令(jz/jnz....)调到10006FC6  |>  8D4D AC                LEA ECX,DWORD PTR SS:[EBP-54] 
,那个指令附近有一个Call 这个函数调用就是程序获取编号的过程,也许不是函数,获取过程就在上面 一般是这样的

再跟踪那个获取过程就知道了 

#4


在10006F8C 下断点,看RegOpenKey的参数(看堆栈),文件编号就保存在函数打开的注册表路径里面

10006F86  |.  50                      PUSH EAX                                ; |Subkey 
10006F87  |.  68 02000080            PUSH 80000002                            ; |hKey = HKEY_LOCAL_MACHINE 
10006F8C  |.  FF15 04400110          CALL DWORD PTR DS:[ <&ADVAPI32.RegOpenKey>; \RegOpenKeyExA 


这一句就是关键的跳转10006F9F  |.  74 25                  JE SHORT srf.10006FC6 

#5


耶稣说:回帖得永生,何况还有分...

#6


上面的是在 ollyDBG 复制的结果

与W32Dasm 对应如下
*Reference to :ADVAPI32.RegOpenKeyExA. Ord:0172h

:10006F86 50                     PUSH EAX                 
:10006F87 6802000080             PUSH 80000002              
:10006F8C FF1504400110           CALL DWORD PTR [10014004]
:10006F92 8985A8FEFFFF           MOV DWORD PTR [EBP+FFFFFFA8],EAX
:10006F98 83BDA8FEFFFF00         CMP DWORD PTR [EBP+FFFFFFA8],00000000
:10006F9F 7425                   JE 10006FC6
:10006FA1 6A00                   PUSH 00000000  

*Possible StringData Ref from Data Obj->"err"

:10006FA3 6818730110             PUSH 10017318

*Possible StringData Ref from Data Obj->"没找到正确的文件编号"

:10006FA8 681C730110             PUSH 1001731C
:10006FAD 6A00                   PUSH 00000000

*Reference to :User32.MessageBoxA. Ord:01BEh

:10006FAF FF15 DC410110          CALL DWORD PTR [100141DC]
:10006FB5 C785 9CFEFFFF 00000000 MOV DWORD PTR [EBP+FF00FFFF9C],00000
:10006FBF 33C0                   XOR EAX,EAX
:10006FC1 E993000000             JMP 10007059


*referenced by a (U)nconditional or (C)ondition Jump at Address:
|100006F9F(C)
|

:10006FC6 8D4DAC                 LEA ECX,DWORD PTR [EBP-54]
:10006FC9 51                     PUSH ECX            
:10006FCA 8D55B0                 LEA EDX,DWORD PTR [EBP-50] 
:10006FCD 52                     PUSH EDX          
:10006FCE 8D85A0FEFFFF           LEA EAX,DWORD PTR [EBP+FFFFFEA0] 
:10006FD4 50                     PUSH EAX                
:10006FD5 6A 00                  PUSH 00000000            

#7


引用 3 楼 killbug2004 的回复:
多贴点代码

再往上看代码,肯定有一个条件跳转指令(jz/jnz....)调到10006FC6  |>  8D4D AC                LEA ECX,DWORD PTR SS:[EBP-54]
,那个指令附近有一个Call 这个函数调用就是程序获取编号的过程,也许不是函数,获取过程就在上面 一般是这样的

再跟踪那个获取过程就知道了



注册表里到是知道它访问的什么地方,也试着把注册那个值改了,软件同样不能运行(前提:已经有正确的文件编号).现在要想达到的目前是如果把软件里的那个注册里的值放在软件的什么地方给找出来,

我推测应该是把一个码写在了软件里,软件运行的时候它就用写在里面的码与注册表里的码对比.

#8


已经查到是访问的这里
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses\{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\##?#USBSTOR#Disk&MA2OA72A5&2d04cccb&0&0&&Rev_PMAP#9TSJ982385F&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\Control]
"ReferenceCount"=dword:00000001

Control键一删除软件就无法使用

#9


10006F9F  |.  74 25                  JE SHORT srf.10006FC6 
修改为
10006F9F  |.  74 25                  Jmp SHORT srf.10006FC6 

#10


破解是容易的,应该是破解了,现在的要做到的是,把软件里的固定注册码给修改了,应该是这个值
##?#USBSTOR#Disk&Ven_Suning&Prod_OnlyDisk&Rev_PMAP#90941400021F&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}

90941400021F 这个好像是一个U盘的序列号

#11


不知道 90941400021F 与"91;751678;;M" 有没有关系

#12


幸好还能看懂,前面的都说了,顶。

#13


修改或者不等都是可以继续使用软件,目前也已经做到.

我的目的是要把这个软件里存储验证码的那个地方找到,并修改里面的内容

在 CMP   JE上方有一段

10006F8C FF1504400110          CALL DWORD PTR [10014004] 

可10014004并没有找到 ,

#14


*Possible StringData Ref from Data Obj->"err" 

:10006FA3 6818730110            PUSH 10017318 

*Possible StringData Ref from Data Obj->"没找到正确的文件编号" 

对话框一弹出软件就运行不下去,我是否是在这一段的前面看代码?,再分析?

#15


w32Dasa分析如下
10006F8C FF1504400110 CALL DWORD PTR [10014004]
OD分析如下
10006F8C  |.  FF15 04400110          CALL DWORD PTR DS:[ <&ADVAPI32.RegOpenKey>]

这一句难道是读取注册表的信息了? 

那么接下来
10006F92  |.  8985 A8FEFFFF          MOV DWORD PTR SS:[EBP-158],EAX 
10006F98  |.  83BD A8FEFFFF 00        CMP DWORD PTR SS:[EBP-158],0 
10006F9F  |.  74 25                  JE SHORT srf.10006FC6 

10006F92  |.  8985 A8FEFFFF          MOV DWORD PTR SS:[EBP-158],EAX 

这句是把输入里写的码取得来? 

CMP DWORD PTR SS:[EBP-158],0 

然后再把取得的注册表信息与软件固定好的码对比?

是这样的吗?

#16


引用 9 楼 qingye2008 的回复:
10006F9F  |.  74 25                  JE SHORT srf.10006FC6
修改为
10006F9F  |.  74 25                  Jmp SHORT srf.10006FC6

我也感觉是这么破解

#17


引用 15 楼 xscansou 的回复:
w32Dasa分析如下
10006F8C FF1504400110 CALL DWORD PTR [10014004]
OD分析如下
10006F8C  |.  FF15 04400110          CALL DWORD PTR DS:[ <&ADVAPI32.RegOpenKey>]

这一句难道是读取注册表的信息了?

那么接下来
10006F92  |.  8985 A8FEFFFF          MOV DWORD PTR SS:[EBP-158],EAX
10006F98  |.  83BD A8FEFFFF 00        CMP DWORD PTR SS:[EBP-158],0
10006F9F  |.  74 25                  JE SHORT srf.10006FC6

10006F92  |.  8985 A8FEFFFF          MOV DWORD PTR SS:[EBP-158],EAX

这句是把输入里写的码取得来?

CMP DWORD PTR SS:[EBP-158],0

然后再把取得的注册表信息与软件固定好的码对比?

是这样的吗?


不出意外是这样的。你自己跟踪下看看,注意寄存器,就好了

#18


引用 16 楼 tr0j4n 的回复:
引用 9 楼 qingye2008 的回复:
10006F9F  |.  74 25                  JE SHORT srf.10006FC6
修改为
10006F9F  |.  74 25                  Jmp SHORT srf.10006FC6

我也感觉是这么破解




破解到是容易,


向上的代码如下
10006F5C    8D85 08FCFFFF          lea eax,dword ptr ss:[ebp-3F8]
10006F62    50                     push eax
10006F63    8D8D ACFEFFFF          lea ecx,dword ptr ss:[ebp-154]
10006F69    51                     push ecx
10006F6A    E8 C1180000            call srf.10008830
10006F6F    83C4 08                add esp,8
10006F72    8D95 08FDFFFF          lea edx,dword ptr ss:[ebp-2F8]
10006F78    52                     push edx                              
10006F79    68 19000200            push 20019                            
10006F7E    6A 00                  push 0                                
10006F80    8D85 ACFEFFFF          lea eax,dword ptr ss:[ebp-154]        
10006F86    50                     push eax                              
10006F87    68 02000080            push 80000002 
 

10006F8C  |.  FF15 04400110          CALL DWORD PTR DS:[ <&ADVAPI32.RegOpenKey>] 
10006F92  |.  8985 A8FEFFFF          MOV DWORD PTR SS:[EBP-158],EAX 
10006F98  |.  83BD A8FEFFFF 00        CMP DWORD PTR SS:[EBP-158],0 
10006F9F  |.  74 25                  JE SHORT srf.10006FC6 


是找出EAX的内容吗?

push 80000002
push 20019
是什么意思呢?

是不是红色代码部分在给EAX写内定呢?

OD没用几天还不知道怎么跟踪

MOV DWORD PTR SS:[EBP-158],EAX 中的EAX值,不好意思啦.,

#19


10006F8C  |.  FF15 04400110    CALL DWORD PTR DS:[ <&ADVAPI32.RegOpenKey>] 打开注册表键
10006F92  |.  8985 A8FEFFFF    MOV DWORD PTR SS:[EBP-158],EAX ;返回值保存到局部变量
10006F98  |.  83BD A8FEFFFF 00 CMP DWORD PTR SS:[EBP-158],0 ;判断是否打开成功
10006F9F  |.  74 25            JE SHORT srf.10006FC6 ;打开成功就跳到10006FC6处执行

这里没有读取什么码,只是一个简单的判断
LONG lResult;
lResult = RegOpenKey(hKey, lpSubKey, phkResult);
if(lResult != ERROR_SUCCESS)
{
  MessageBox(NULL, TEXT("没找到正确的文件编"), TEXT("err没找到正确的文件编"), MB_OK | MB_APPLMODAL);
  return FALSE;
}
;打开成功
......
关键代码在后面,自己慢慢跟,这只是这个关键函数开始的几行


##?#USBSTOR#Disk&Ven_Suning&Prod_OnlyDisk&Rev_PMAP#90941400021F&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} 这个字符串是插入USB设备后系统自动根据驱动生成的DevicePath供应用层
使用的,开来后面还要读取USB上面的数据或者别的方式来进行校验,如果是破解带狗的软件,再慢慢跟踪数据通讯吧


#20


不是狗,就是一个普通的U盘,只不过这个U盘有序列号

我试着把这个#?#USBSTOR#Disk&Ven_Suning&Prod_OnlyDisk&Rev_PMAP#90941400021F&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}
修改一个字符,软件就用不起了.

#21


#?#USBSTOR#Disk&Ven_Suning&Prod_OnlyDisk&Rev_PMAP#90941400021F&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} 

插入USB设备后系统自动根据驱动生成的DevicePath供应用层使用的 


这个每个系统会不会不同呢?如都是XP会不会是不一样的?

谢谢CSDN上所有热心肠的朋友!!!!!!

#22


这个的话,可能会不同

#23


LONG lResult; 
lResult = RegOpenKey(hKey, lpSubKey, phkResult); 
if(lResult != ERROR_SUCCESS) 

  MessageBox(NULL, TEXT("没找到正确的文件编"), TEXT("err没找到正确的文件编"), MB_OK | MB_APPLMODAL); 
  return FALSE; 
}

这个可以肯定的是在访问注册表的信息

 关键就在找

RegOpenKey(hKey, lpSubKey


hKey, lpSubKey

在什么地方赋的值 

hKey, lpSubKey 是什么到可以到出来.

大概应该是这样的一个东东

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses\{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\##?#USBSTOR#Disk&Ven_Netac&Prod_OnlyDisk&Rev_PMAP#90942352349F&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\Control]
"ReferenceCount"=dword:00000001

#24


"ReferenceCount"=dword:00000001
U盘拔出是
"ReferenceCount"=dword:00000000

换其它U盘估计软件已经不判断 这一段了,
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses\{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\ ##?#USBSTOR#Disk&Ven_Netac&Prod_OnlyDisk&Rev_PMAP#90942352349F&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\Control] 

90942352349F 我试个两个U盘 只有这里不一样.其它的都是一样的,同一个厂家的

意思就是说,这个软件不插入U盘用不起,如果你不是插入的这个软件配的那个U盘也用不起.

即,一个软件一个U盘配起,不能共用的,或者把两个不同的U盘上的软件相互COPY也是不能用的

注:不是狗,是普通U盘,当然这些U盘都是有序列号的.



#25


10006F98  |.  83BD A8FEFFFF 00        CMP DWORD PTR SS:[EBP-158],0 
10006F9F  |.  74 25                  JE SHORT srf.10006FC6 
看这两句应该就明白了
如果是在不明白,就用IDA打开,然后按F5,把汇编转化成C语言来看

#26


CMP DWORD PTR SS:[EBP-158],0
跳转来自EBP-158,要一步一步回缩追踪,你既然能够看到JZ那句代码,在文件中找到相对应的机器码,把74改成JMP对应的机器码就是了嘛,何必再麻烦

#27


必须得把软件注册码写进去

#28


很显然软件会枚举特定的U盘,也就是USB设备,然后打开USB设备GUID对应注册表项,获取设备数量
软件与USB设备进行了绑定,要找到识别码,绑定方式要看后面的代码,关键代码在后面,在后面的与U盘通讯的关键部分,这里只是一个开头


那个字符串是动态生成的,每次可能不一样,显然这个软件每次根据设备GUID自动枚举出来的

#29


后面的与U盘通讯的关键部分 有什么特征,有什么标志性的确语句?

#30


引用 28 楼 killbug2004 的回复:
很显然软件会枚举特定的U盘,也就是USB设备,然后打开USB设备GUID对应注册表项,获取设备数量
软件与USB设备进行了绑定,要找到识别码,绑定方式要看后面的代码,关键代码在后面,在后面的与U盘通讯的关键部分,这里只是一个开头


那个字符串是动态生成的,每次可能不一样,显然这个软件每次根据设备GUID自动枚举出来的



你的意思是这个软件是每做一个就要先把U盘的GUID读出来再写到软件里

还是它是通过程序的算法取得这个GUID?

#31


我比较了两个软件,用w32Dasm查出的字符串

只有这点不一样,


91;751678;;M
对应的注册表信息
##?#USBSTOR#Disk&Ven_Netac&Prod_OnlyDisk&Rev_PMAP#90941400021F&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}


91;051678:>9
对应的注册表信息
##?#USBSTOR#Disk&Ven_Netac&Prod_OnlyDisk&Rev_PMAP#909314000342&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}

#32


GUID对于同一种设备是一样的,软件可以利用GUID知道系统有没有接入这种设备,软件和唯一U盘绑定,它们之间肯定有一种匹配校验方式,这个校验用到的数据肯定保存在U盘上,所以我一直说往下看代码,不过看来对你而言很难 呵呵

#33


嗯,是的,是很难,上学的时候学过一点点汇编,一直用MFC在写程序,所以汇编才用一个月.

这个软件没有那么复杂,因为我了解了一些这个软件具体开发过程.

不可能加密技术有多深.

#34


现在到是已经破解了可以使用

如果我再想把软件通过自己的方法绑定到U盘上,应该如何下手?

#35


引用 32 楼 killbug2004 的回复:
GUID对于同一种设备是一样的,软件可以利用GUID知道系统有没有接入这种设备,软件和唯一U盘绑定,它们之间肯定有一种匹配校验方式,这个校验用到的数据肯定保存在U盘上,所以我一直说往下看代码,不过看来对你而言很难 呵呵


U盘很简单,普通U盘,而且可以随便格式化,只要把U盘上的几个文件重新copy到上面就可以使用.

"这个校验用到的数据肯定保存在U盘上" 是这样子的,这个校验数据应该不是在U盘上.

我试着把 


[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses\{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\##?#USBSTOR#Disk&Ven_Netac&Prod_OnlyDisk&Rev_PMAP#90942352349F&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\Control] 
下的
ReferenceCount值改成
ReferenceCount=1,软件就不会出现那个对话框了.

注:ReferenceCount U盘拔下,值为0

U盘插上,值为1,如果手动改成 0的话,软件就会弹出那个对话框






#36


破解的问题去看雪论坛问问比较好些.
那里不少高人专么搞这种东西的.

#37


其实上已经分析完毕,特别要感谢的是 killbug2004  相当的有热心,再次感谢,感谢.结了.

#1


网上跟踪,应该有个跳转,可以跳过这个MessageBox

#2


10006F86  |.  50                      PUSH EAX                                 ; |Subkey
10006F87  |.  68 02000080             PUSH 80000002                            ; |hKey = HKEY_LOCAL_MACHINE
10006F8C  |.  FF15 04400110           CALL DWORD PTR DS:[<&ADVAPI32.RegOpenKey>; \RegOpenKeyExA
10006F92  |.  8985 A8FEFFFF           MOV DWORD PTR SS:[EBP-158],EAX
10006F98  |.  83BD A8FEFFFF 00        CMP DWORD PTR SS:[EBP-158],0
10006F9F  |.  74 25                   JE SHORT srf.10006FC6
10006FA1  |.  6A 00                   PUSH 0                                   ; /Style = MB_OK|MB_APPLMODAL
10006FA3  |.  68 18730110             PUSH srf.10017318                        ; |err没找到正确的文件编号referencecount
10006FA8  |.  68 1C730110             PUSH srf.1001731C                        ; |没找到正确的文件编号referencecount
10006FAD  |.  6A 00                   PUSH 0                                   ; |hOwner = NULL
10006FAF  |.  FF15 DC410110           CALL DWORD PTR DS:[<&USER32.MessageBoxA>>; \MessageBoxA
10006FB5  |.  C785 9CFEFFFF 00000000  MOV DWORD PTR SS:[EBP-164],0
10006FBF  |.  33C0                    XOR EAX,EAX
10006FC1  |.  E9 93000000             JMP srf.10007059
10006FC6  |>  8D4D AC                 LEA ECX,DWORD PTR SS:[EBP-54]
10006FC9  |.  51                      PUSH ECX                                 ; /pBufSize
10006FCA  |.  8D55 B0                 LEA EDX,DWORD PTR SS:[EBP-50]            ; |
10006FCD  |.  52                      PUSH EDX                                 ; |Buffer
10006FCE  |.  8D85 A0FEFFFF           LEA EAX,DWORD PTR SS:[EBP-160]           ; |
10006FD4  |.  50                      PUSH EAX                                 ; |pValueType
10006FD5  |.  6A 00                   PUSH 0                                   ; |Reserved = NULL

刚刚前面的少复制了一节

#3


多贴点代码

再往上看代码,肯定有一个条件跳转指令(jz/jnz....)调到10006FC6  |>  8D4D AC                LEA ECX,DWORD PTR SS:[EBP-54] 
,那个指令附近有一个Call 这个函数调用就是程序获取编号的过程,也许不是函数,获取过程就在上面 一般是这样的

再跟踪那个获取过程就知道了 

#4


在10006F8C 下断点,看RegOpenKey的参数(看堆栈),文件编号就保存在函数打开的注册表路径里面

10006F86  |.  50                      PUSH EAX                                ; |Subkey 
10006F87  |.  68 02000080            PUSH 80000002                            ; |hKey = HKEY_LOCAL_MACHINE 
10006F8C  |.  FF15 04400110          CALL DWORD PTR DS:[ <&ADVAPI32.RegOpenKey>; \RegOpenKeyExA 


这一句就是关键的跳转10006F9F  |.  74 25                  JE SHORT srf.10006FC6 

#5


耶稣说:回帖得永生,何况还有分...

#6


上面的是在 ollyDBG 复制的结果

与W32Dasm 对应如下
*Reference to :ADVAPI32.RegOpenKeyExA. Ord:0172h

:10006F86 50                     PUSH EAX                 
:10006F87 6802000080             PUSH 80000002              
:10006F8C FF1504400110           CALL DWORD PTR [10014004]
:10006F92 8985A8FEFFFF           MOV DWORD PTR [EBP+FFFFFFA8],EAX
:10006F98 83BDA8FEFFFF00         CMP DWORD PTR [EBP+FFFFFFA8],00000000
:10006F9F 7425                   JE 10006FC6
:10006FA1 6A00                   PUSH 00000000  

*Possible StringData Ref from Data Obj->"err"

:10006FA3 6818730110             PUSH 10017318

*Possible StringData Ref from Data Obj->"没找到正确的文件编号"

:10006FA8 681C730110             PUSH 1001731C
:10006FAD 6A00                   PUSH 00000000

*Reference to :User32.MessageBoxA. Ord:01BEh

:10006FAF FF15 DC410110          CALL DWORD PTR [100141DC]
:10006FB5 C785 9CFEFFFF 00000000 MOV DWORD PTR [EBP+FF00FFFF9C],00000
:10006FBF 33C0                   XOR EAX,EAX
:10006FC1 E993000000             JMP 10007059


*referenced by a (U)nconditional or (C)ondition Jump at Address:
|100006F9F(C)
|

:10006FC6 8D4DAC                 LEA ECX,DWORD PTR [EBP-54]
:10006FC9 51                     PUSH ECX            
:10006FCA 8D55B0                 LEA EDX,DWORD PTR [EBP-50] 
:10006FCD 52                     PUSH EDX          
:10006FCE 8D85A0FEFFFF           LEA EAX,DWORD PTR [EBP+FFFFFEA0] 
:10006FD4 50                     PUSH EAX                
:10006FD5 6A 00                  PUSH 00000000            

#7


引用 3 楼 killbug2004 的回复:
多贴点代码

再往上看代码,肯定有一个条件跳转指令(jz/jnz....)调到10006FC6  |>  8D4D AC                LEA ECX,DWORD PTR SS:[EBP-54]
,那个指令附近有一个Call 这个函数调用就是程序获取编号的过程,也许不是函数,获取过程就在上面 一般是这样的

再跟踪那个获取过程就知道了



注册表里到是知道它访问的什么地方,也试着把注册那个值改了,软件同样不能运行(前提:已经有正确的文件编号).现在要想达到的目前是如果把软件里的那个注册里的值放在软件的什么地方给找出来,

我推测应该是把一个码写在了软件里,软件运行的时候它就用写在里面的码与注册表里的码对比.

#8


已经查到是访问的这里
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses\{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\##?#USBSTOR#Disk&MA2OA72A5&2d04cccb&0&0&&Rev_PMAP#9TSJ982385F&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\Control]
"ReferenceCount"=dword:00000001

Control键一删除软件就无法使用

#9


10006F9F  |.  74 25                  JE SHORT srf.10006FC6 
修改为
10006F9F  |.  74 25                  Jmp SHORT srf.10006FC6 

#10


破解是容易的,应该是破解了,现在的要做到的是,把软件里的固定注册码给修改了,应该是这个值
##?#USBSTOR#Disk&Ven_Suning&Prod_OnlyDisk&Rev_PMAP#90941400021F&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}

90941400021F 这个好像是一个U盘的序列号

#11


不知道 90941400021F 与"91;751678;;M" 有没有关系

#12


幸好还能看懂,前面的都说了,顶。

#13


修改或者不等都是可以继续使用软件,目前也已经做到.

我的目的是要把这个软件里存储验证码的那个地方找到,并修改里面的内容

在 CMP   JE上方有一段

10006F8C FF1504400110          CALL DWORD PTR [10014004] 

可10014004并没有找到 ,

#14


*Possible StringData Ref from Data Obj->"err" 

:10006FA3 6818730110            PUSH 10017318 

*Possible StringData Ref from Data Obj->"没找到正确的文件编号" 

对话框一弹出软件就运行不下去,我是否是在这一段的前面看代码?,再分析?

#15


w32Dasa分析如下
10006F8C FF1504400110 CALL DWORD PTR [10014004]
OD分析如下
10006F8C  |.  FF15 04400110          CALL DWORD PTR DS:[ <&ADVAPI32.RegOpenKey>]

这一句难道是读取注册表的信息了? 

那么接下来
10006F92  |.  8985 A8FEFFFF          MOV DWORD PTR SS:[EBP-158],EAX 
10006F98  |.  83BD A8FEFFFF 00        CMP DWORD PTR SS:[EBP-158],0 
10006F9F  |.  74 25                  JE SHORT srf.10006FC6 

10006F92  |.  8985 A8FEFFFF          MOV DWORD PTR SS:[EBP-158],EAX 

这句是把输入里写的码取得来? 

CMP DWORD PTR SS:[EBP-158],0 

然后再把取得的注册表信息与软件固定好的码对比?

是这样的吗?

#16


引用 9 楼 qingye2008 的回复:
10006F9F  |.  74 25                  JE SHORT srf.10006FC6
修改为
10006F9F  |.  74 25                  Jmp SHORT srf.10006FC6

我也感觉是这么破解

#17


引用 15 楼 xscansou 的回复:
w32Dasa分析如下
10006F8C FF1504400110 CALL DWORD PTR [10014004]
OD分析如下
10006F8C  |.  FF15 04400110          CALL DWORD PTR DS:[ <&ADVAPI32.RegOpenKey>]

这一句难道是读取注册表的信息了?

那么接下来
10006F92  |.  8985 A8FEFFFF          MOV DWORD PTR SS:[EBP-158],EAX
10006F98  |.  83BD A8FEFFFF 00        CMP DWORD PTR SS:[EBP-158],0
10006F9F  |.  74 25                  JE SHORT srf.10006FC6

10006F92  |.  8985 A8FEFFFF          MOV DWORD PTR SS:[EBP-158],EAX

这句是把输入里写的码取得来?

CMP DWORD PTR SS:[EBP-158],0

然后再把取得的注册表信息与软件固定好的码对比?

是这样的吗?


不出意外是这样的。你自己跟踪下看看,注意寄存器,就好了

#18


引用 16 楼 tr0j4n 的回复:
引用 9 楼 qingye2008 的回复:
10006F9F  |.  74 25                  JE SHORT srf.10006FC6
修改为
10006F9F  |.  74 25                  Jmp SHORT srf.10006FC6

我也感觉是这么破解




破解到是容易,


向上的代码如下
10006F5C    8D85 08FCFFFF          lea eax,dword ptr ss:[ebp-3F8]
10006F62    50                     push eax
10006F63    8D8D ACFEFFFF          lea ecx,dword ptr ss:[ebp-154]
10006F69    51                     push ecx
10006F6A    E8 C1180000            call srf.10008830
10006F6F    83C4 08                add esp,8
10006F72    8D95 08FDFFFF          lea edx,dword ptr ss:[ebp-2F8]
10006F78    52                     push edx                              
10006F79    68 19000200            push 20019                            
10006F7E    6A 00                  push 0                                
10006F80    8D85 ACFEFFFF          lea eax,dword ptr ss:[ebp-154]        
10006F86    50                     push eax                              
10006F87    68 02000080            push 80000002 
 

10006F8C  |.  FF15 04400110          CALL DWORD PTR DS:[ <&ADVAPI32.RegOpenKey>] 
10006F92  |.  8985 A8FEFFFF          MOV DWORD PTR SS:[EBP-158],EAX 
10006F98  |.  83BD A8FEFFFF 00        CMP DWORD PTR SS:[EBP-158],0 
10006F9F  |.  74 25                  JE SHORT srf.10006FC6 


是找出EAX的内容吗?

push 80000002
push 20019
是什么意思呢?

是不是红色代码部分在给EAX写内定呢?

OD没用几天还不知道怎么跟踪

MOV DWORD PTR SS:[EBP-158],EAX 中的EAX值,不好意思啦.,

#19


10006F8C  |.  FF15 04400110    CALL DWORD PTR DS:[ <&ADVAPI32.RegOpenKey>] 打开注册表键
10006F92  |.  8985 A8FEFFFF    MOV DWORD PTR SS:[EBP-158],EAX ;返回值保存到局部变量
10006F98  |.  83BD A8FEFFFF 00 CMP DWORD PTR SS:[EBP-158],0 ;判断是否打开成功
10006F9F  |.  74 25            JE SHORT srf.10006FC6 ;打开成功就跳到10006FC6处执行

这里没有读取什么码,只是一个简单的判断
LONG lResult;
lResult = RegOpenKey(hKey, lpSubKey, phkResult);
if(lResult != ERROR_SUCCESS)
{
  MessageBox(NULL, TEXT("没找到正确的文件编"), TEXT("err没找到正确的文件编"), MB_OK | MB_APPLMODAL);
  return FALSE;
}
;打开成功
......
关键代码在后面,自己慢慢跟,这只是这个关键函数开始的几行


##?#USBSTOR#Disk&Ven_Suning&Prod_OnlyDisk&Rev_PMAP#90941400021F&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} 这个字符串是插入USB设备后系统自动根据驱动生成的DevicePath供应用层
使用的,开来后面还要读取USB上面的数据或者别的方式来进行校验,如果是破解带狗的软件,再慢慢跟踪数据通讯吧


#20


不是狗,就是一个普通的U盘,只不过这个U盘有序列号

我试着把这个#?#USBSTOR#Disk&Ven_Suning&Prod_OnlyDisk&Rev_PMAP#90941400021F&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}
修改一个字符,软件就用不起了.

#21


#?#USBSTOR#Disk&Ven_Suning&Prod_OnlyDisk&Rev_PMAP#90941400021F&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} 

插入USB设备后系统自动根据驱动生成的DevicePath供应用层使用的 


这个每个系统会不会不同呢?如都是XP会不会是不一样的?

谢谢CSDN上所有热心肠的朋友!!!!!!

#22


这个的话,可能会不同

#23


LONG lResult; 
lResult = RegOpenKey(hKey, lpSubKey, phkResult); 
if(lResult != ERROR_SUCCESS) 

  MessageBox(NULL, TEXT("没找到正确的文件编"), TEXT("err没找到正确的文件编"), MB_OK | MB_APPLMODAL); 
  return FALSE; 
}

这个可以肯定的是在访问注册表的信息

 关键就在找

RegOpenKey(hKey, lpSubKey


hKey, lpSubKey

在什么地方赋的值 

hKey, lpSubKey 是什么到可以到出来.

大概应该是这样的一个东东

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses\{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\##?#USBSTOR#Disk&Ven_Netac&Prod_OnlyDisk&Rev_PMAP#90942352349F&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\Control]
"ReferenceCount"=dword:00000001

#24


"ReferenceCount"=dword:00000001
U盘拔出是
"ReferenceCount"=dword:00000000

换其它U盘估计软件已经不判断 这一段了,
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses\{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\ ##?#USBSTOR#Disk&Ven_Netac&Prod_OnlyDisk&Rev_PMAP#90942352349F&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\Control] 

90942352349F 我试个两个U盘 只有这里不一样.其它的都是一样的,同一个厂家的

意思就是说,这个软件不插入U盘用不起,如果你不是插入的这个软件配的那个U盘也用不起.

即,一个软件一个U盘配起,不能共用的,或者把两个不同的U盘上的软件相互COPY也是不能用的

注:不是狗,是普通U盘,当然这些U盘都是有序列号的.



#25


10006F98  |.  83BD A8FEFFFF 00        CMP DWORD PTR SS:[EBP-158],0 
10006F9F  |.  74 25                  JE SHORT srf.10006FC6 
看这两句应该就明白了
如果是在不明白,就用IDA打开,然后按F5,把汇编转化成C语言来看

#26


CMP DWORD PTR SS:[EBP-158],0
跳转来自EBP-158,要一步一步回缩追踪,你既然能够看到JZ那句代码,在文件中找到相对应的机器码,把74改成JMP对应的机器码就是了嘛,何必再麻烦

#27


必须得把软件注册码写进去

#28


很显然软件会枚举特定的U盘,也就是USB设备,然后打开USB设备GUID对应注册表项,获取设备数量
软件与USB设备进行了绑定,要找到识别码,绑定方式要看后面的代码,关键代码在后面,在后面的与U盘通讯的关键部分,这里只是一个开头


那个字符串是动态生成的,每次可能不一样,显然这个软件每次根据设备GUID自动枚举出来的

#29


后面的与U盘通讯的关键部分 有什么特征,有什么标志性的确语句?

#30


引用 28 楼 killbug2004 的回复:
很显然软件会枚举特定的U盘,也就是USB设备,然后打开USB设备GUID对应注册表项,获取设备数量
软件与USB设备进行了绑定,要找到识别码,绑定方式要看后面的代码,关键代码在后面,在后面的与U盘通讯的关键部分,这里只是一个开头


那个字符串是动态生成的,每次可能不一样,显然这个软件每次根据设备GUID自动枚举出来的



你的意思是这个软件是每做一个就要先把U盘的GUID读出来再写到软件里

还是它是通过程序的算法取得这个GUID?

#31


我比较了两个软件,用w32Dasm查出的字符串

只有这点不一样,


91;751678;;M
对应的注册表信息
##?#USBSTOR#Disk&Ven_Netac&Prod_OnlyDisk&Rev_PMAP#90941400021F&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}


91;051678:>9
对应的注册表信息
##?#USBSTOR#Disk&Ven_Netac&Prod_OnlyDisk&Rev_PMAP#909314000342&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}

#32


GUID对于同一种设备是一样的,软件可以利用GUID知道系统有没有接入这种设备,软件和唯一U盘绑定,它们之间肯定有一种匹配校验方式,这个校验用到的数据肯定保存在U盘上,所以我一直说往下看代码,不过看来对你而言很难 呵呵

#33


嗯,是的,是很难,上学的时候学过一点点汇编,一直用MFC在写程序,所以汇编才用一个月.

这个软件没有那么复杂,因为我了解了一些这个软件具体开发过程.

不可能加密技术有多深.

#34


现在到是已经破解了可以使用

如果我再想把软件通过自己的方法绑定到U盘上,应该如何下手?

#35


引用 32 楼 killbug2004 的回复:
GUID对于同一种设备是一样的,软件可以利用GUID知道系统有没有接入这种设备,软件和唯一U盘绑定,它们之间肯定有一种匹配校验方式,这个校验用到的数据肯定保存在U盘上,所以我一直说往下看代码,不过看来对你而言很难 呵呵


U盘很简单,普通U盘,而且可以随便格式化,只要把U盘上的几个文件重新copy到上面就可以使用.

"这个校验用到的数据肯定保存在U盘上" 是这样子的,这个校验数据应该不是在U盘上.

我试着把 


[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses\{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\##?#USBSTOR#Disk&Ven_Netac&Prod_OnlyDisk&Rev_PMAP#90942352349F&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}\Control] 
下的
ReferenceCount值改成
ReferenceCount=1,软件就不会出现那个对话框了.

注:ReferenceCount U盘拔下,值为0

U盘插上,值为1,如果手动改成 0的话,软件就会弹出那个对话框






#36


破解的问题去看雪论坛问问比较好些.
那里不少高人专么搞这种东西的.

#37


其实上已经分析完毕,特别要感谢的是 killbug2004  相当的有热心,再次感谢,感谢.结了.