- UID
- 40573
注册时间2007-12-7
阅读权限20
最后登录1970-1-1
以武会友
TA的每日心情 | 开心 2024-7-6 15:57 |
---|
签到天数: 82 天 [LV.6]常住居民II
|
目标软件:mindManager 2019 32bit
使用工具:x32dbg
初学入门,只为学习,如有侵权或不正确的地方还忘指教。
找一个假的注册码,mindManager认为是真的注册码
例如:MP78-812-2P94-D1DM-35F3
输入密钥,mindManager会弹出错误,一般这个时候可以在MessageBoxW上下断点
通过调用栈往上找,直到在调用函数里发现如下字样,基本上就到关键点了
FF15 9C7FEE00 | CALL DWORD PTR DS:[<&?SendRegistrationAttemptEvent@CmjFeedbackManager@@SA_NABV?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@0@Z>]
往下看,看到这几个比较指令,其中只有0x1才是正确的,所以把比较0x1,直接改为jmp指令
00A4C80F | CALL <mindmanager.sub_A4C640>
00A4C814 | MOV DWORD PTR SS:[EBP-0x2C],EAX
00A4C817 | MOV EDX,DWORD PTR SS:[EBP-0x2C]
00A4C81A | MOV DWORD PTR SS:[EBP-0x14],EDX
00A4C81D <mind | CMP DWORD PTR SS:[EBP-0x14],0x0
00A4C821 | JE mindmanager.A4C83C
00A4C823 | CMP DWORD PTR SS:[EBP-0x14],0x1
00A4C827 | JE mindmanager.A4C989 <------------------直接改为jmp
00A4C82D | CMP DWORD PTR SS:[EBP-0x14],0x2
00A4C831 | JE mindmanager.A4C9F3
00A4C837 | JMP mindmanager.A4CA55
以上的步骤完成了注册时的验证,会把注册信息写入注册表。
程序在重启的时候还会进行检测。既然是写入注册表的,那就要在几个读注册表的API上下断点
如:
<kernel32.dll.RegOpenKeyExW> 已启用 MOV EDI,EDI 0
<kernel32.dll.RegCloseKey> 已启用 MOV EDI,EDI 0
<kernel32.dll.RegCreateKeyExW> 已启用 MOV EDI,EDI 0
<advapi32.dll.RegQueryValueA> 已启用 PUSH 0x24 0
<advapi32.dll.RegQueryValueW> 已启用 PUSH 0x24 0
但是,经过实践,都断不下来。那就要想别的办法了。
按常理,它的注册验证算法在启动时调用的和注册时调用的应该是同一个地方,除非是不按套路出牌,非要验证代码复制一份给启动时调用。虽然说这样做没什么问题,但是软件以后的维护就是个大问题了。所以我们还是进比较指令前面的CALL <mindmanager.sub_A4C640> 里看看有没有什么新发现。看到又调用了CALL <mindmanager.sub_6E4830>,后面还有个TEST EAX,EAX,比较可疑。改下返回值跑一下,OK通过了。接下来修改sub_6E4830,让它永久返回1,代码如下:
| 55 | PUSH EBP
| 8BEC | MOV EBP,ESP
| 68 60022601 | PUSH mindmanager.1260260
| 8B45 08 | MOV EAX,DWORD PTR SS:[EBP+0x8]
| 50 | PUSH EAX
| E8 3FF8FFFF | CALL <mindmanager.sub_6E4080>
| 83C4 08 | ADD ESP,0x8
| 5D | POP EBP
| 40 | INC EAX <--------------------EAX本来是0,让它加1
| C3 | RET
经验证,这里返回1,上面的可以不用改jmp指令。
|
评分
-
参与人数 3 | 威望 +7 |
飘云币 +12 |
收起
理由
|
Rooking
| + 5 |
+ 10 |
PYG有你更精彩!再接再厉 |
飞天
| + 1 |
+ 1 |
PYG有你更精彩! |
阳光宅男
| + 1 |
+ 1 |
感谢发布原创作品,PYG有你更精彩! |
查看全部评分
|