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

xscansou 2009-09-09 11:48:45
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




就在红色的部分,弹出 "没找到正确的文件编号" 程序就用不起了. 怎么找到输入内的编号存储的地方?
...全文
701 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪影 2009-09-10
  • 打赏
  • 举报
回复
破解的问题去看雪论坛问问比较好些.
那里不少高人专么搞这种东西的.
xscansou 2009-09-10
  • 打赏
  • 举报
回复
其实上已经分析完毕,特别要感谢的是 killbug2004 相当的有热心,再次感谢,感谢.结了.
xscansou 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 killbug2004 的回复:]
多贴点代码

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

再跟踪那个获取过程就知道了
[/Quote]


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

我推测应该是把一个码写在了软件里,软件运行的时候它就用写在里面的码与注册表里的码对比.
xscansou 2009-09-09
  • 打赏
  • 举报
回复
上面的是在 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
谁的谁心疼 2009-09-09
  • 打赏
  • 举报
回复
耶稣说:回帖得永生,何况还有分...
killbug2004 2009-09-09
  • 打赏
  • 举报
回复
在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
killbug2004 2009-09-09
  • 打赏
  • 举报
回复
多贴点代码

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

再跟踪那个获取过程就知道了
xscansou 2009-09-09
  • 打赏
  • 举报
回复
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

刚刚前面的少复制了一节
qingye2008 2009-09-09
  • 打赏
  • 举报
回复
网上跟踪,应该有个跳转,可以跳过这个MessageBox
xscansou 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 killbug2004 的回复:]
GUID对于同一种设备是一样的,软件可以利用GUID知道系统有没有接入这种设备,软件和唯一U盘绑定,它们之间肯定有一种匹配校验方式,这个校验用到的数据肯定保存在U盘上,所以我一直说往下看代码,不过看来对你而言很难 呵呵
[/Quote]

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的话,软件就会弹出那个对话框






xscansou 2009-09-09
  • 打赏
  • 举报
回复
现在到是已经破解了可以使用

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

xscansou 2009-09-09
  • 打赏
  • 举报
回复
嗯,是的,是很难,上学的时候学过一点点汇编,一直用MFC在写程序,所以汇编才用一个月.

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

不可能加密技术有多深.

killbug2004 2009-09-09
  • 打赏
  • 举报
回复
GUID对于同一种设备是一样的,软件可以利用GUID知道系统有没有接入这种设备,软件和唯一U盘绑定,它们之间肯定有一种匹配校验方式,这个校验用到的数据肯定保存在U盘上,所以我一直说往下看代码,不过看来对你而言很难 呵呵
xscansou 2009-09-09
  • 打赏
  • 举报
回复
我比较了两个软件,用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}
xscansou 2009-09-09
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 killbug2004 的回复:]
很显然软件会枚举特定的U盘,也就是USB设备,然后打开USB设备GUID对应注册表项,获取设备数量
软件与USB设备进行了绑定,要找到识别码,绑定方式要看后面的代码,关键代码在后面,在后面的与U盘通讯的关键部分,这里只是一个开头


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

[/Quote]


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

还是它是通过程序的算法取得这个GUID?
xscansou 2009-09-09
  • 打赏
  • 举报
回复
后面的与U盘通讯的关键部分 有什么特征,有什么标志性的确语句?

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


那个字符串是动态生成的,每次可能不一样,显然这个软件每次根据设备GUID自动枚举出来的
xscansou 2009-09-09
  • 打赏
  • 举报
回复
必须得把软件注册码写进去
thunder218 2009-09-09
  • 打赏
  • 举报
回复
CMP DWORD PTR SS:[EBP-158],0
跳转来自EBP-158,要一步一步回缩追踪,你既然能够看到JZ那句代码,在文件中找到相对应的机器码,把74改成JMP对应的机器码就是了嘛,何必再麻烦
thunder218 2009-09-09
  • 打赏
  • 举报
回复
10006F98 |. 83BD A8FEFFFF 00 CMP DWORD PTR SS:[EBP-158],0
10006F9F |. 74 25 JE SHORT srf.10006FC6
看这两句应该就明白了
如果是在不明白,就用IDA打开,然后按F5,把汇编转化成C语言来看
加载更多回复(17)

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧