首页
社区
课程
招聘
[旧帖] [邀请码已发]申请邀请码,chmmaker破解及注册过程初步分析 0.00雪花
发表于: 2011-9-25 18:37 1615

[旧帖] [邀请码已发]申请邀请码,chmmaker破解及注册过程初步分析 0.00雪花

2011-9-25 18:37
1615
【破文标题】chmmaker破解及注册过程初步分析
【难度级别】初入门的新手
【下载地址】天空软件等等,百度知道
【破解工具】OD,peid
【加壳方式】Aspack
【保护方式】序列号
【破解声明】本人初学破解,水平有限,因此可能思路方法等有误,希望大家批评指正,同时也希望能与跟我一样的初学者一起提高。
【前文连接】
【备  注】高手勿喷~~

chmmaker传说是一款很方便的chm制作软件,不过要注册才能使用全部功能。所以。。。,顺便看版主大人能否给一枚邀请码,如果不行小弟再去努力!!

下面动手,尝试注册了一下,是重启验证注册方式。

查壳 ASPack 2.12 -> Alexey Solodovnikov用aspackdie直接脱了,od载入,停在这里
004DA484 > $ 55 PUSH EBP
004DA485 . 8BEC MOV EBP,ESP
004DA487 . 83C4 F0 ADD ESP,-10

重启验证一般都会写文件或者注册表供下次启动时候验证所以下断RegOpenKey或者ReadFile之类,因为是文件处理工具,所以Readfile不太好观察,
我们下RegOpenKeyEx和RegCreateKeyEx,RegQueryValueEx断。一路F9观察堆栈窗口
断在这里的时候
0046A85D |. 50 PUSH EAX ; |hKey
0046A85E |. E8 59C3F9FF CALL <JMP.&advapi32.RegCreateKeyExA> ;

堆栈窗口如下
0012FD88 80000001 |hKey = HKEY_CURRENT_USER
0012FD8C 004D93EC |Subkey = "Software\ChmMaker"
0012FD90 00000000 |Reserved = 0
0012FD94 00000000 |Class = NULL
0012FD98 00000000 |Options = REG_OPTION_NON_VOLATILE
0012FD9C 000F003F |Access = KEY_ALL_ACCESS
0012FDA0 00000000 |pSecurity = NULL
0012FDA4 0012FDC8 |pHandle = 0012FDC8
0012FDA8 0012FDC0 \pDisposition = 0012FDC0

打开注册表发现有HKEY_CURRENT_USER\Software\ChmMaker 下面两个子键,RegNo值为输入的假注册码 RegUser 值为用户名
继续F9来到这里,
0046A901 |. 50 PUSH EAX ; |ValueName
0046A902 |. 8B46 04 MOV EAX,DWORD PTR DS:[ESI+4]
0046A905 |. 50 PUSH EAX ; |hKey
0046A906 |. E8 C9C2F9FF CALL <JMP.&advapi32.RegQueryValueExA>

0046AA92 |. 50 PUSH EAX ; |ValueName
0046AA93 |. 8B43 04 MOV EAX,DWORD PTR DS:[EBX+4] ; |
0046AA96 |. 50 PUSH EAX ; |hKey
0046AA97 |. E8 38C1F9FF CALL <JMP.&advapi32.RegQueryValueExA> ;

堆栈窗口
0012FD80 000001C8 |hKey = 1C8
0012FD84 004D9408 |ValueName = "RegUser"
0012FD88 00000000 |Reserved = NULL
0012FD8C 0012FDAC |pValueType = 0012FDAC
0012FD90 00AC6130 |Buffer = 00AC6130
0012FD94 0012FDBC \pBufSize = 0012FDBC

0012FD80 000001C8 |hKey = 1C8
0012FD84 004D9418 |ValueName = "RegNo"
0012FD88 00000000 |Reserved = NULL
0012FD8C 0012FDAC |pValueType = 0012FDAC
0012FD90 00AC6148 |Buffer = 00AC6148
0012FD94 0012FDBC \pBufSize = 0012FDBC

可以看到将两个键值保存到00AC6130 00AC6148这2个地方 下个内存断点,好像没获得具体信息,无奈之下,超级字符串参考一记,发现了下面的内容。

004D917E MOV EDX,unpacked.004D93EC Software\ChmMaker
004D918D MOV EDX,unpacked.004D9408 RegUser
004D91A9 MOV EDX,unpacked.004D9418 RegNo
004D91D8 MOV EDX,unpacked.004D9428 chmmakerChina
004D9209 MOV EAX,unpacked.004D9440 2011-4-1
004D9241 MOV EDX,unpacked.004D9454 - 未购买用户

未注册的话软件窗口会显示 - 未购买用户,那么注册检测一定在访问 “- 未购买用户”字符串之前。重新载入对004D9454下内存访问断点,断在这里

00402A01 |. F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]

因为访问“- 未购买用户”应该是注册检测过程的一部分,所以从堆栈窗口找返回地址跟随,可以回溯到检测过程(这个只是猜测),回溯的时候发现了堆栈里面的这个:

0012FE00 00AC617C ASCII "BFEBFBFFY34X92FE" //////机器码
0012FE04 00AC619C ASCII "ddddddddBFEBFBFFY34X92FE"//用户名+机器码
0012FE08 00AC6250 ASCII "7854ECB061A2BE18A722E0B3BC4BF34C07160AFEB2F8CB3D"///这个是什么?
0012FE0C 00AC6148 ASCII "xxxxxxxxxxxxxx"//假码
0012FE10 00AC6130 ASCII "dddddddd"/////用户名

中间那一串字符是什么呢?难道是真码.... 复制过来测试一下,成功了!
如果只想找到注册码就到这里就行了,可是,本人虽然菜,却总是自不量力,想搞个注册机(剧透一下:最终当然没弄出来。。还是太菜了)。
虽然没做出来,但注册流程大致清楚,主要是算法太复杂.下面分析一下注册过程,有兴趣的可以去跟一下,弄个注册机。

刚才堆栈里面既然已经出现了真码,那么算法过程一样可以回溯。继续在堆栈里面找第一个返回地址跟随

0012FE1C |0045DE0F 返回到 unpacked.0045DE0F

来到这里

0045DDFA . 64:8920 MOV DWORD PTR FS:[EAX],ESP
0045DDFD . 8B5D FC MOV EBX,DWORD PTR SS:[EBP-4]
0045DE00 . 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
0045DE03 . 8B83 D4020000 MOV EAX,DWORD PTR DS:[EBX+2D4]
0045DE09 . FF93 D0020000 CALL DWORD PTR DS:[EBX+2D0] /////所以真码由这个call产生。
0045DE0F . 33C0 XOR EAX,EAX ////返回地址

跟进去,然后先F8一遍,同时注意堆栈窗口和寄存器窗口,做好记录

004D9138 . 55 PUSH EBP
004D9139 . 8BEC MOV EBP,ESP
004D913B . B9 05000000 MOV ECX,5
004D9140 > 6A 00 PUSH 0
004D9142 . 6A 00 PUSH 0
004D9144 . 49 DEC ECX
004D9145 .^ 75 F9 JNZ SHORT unpacked.004D9140
004D9147 . 53 PUSH EBX
004D9148 . 56 PUSH ESI
004D9149 . 57 PUSH EDI
004D914A . 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
004D914D . 33C0 XOR EAX,EAX
004D914F . 55 PUSH EBP
004D9150 . 68 D4934D00 PUSH unpacked.004D93D4
004D9155 . 64:FF30 PUSH DWORD PTR FS:[EAX]
004D9158 . 64:8920 MOV DWORD PTR FS:[EAX],ESP
004D915B . C605 CC054E00>MOV BYTE PTR DS:[4E05CC],0
004D9162 . B2 01 MOV DL,1
004D9164 . A1 ACA54600 MOV EAX,DWORD PTR DS:[46A5AC]
004D9169 . E8 3E15F9FF CALL unpacked.0046A6AC
004D916E . 8BD8 MOV EBX,EAX
004D9170 . BA 01000080 MOV EDX,80000001
004D9175 . 8BC3 MOV EAX,EBX
004D9177 . E8 D015F9FF CALL unpacked.0046A74C
004D917C . B1 01 MOV CL,1
004D917E . BA EC934D00 MOV EDX,unpacked.004D93EC ; Software\ChmMaker
004D9183 . 8BC3 MOV EAX,EBX
004D9185 . E8 2616F9FF CALL unpacked.0046A7B0
004D918A . 8D4D F8 LEA ECX,DWORD PTR SS:[EBP-8]
004D918D . BA 08944D00 MOV EDX,unpacked.004D9408 ; RegUser
004D9192 . 8BC3 MOV EAX,EBX
004D9194 . E8 DF17F9FF CALL unpacked.0046A978 ; 读user值
004D9199 . 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
004D919C . B8 D0054E00 MOV EAX,unpacked.004E05D0
004D91A1 . E8 B2B4F2FF CALL unpacked.00404658
004D91A6 . 8D4D F4 LEA ECX,DWORD PTR SS:[EBP-C]
004D91A9 . BA 18944D00 MOV EDX,unpacked.004D9418 ; RegNo
004D91AE . 8BC3 MOV EAX,EBX
004D91B0 . E8 C317F9FF CALL unpacked.0046A978 ;
004D91B5 . 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] ; 取假码
004D91B8 . 50 PUSH EAX
004D91B9 . 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-18]
004D91BC . E8 CFD8FFFF CALL unpacked.004D6A90
004D91C1 . 8B4D E8 MOV ECX,DWORD PTR SS:[EBP-18] ; 取机器码
004D91C4 . 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14]
004D91C7 . 8B15 D0054E00 MOV EDX,DWORD PTR DS:[4E05D0] ; 取用户名
004D91CD . E8 36B7F2FF CALL unpacked.00404908
004D91D2 . 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14] ; 用户名+机器码
004D91D5 . 8D4D F0 LEA ECX,DWORD PTR SS:[EBP-10]
004D91D8 . BA 28944D00 MOV EDX,unpacked.004D9428 ; chmmakerChina
004D91DD . E8 EE31FBFF CALL unpacked.0048C3D0 ;
004D91E2 . 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]

F8到004D91E2的时候发现堆栈中出现真码,那么004D91DD . E8 EE31FBFF CALL unpacked.0048C3D0 这个call生成真码,继续跟进去

0048C3D0 /$ 55 PUSH EBP
0048C3D1 |. 8BEC MOV EBP,ESP
0048C3D3 |. 83C4 D0 ADD ESP,-30
0048C3D6 |. 53 PUSH EBX
0048C3D7 |. 56 PUSH ESI
0048C3D8 |. 57 PUSH EDI
0048C3D9 |. 33DB XOR EBX,EBX
0048C3DB |. 895D D0 MOV DWORD PTR SS:[EBP-30],EBX
0048C3DE |. 895D D4 MOV DWORD PTR SS:[EBP-2C],EBX
0048C3E1 |. 8BF9 MOV EDI,ECX
0048C3E3 |. 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX ; chmmakerChina
0048C3E6 |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX ; 用户名+机器码
0048C3E9 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0048C3EC |. E8 B386F7FF CALL unpacked.00404AA4 ; 判断字符串是否存在
0048C3F1 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] ; chmmakerChina
0048C3F4 |. E8 AB86F7FF CALL unpacked.00404AA4
0048C3F9 |. 33C0 XOR EAX,EAX
0048C3FB |. 55 PUSH EBP
0048C3FC |. 68 ECC44800 PUSH unpacked.0048C4EC
0048C401 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
0048C404 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
0048C407 |. 8BC7 MOV EAX,EDI ; 真码缓冲区 EDI EAX
0048C409 |. E8 F681F7FF CALL unpacked.00404604
0048C40E |. 8D55 E0 LEA EDX,DWORD PTR SS:[EBP-20] ; 字符串长度
0048C411 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] ; chmmakerChina
0048C414 |. E8 23FFFFFF CALL unpacked.0048C33C ; 写入12FDAC
0048C419 |. B2 01 MOV DL,1
0048C41B |. 8D45 E0 LEA EAX,DWORD PTR SS:[EBP-20]
0048C41E |. E8 29F2FFFF CALL unpacked.0048B64C ; 生成4E00A0一个矩阵
0048C423 |. C745 D8 01000>MOV DWORD PTR SS:[EBP-28],1
0048C42A |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 用户名+机器码
0048C42D |. E8 8A84F7FF CALL unpacked.004048BC
0048C432 |. 8945 DC MOV DWORD PTR SS:[EBP-24],EAX
0048C435 |> 8D45 D4 /LEA EAX,DWORD PTR SS:[EBP-2C]
0048C438 |. 50 |PUSH EAX
0048C439 |. B9 08000000 |MOV ECX,8
0048C43E |. 8B55 D8 |MOV EDX,DWORD PTR SS:[EBP-28]
0048C441 |. 8B45 FC |MOV EAX,DWORD PTR SS:[EBP-4] ; 用户名+机器码
0048C444 |. E8 CB86F7FF |CALL unpacked.00404B14
0048C449 |. 8D45 F0 |LEA EAX,DWORD PTR SS:[EBP-10] ; 待处理的字符串地址
0048C44C |. 33C9 |XOR ECX,ECX
0048C44E |. BA 08000000 |MOV EDX,8
0048C453 |. E8 8C6CF7FF |CALL unpacked.004030E4 ; 写入4DFD4C
0048C458 |. 8B45 D4 |MOV EAX,DWORD PTR SS:[EBP-2C] ; 取用户名+注册码剩下中取8位
0048C45B |. E8 5C84F7FF |CALL unpacked.004048BC
0048C460 |. 50 |PUSH EAX
0048C461 |. 8D45 D4 |LEA EAX,DWORD PTR SS:[EBP-2C]
0048C464 |. E8 A386F7FF |CALL unpacked.00404B0C
0048C469 |. 8D55 F0 |LEA EDX,DWORD PTR SS:[EBP-10]
0048C46C |. 59 |POP ECX
0048C46D |. E8 6265F7FF |CALL unpacked.004029D4
0048C472 |. 8D55 E8 |LEA EDX,DWORD PTR SS:[EBP-18]
0048C475 |. 8D45 F0 |LEA EAX,DWORD PTR SS:[EBP-10]
0048C478 |. E8 A3F4FFFF |CALL unpacked.0048B920 ; 就是他!!!
0048C47D |. BE 08000000 |MOV ESI,8
0048C482 |. 8D5D E8 |LEA EBX,DWORD PTR SS:[EBP-18]
0048C485 |> 8D4D D0 |/LEA ECX,DWORD PTR SS:[EBP-30]
0048C488 |. 33C0 ||XOR EAX,EAX
0048C48A |. 8A03 ||MOV AL,BYTE PTR DS:[EBX]///////////////////// 取2位真码
0048C48C |. BA 02000000 ||MOV EDX,2
0048C491 |. E8 CAC9F7FF ||CALL unpacked.00408E60
0048C496 |. 8B55 D0 ||MOV EDX,DWORD PTR SS:[EBP-30]
0048C499 |. 8BC7 ||MOV EAX,EDI
0048C49B |. E8 2484F7FF ||CALL unpacked.004048C4
0048C4A0 |. 43 ||INC EBX
0048C4A1 |. 4E ||DEC ESI
0048C4A2 |.^ 75 E1 |\JNZ SHORT unpacked.0048C485
0048C4A4 |. 8345 D8 08 |ADD DWORD PTR SS:[EBP-28],8
0048C4A8 |. 8B45 DC |MOV EAX,DWORD PTR SS:[EBP-24] ; 用户名+字符串 长度
0048C4AB |. 83C0 07 |ADD EAX,7
0048C4AE |. 85C0 |TEST EAX,EAX
0048C4B0 |. 79 03 |JNS SHORT unpacked.0048C4B5
0048C4B2 |. 83C0 07 |ADD EAX,7
0048C4B5 |> C1F8 03 |SAR EAX,3
0048C4B8 |. C1E0 03 |SHL EAX,3
0048C4BB |. 3B45 D8 |CMP EAX,DWORD PTR SS:[EBP-28]
0048C4BE |.^ 0F8D 71FFFFFF \JGE unpacked.0048C435 ; 处理用户名+密码结束则跳走
0048C4C4 |. 33C0 XOR EAX,EAX

注意观察堆栈窗口,发现0048C48A 这一行每次都会取2位真码,锁定堆栈近一步分析,发现来自于下面这一句

0048C478 |. E8 A3F4FFFF |CALL unpacked.0048B920 ; 就是他!!!

跟进去,由于这个call代码太长,篇幅有限就不贴了。总之是用 用户名+机器码字符串各位的ascii,然后在访问几个矩阵或者叫字节流(就是01和10 00 之类的字节),
主要是下面几个地址 004DFD4C 004DC1B4 004E006C 004E004C 004EOOA0,并通过ascii与各矩阵中的字节进行各种位运算实现真码的计算.而这几个矩阵(实在找不到好词),由用户名和机器码以及"chmmakerChina"这几个字符串运算得来,本想一直跟下去,奈何水平跟体力都有限,实在是不支,有兴趣的可以看下,大牛勿笑我等菜鸟~~

[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回