qun285928725 发表于 2015-10-26 00:45

Smart Install Maker安装文件爆破与算法

本帖最后由 qun285928725 于 2017-2-23 14:17 编辑

【文章标题】: Smart Install Maker安装文件爆破与算法
【文章作者】: qun285928725
【软件名称】: Smart Install Maker
【软件大小】: 1.53M
【下载地址】: 自己搜索下载
【加壳方式】: 无壳
【保护方式】: 无
【编写语言】: Borland Delphi
【使用工具】: OD
【操作平台】: win7
【软件介绍】: 快速将文件打包为安装文件并且可以设置密码
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
--------------------------------------------------------------------------------
【详细过程】
判断安装文件是否为Smart Install Maker打包用OD载入找到004233EC 看后面的字符串是否为MART INSTALL MAKER

只针对安装包有密码的!


整个算法代码我参考的这个帖子
http://www.52pojie.cn/thread-307577-1-1.html

OD载入用Smart Install Maker打包的安装文件运行找到00422D25算法关键字下断,F7单步步入跟进去输入,假密1234
   00422D25|.BE 01000000   mov esi,0x1                              ;esi=00000001
   00422D2A|>8B0424      /mov eax,dword ptr ss:            ;假设密码=1234
   00422D2D|.0FB64430 FF   |movzx eax,byte ptr ds:   ;eax=31,第1位密码ascii码的16进制数
   00422D32|.8BD0          |mov edx,eax                           ;edx=eax=上面这一句的值
   00422D34|.8B4C24 08   |mov ecx,dword ptr ss:          ;ecx=7,密码的总位数
   00422D38|.2BCE          |sub ecx,esi                           ;ecx=7-1=6,密码总位数-esi的值
   00422D3A|.0FAFCF      |imul ecx,edi                            ;ecx=ecx*edi=0
   00422D3D|.03D1          |add edx,ecx                           ;edx=edx+ecx=31+0=31,当前密码+上面一句的值
   00422D3F|.03FA          |add edi,edx                           ;edi=edi+eax=0+31=31,计算出新的EDI值
   00422D41|.8BD8          |mov ebx,eax                           ;ebx=31,第1位密码
   00422D43|.0FAFDF      |imul ebx,edi                            ;ebx=ebx*edi=31*31=961
   00422D46|.03DE          |add ebx,esi                           ;ebx=ebx+esi=961+1=962
   00422D48|>8BC3          |/mov eax,ebx                            ;eax=ebx=962eax是被除数
   00422D4A|.B9 5A000000   ||mov ecx,0x5A                           ;ecx=0x5a 除数
   00422D4F|.33D2          ||xor edx,edx
   00422D51|.F7F1          ||div ecx                              ;eax=eax/ecx=962/5a=1A edx=余数
   00422D53|.6BC0 5A       ||imul eax,eax,0x5A                      ;ax=eax*5a=1A*5A=924
   00422D56|.2BD8          ||sub ebx,eax                            ;ebx=962-924=3e 结果出来了
   00422D58|.83FB 30       ||cmp ebx,0x30                           ;ebx=3e和0x30比较,如果>0x30就跳转
   00422D5B|.73 03         ||jnb XSetup.00422D60
   00422D5D|.83C3 30       ||add ebx,0x30
   00422D60|>83FB 2F       ||cmp ebx,0x2F                           ;ebx=3e和0x2f比较,如果<0x2f就跳转
   00422D63|.^ 76 E3         ||jbe XSetup.00422D48
   00422D65|.83FB 5B       ||cmp ebx,0x5B                           ;ebx=3e和0x5b比较,如果>0x5b就跳转
   00422D68|.^ 73 DE         |\jnb XSetup.00422D48
   00422D6A|.8B4424 04   |mov eax,dword ptr ss:          ;eax=924,上面除5A乘5A后的结果
   00422D6E|.E8 D90DFEFF   |call Setup.00403B4C                     ;!!
   00422D73|.885C30 FF   |mov byte ptr ds:,bl      ;bl=3E ('>'),assii码1加密后的assii码
   00422D77|.46            |inc esi
   00422D78|.4D            |dec ebp                                 ;密码长度
   00422D79|.^ 75 AF         \jnz XSetup.00422D2A                     ;接着循环下一位密码

我所分析出的算法假码为1234   加密后>ZBB
第一次运算字符为1
                                                         
A   31=1            把输入字符转为16进制                                    
B      3=4-1          密码总数减去当前所运算的位数      
C   31=31*1         1乘以A的值(第1位字符运算默认为1)                     
D   62=31+31      C的值加上A的值
E   31=31+0         0加上A的值(第1位字符运算默认为0)
F    961=31*31      E的值乘以A的值
G    962=961+1      F的值加上当前运算密码的位数
H   1A=962/5A       G的值除以5A (5A为算法固定值)
I    924=1A*5A      H的值乘以5A            
J   3E=962-924      G的值减去I的值
K   3E=3E+0         J的值大于等于30跳过小于30加上30(30为算法固定值)
L   3E=3E+0         K的值大于等于5A就等于5A (5A为算法固定值)
M      >=3E         十六进制转字符   

第N次运算字符为2

A   32=2            把输入字符转为16进制
B      2=2-2          密码总数减去当前所运算的位数
C   62=31*2         上一个E的值乘以当前B的值
D   94=62+32      C的值加上A的值   
E   C5=94+31      上一个E的值加上当前D的值   
F   267A=C5*32      E的值乘以A的值
G   267C=267A+2       F的值加上当前运算密码的位数
H   6D=267C/5A      G的值除以5A (5A为算法固定值)
I   2652=6D*5A      H的值乘以5A
J   2A=267C-2652    G的值减去I的值
K   5A=2A+30      J的值大于等于30跳过小于30加上30(30为算法固定值)
L   5A=5A+0         K的值大于等于5A就等于5A (5A为算法固定值)
M      Z=5A         十六进制转字符

第N次运算字符为3            

A   33=3            把输入字符转为16进制
B      1=4-3          密码总数减去当前所运算的位数
C   C5=C5*1         上一个E的值乘以当前B的值
D   F8=C5+33      C的值加上A的值   
E    1BD=F8+C5      上一个E的值加上当前D的值
F   58A7=1BD*33       E的值乘以A的值
G   58AA=58A7+3       F的值加上当前运算密码的位数
H   FC=58AA/5A      G的值除以5A (5A为算法固定值)
I   5898=FC*5A      H的值乘以5A
J   12=58AA-5898    G的值减去I的值
K   42=12+30      J的值大于等于30跳过小于30加上30(30为算法固定值)
L   42=42+0         K的值大于等于5A就等于5A (5A为算法固定值)
M      B=42         十六进制转字符

最后一次运算字符为4

A   34=4            把输入字符转为16进制
B      0=4-4          密码总数减去当前所运算的位数
C      0=1BD*0      上一个E的值乘以当前B的值
D    1F1=1BD+34       C的值加上A的值
E    255=1F1+34       D的值加上A的值(当C值为0时不读取上一个E的值)
F   64F4=1F1*34       D的值乘以A的值(当C值为0时不读取上一个E的值和当前E的值)
G   64F8=64F4+4       F的值加上当前运算密码的位数
H    11F=64F8/5A      G的值除以5A (5A为算法固定值)
I   64E6=11F*5A       H的值乘以5A
J   12=64F8-64E6    G的值减去I的值
K   42=12+30      J的值大于等于30跳过小于30加上30(30为算法固定值)
L   42=42+0         K的值大于等于5A就等于5A (5A为算法固定值)
M      B=42         十六进制转字符

从上面分析表明代码总数的第一位后最后一位算法不一样,中间的数值算法都是固定的。(测试过12位密码)
当我想把这个算法逆转回去时发现不可能!!,(洗洗睡吧)!

既然算法不可逆转那就爆破把!

00403A6D|.39D9          |cmp ecx,ebx         先用OD载入用Smart Install Maker打包文件 运行在此下断(完全运行后下断 并非是在运行途中下断谨记)                     

00403A6F      75 18         jnz short Setup.00403AC9      把00403AC9改为00403A89

00403A72|.74 15         je short Setup.00403A89

00403A93|. /74 22         je short Setup.00403AB7          把JE改成JMP   取消断点 运行 输任意字符直到下一步可点

如果想知道密码的位数可以在004223EE下断运行EDX的值例如为ASCII">R6J4H"那么密码总长度为6.

本人是个新手接触破解才一个月如果有哪里不对的地方请个路高手指出。

分享Smart Install Maker打包工具   http://pan.baidu.com/s/1i3jNF9b    3uhn

如有违规请版主删帖Tks.

--------------------------------------------------------------------------------
【版权声明】: 本文原创于qun285928725, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2015年10月26日 0:43:57

chyq20 发表于 2016-5-25 17:28

支持原创
页: [1]
查看完整版本: Smart Install Maker安装文件爆破与算法