首页
社区
课程
招聘
[旧帖] [求助]关于财务分析师的破解思路(高手请进) 0.00雪花
发表于: 2008-6-5 10:20 6450

[旧帖] [求助]关于财务分析师的破解思路(高手请进) 0.00雪花

2008-6-5 10:20
6450
尊敬的各位高手:
    你们好!
    我是一个爱好破解的菜鸟,前几天在网上无意中搜索到网友Ohuangkeo在2006年发表的关于财务分析师V5.8  Build329专业版的脱壳过程和

破解方法,很受启发。后来我发现该软件又有了最新的版本(V6.9 Build400),便按照他的方法试着再破解,发现它的壳改变了,好像是用

Armadillo加的壳,用该壳的专用脱壳工具进行了脱壳,并找到了程序的入口007F1000。根据Ohuangkeo在V5.8版的思路发现有点不对劲,我估

计软件作者看了Ohuangkeo的破解方法吸取了教训:一是程序增加了好多地方判断注册码(不只一处);二是程序用OD加载,根本找不到一处诸

如MSVBVM60._vbaStrCmp之类的注释地方;三是使用了V5.8 Build329版本破解版,再安装V6.9 Build400版本,要想回过来再使用V5.8 Build329版本

则根本不可能,只要一打开程序就出现一窗口提示“请注册使用”,老关不掉,就算把V6.9 Build400版本删掉也无济于事,好像注册表里有一个需要验证的地

方时时在提醒你。我也曾用注册表监视器之类的软件监视V6.9 Build400版本的安装过程,发现它往注册表很多地方写入了东西,根本找不到是

哪个关键地方在起提醒作用。对FAP脱壳之后用OD加载,发现了许多同时出现如PUSH EAX  PUSH ECX的地方,有的地方按Ohuangkeo给的思路将

EAX改成ECX,保存下来再打开程序有的能打开有的不能打开,能打开的程序仍旧是未注册。下面是我发现的一些地方:

第1处:007F111C  50  PUSH  EAX    --------------------  此处将EAX改成ECX 不能打开程序
       007F111D  51  PUSH  ECX

第2处:007F13CC  51  PUSH  ECX
       007F13CD  50  PUSH  EAX    --------------------  此处将EAX改成ECX  能打开程序

第3处:007F13F3  51  PUSH  ECX
       007F13F4  50  PUSH  EAX    --------------------  此处将EAX改成ECX  能打开程序

第4处  007F140D  51  PUSH  ECX
       007F140E  50  PUSH  EAX    --------------------  此处将EAX改成ECX  能打开程序

第5处  007F16B1  50  PUSH  EAX    --------------------  此处将EAX改成ECX 不能打开程序
       007F16B2  51  PUSH  ECX

下面还有很多连续PUSH  EAX不知为何故?
第6处  007F2748  50  PUSH  EAX    --------------------  下面任一处将EAX改成ECX都能打开程序(下同)
       007F2749  50  PUSH  EAX
          ↓     ↓
   
     ↓     ↓

     ↓     ↓
       OO7F2768  50  PUSH  EAX

第7处  007F2787  50  PUSH  EAX
       007F2788  50  PUSH  EAX

第8处  007F2791  50  PUSH  EAX
          ↓     ↓

     ↓     ↓

     ↓     ↓
    007F279C  50  PUSH  EAX

第9处  007F27A7  50  PUSH  EAX
       007F27A8  50  PUSH  EAX

第10处 007F27B3  50  PUSH  EAX
          ↓     ↓

     ↓     ↓

     ↓     ↓
    007F27BC  50  PUSH  EAX

第11处 007F27D2  50  PUSH  EAX
          ↓     ↓

     ↓     ↓

     ↓     ↓
    007F27DB  50  PUSH  EAX

第12处 007F27F3  50  PUSH  EAX
     ↓     ↓

     ↓     ↓

     ↓     ↓
       007F27FB  50  PUSH  EAX

第13处 007F2807  50  PUSH  EAX
       007F2808  50  PUSH  EAX  

第14处 007F2812  50  PUSH  EAX
          ↓     ↓

     ↓     ↓

     ↓     ↓
    OO7F281B  50  PUSH  EAX

第15处 007F2832  50  PUSH  EAX
       007F2833  50  PUSH  EAX
       007F2834  50  PUSH  EAX
       007F2835  50  PUSH  EAX

第16处 007F2854  50  PUSH  EAX
       007F2855  50  PUSH  EAX

第17处 007F2867  50  PUSH  EAX
       007F2868  50  PUSH  EAX

第18处 007F2872  50  PUSH  EAX
       007F2873  50  PUSH  EAX
       007F2874  50  PUSH  EAX

第19处 007F28A7  50  PUSH  EAX
       007F28A8  50  PUSH  EAX

还有几处,写得手都麻了。。。

我想请高手帮忙,以上是不是就是作者增加的多处验证地方,按照Ohuangkeo的破解思路,是不是要将所有相同的EAX都改成ECX,或者能否将这

些众多相同的地方都删掉。

敬请各位破解高手, 能否帮忙破解并不惜生笔墨写出破解过程和思路,这对我们这些学破解的菜鸟来说无异于巨大的帮助。谢谢!

附Ohuangkeo网友的破解思路及财务分析V6.0Build406的下载地址:http://www.skycn.com/soft/11563.html

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
关于破文已经分析了么~~

A. 程序在用户输入注册码时,如果比较正确就会把注册码放入[HKEY_CURRENT_USER\Software\VB and VBA Program Settings\App_NameP\Registration]处。再程序启动时,会把从注册表里取出注册码,然后比较是否正确。很显然,程序只用一个地方判断注册码,太大意了。

B. 后再沿着刚才改过的地方向上走,找到有一处是调用reg.dll的地方,跟踪发现,这个dll是为程序提供申请码和注册码的算法之内的东东。我还发现,这个申请码怎么这么熟悉,一想,哦,在我破解WinXp总管里见过,一样的嘛。哈哈,真是巧啦。

C.最后提供一个跟踪reg.dll时的一个地址。
0042A8D5 . 0BC0 or eax, eax ; Reg.DecryptStringFun1


都分析好了,还思什么路呀~~~~
2008-6-5 10:34
0
雪    币: 421
活跃值: (83)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
不知所云
这也叫破解分析呀
LZ还是多看看基础东西再动手吧
2008-6-5 12:39
0
雪    币: 246
活跃值: (23)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
V6.9 Build400 加了四层壳,最里面是两层PEbundle 3.01壳,然后是Aspack2.12压缩壳,最外层是Armadillo 3.6标准单进程壳。

ArmFP1.6察看:
<------- 05-06-2008 16:27:10 ------->
E:\FAp\FAp.exe
!- Protected Armadillo
Protection system (Basic)
!- <Protection Options>
Standard protection or Minimum protection
!- <Backup Key Options>
Fixed Backup Keys
!- <Compression Options>
Best/Slowest Compression
!- <Other Options>
!- Version 3.60 22Jan2004

Armadillo 3.60标准单进程壳,且已知程序为VB程序,可不用修改Magic jmp,直接OD载入
bp CreateThread,Shift+F9运行停下,看堆栈:

0012F568   00F1D550  /CALL 到 CreateThread 来自 00F1D54A //返回的是壳代码
0012F56C   00000000  |pSecurity = NULL
0012F570   00000000  |StackSize = 0
0012F574   00F1DAE5  |ThreadFunction = 00F1DAE5
0012F578   00000000  |pThreadParm = NULL
0012F57C   00000000  |CreationFlags = 0
0012F580   0012F588  \pThreadId = 0012F588

Alt+F9来到:

00F1D550    5E              pop     esi                              ; FAp.0083A0F0
00F1D551    C9              leave
00F1D552    C3              retn

F7走过retn来到下面,向下看找call edi,就是到入口的call

00F3457D    6A 00           push    0                //retn后来到这里
00F3457F    C705 DCDBF300 E>mov     dword ptr [F3DBDC], 0F3E6E8      ; ASCII "RC"
00F34589    E8 7231FEFF     call    00F17700
00F3458E    59              pop     ecx
00F3458F    59              pop     ecx
00F34590    E8 4A11FFFF     call    00F256DF
略......
00F345DA    EB 25           jmp     short 00F34601
00F345DC    83F9 01         cmp     ecx, 1
00F345DF    75 22           jnz     short 00F34603
00F345E1    FF76 04         push    dword ptr [esi+4]
00F345E4    FF76 08         push    dword ptr [esi+8]
00F345E7    6A 00           push    0
00F345E9    E8 F110FFFF     call    00F256DF
00F345EE    50              push    eax
00F345EF    A1 9455F400     mov     eax, dword ptr [F45594]
00F345F4    8B48 70         mov     ecx, dword ptr [eax+70]
00F345F7    3348 68         xor     ecx, dword ptr [eax+68]
00F345FA    3348 04         xor     ecx, dword ptr [eax+4]
00F345FD    2BF9            sub     edi, ecx
00F345FF    FFD7            call    edi                //这里就是到入口的Call
00F34601    8BD8            mov     ebx, eax
00F34603    5F              pop     edi
00F34604    8BC3            mov     eax, ebx
00F34606    5E              pop     esi
00F34607    5B              pop     ebx
00F34608    C3              retn

取消CreateThread断点,在00F345FF处按F4,断下,F7进入来到Aspack 2.12的壳入口:

007F1001    60              pushad        //这里Aspack 2.12的壳入口
007F1002    E8 03000000     call    007F100A
007F1007  - E9 EB045D45     jmp     45DC14F7
007F100C    55              push    ebp
007F100D    C3              retn
007F100E    E8 01000000     call    007F1014
007F1013    EB 5D           jmp     short 007F1072

压缩壳,很好跟,注意变形Call和运用F4跳出大循环就行,来到这里:

007F13B0   /75 08           jnz     short 007F13BA
007F13B2   |B8 01000000     mov     eax, 1
007F13B7   |C2 0C00         retn    0C
007F13BA   \68 00F07E00     push    007EF000        //下一个壳PEbundle 3.01的入口
007F13BF    C3              retn                //返回到007EF000

过了retn就来到PEbundle 3.01的入口:

007EF000    9C              pushfd
007EF001    60              pushad
007EF002    E8 02000000     call    007EF009
007EF007    33C0            xor     eax, eax
007EF009    8BC4            mov     eax, esp
007EF00B    83C0 04         add     eax, 4

Ctrl+S搜索命令序列popad/popfd,来到这里:

007EF466    61              popad
007EF467    9D              popfd
007EF468    68 00207E00     push    007E2000        //下一个壳PEbundle 3.01的入口
007EF46D    C3              retn                //返回到007E2000

007EF468处F4,停下,F7走过retn来到007E2000,第二层PEbundle 3.01的入口:

007E2000    9C              pushfd                //第二层PEbundle 3.01的入口
007E2001    60              pushad
007E2002    E8 02000000     call    007E2009
007E2007    33C0            xor     eax, eax
007E2009    8BC4            mov     eax, esp
007E200B    83C0 04         add     eax, 4

继续Ctrl+S搜索命令序列popad/popfd,来到这里:

007E2457   /E9 7A020000     jmp     007E26D6
007E245C   |C785 3D294000 0>mov     dword ptr [ebp+40293D], 1
007E2466   |61              popad
007E2467   |9D              popfd
007E2468   |68 B8994000     push    004099B8        //呵呵,真正的OEP
007E246D   |C3              retn

好了,007E2468处F4,停下,F7走过retn来到真正的入口004099B8:

004099B8     68 049C4000     push    00409C04                         ; ASCII "VB5!6&vb6chs.dll"
004099BD     E8 EEFFFFFF     call    004099B0
004099C2     0000            add     byte ptr [eax], al
004099C4     0000            add     byte ptr [eax], al
004099C6     0000            add     byte ptr [eax], al

打开LordPE-DLX选择FAp.exe进程,Dump Full,得到dumped.exe.打开ImportREC 1.6F,选择FAp.exe进程,
填入OEP:000099B8,IAT AutoSearch,获取输入表,Show Invalid,只有一个:rva:0000104C ptr:00F1B7E1,
这个函数对于VB程序来说就是MSVBVM60!__vbaEnd函数,双击rva:0000104C,替换为MSVBVM60!__vbaEnd函数,
Fix Dump,得到dumped_.exe,运行正常,大小5.58Mb。
优化一下,OD载入dumped_.exe,Alt+M在除.mackt外的所有区段下断点,一直Shift+F9运行到程序界面出现,
查看未使用的区段为4个pebundle区段, .adata, .text1, .adata1, .data1, .reloc, .pdata区段,
用LordPE-DLX打开dumped_.exe,wipe掉这10个区段,重建一下PE,得到dumped__.exe,大小3.48Mb,运行正常。

到此脱壳结束,总结一下,共加了四层壳:

1)Armadillo 3.60 标准单进程壳 脱掉后EP:007F1001
2)Aspack 2.12 压缩壳 脱掉后EP:007EF000
3)PEbundle 3.01 壳 脱掉后EP:007E2000
4)PEbundle 3.01 壳 脱掉后OEP:004099B8

破解:
第一处:
004B9BAC     E8 2FB32900        CALL dumped__.00754EE0
004B9BB1     0FBFD0             MOVSX EDX,AX
004B9BB4     85D2               TEST EDX,EDX
004B9BB6     74 12              JE SHORT dumped__.004B9BCA
004B9BB8     C745 FC 12000000   MOV DWORD PTR SS:[EBP-4],12
004B9BBF     66:C705 0C817600 F>MOV WORD PTR DS:[76810C],0FFFF
004B9BC8     EB 10              JMP SHORT dumped__.004B9BDA

修改为如下:

004B9BAC     E8 2FB32900        CALL dumped__.00754EE0
004B9BB1     33D2               XOR EDX,EDX
004B9BB3     42                 INC EDX
004B9BB4     85D2               TEST EDX,EDX
004B9BB6     74 12              JE SHORT dumped__.004B9BCA
004B9BB8     C745 FC 12000000   MOV DWORD PTR SS:[EBP-4],12
004B9BBF     66:C705 0C817600 F>MOV WORD PTR DS:[76810C],0FFFF
004B9BC8     EB 10              JMP SHORT dumped__.004B9BDA

第二处:
004BA0FA     E8 F1680800        CALL dumped__.005409F0
004BA0FF     0FBFD0             MOVSX EDX,AX
004BA102     85D2               TEST EDX,EDX
004BA104     0F84 08010000      JE dumped__.004BA212
004BA10A     C745 FC 32000000   MOV DWORD PTR SS:[EBP-4],32

修改为如下:

004BA0FA     E8 F1680800        CALL dumped__.005409F0
004BA0FF     33D2               XOR EDX,EDX
004BA101     42                 INC EDX
004BA102     85D2               TEST EDX,EDX
004BA104     0F84 08010000      JE dumped__.004BA212
004BA10A     C745 FC 32000000   MOV DWORD PTR SS:[EBP-4],32

上传的附件:
2008-6-5 17:21
0
雪    币: 1355
活跃值: (339)
能力值: ( LV13,RANK:920 )
在线值:
发帖
回帖
粉丝
5


陨落的又一个共享软件,为其哀悼
2008-6-6 11:12
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
6
小弟对楼主的钦佩真是有如黄河犯滥一发不可收拾...



3楼说的话你要听进去.
2008-6-6 13:16
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
脱壳参考LS的高手即可,脱壳后且优化
大小 3.48MB
版本: V6.0 Build406  下载地址:http://www.skycn.com/soft/11563.html
运行安装的时候显示为V6.0 Build400

关键比较:

CALL 00754EE0
要求返回AX=0FFFF即可注册

爆破:
--------------------------------------------------------------------------------------------------------
跟进 CALL 00754EE0
00755D0E      66:8B85 58FFF>MOV AX,WORD PTR SS:[EBP-A8]---------->修改为:

00755D0E      66:B8 FFFF    MOV AX,0FFFF
00755D12      90            NOP
00755D13      90            NOP
00755D14      90            NOP
--------------------------------------------------------------------------------------------------------
保存修改,这样修改后,所有需要注册才能用的功能开启了,包括保存分析等
不知道还有哪里遗漏?软件不注册好象也没多少限制的吧? 要分析算法? 到 CALL 00754EE0 去看

验证运算过程:
——————————————————————————
通过Reg.GetHardDiskId获取硬盘ID---X

ID倒置---Y
取Y从第二位开始,六位。然后前面连接“FA”---Z
取Z的MD5值---L
将L倒置---M
取M左边5位---SN1
取M右边5位---SN2

将输入的注册码的前面两空连接一起---JN1
将输入的注册码的后面两空连接一起---JN2

通过DecryptStringFun1解密JN1,密钥为Z---BN1
通过DecryptStringFun1解密JN2,密钥为Z---BN2

验证 SN1=BN1 SN2=BN2 即可注册成功
——————————————————————————

逆算解密过程:
——————————————————————————
申请码的MD5值倒置后左5位---Z1
申请码的MD5值倒置后右5位---Z2

通过EncryptStringFun1将Z1加密,密钥为申请码---注册码前10位
通过EncryptStringFun1将Z2加密,密钥为申请码---注册码后10位

格式调整为 AAAA-BBBB-CCCC-DDDD的形式
注意:逆向过程中有些细节,如取数值,宽字符等,要注意下
注册机就不写了,写出来不好意思

将EncryptStringFun1代码帖出来放在VB里面用

Dim lpRegisterCode As String
Dim lpOutBuffer As String * 32
Dim length As Integer
length = Len(Miyao.Text)
If (length = 0) Then
    MsgBox ("密钥不能为空!")
    Miyao.SetFocus
    Exit Sub
End If

lpRegisterCode = "user-E46D333B3BA5BF96"

If (EncryptStringFun1(Yuanwen.Text, Miyao.Text, lpOutBuffer, lpRegisterCode)) Then
    Jieguo.Text = lpOutBuffer
Else
    MsgBox ("Error")

模块:

Public Declare Function EncryptStringFun1 Lib "Reg.DLL" (ByVal lpInBuffer As String, ByVal lpKey As String, ByVal lpOutBuffer

As String, ByVal lpRegisterCode As String) As Long

需要共享软件加密算法库专业版 REG.DLL 文件
_____________________________________________________

整个过程中发现BlowFish算法出现过,但是我不知道它用在程序里到底发挥了什么样的作用
2008-6-6 17:23
0
雪    币: 1355
活跃值: (339)
能力值: ( LV13,RANK:920 )
在线值:
发帖
回帖
粉丝
8
太过分了,建议封帖
2008-6-6 17:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼上的老大,别这么说好不好,我们只是感兴趣而已,并不是出于商业目的。兴趣对于初学者是最大的动力。还是那名话,魔高一尺道高一丈,经验和知识是在不断的较量下积累下来的。对以上提供思路的大虾表示由衷的感谢!
2008-6-16 11:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
非常感谢,开始我不知道此软件加了四层壳,以为只脱完一层壳就了事。后来参照会员WKSWLJ999的思路,我发现此软件的脱壳只要两步就可脱完壳:一是用dilloDIE1.6脱第一层Armadillo3.6壳,用OD加载EP:007F1001;二是用Generic  Unpacker脱壳,第二层Aspack2.12壳和第三层、第四层壳PEbundle3.01就全部一起脱完,用OD加载EP:004099B8。脱壳过程两步到位。再参照会员WKSWLJ999了凡的两种修改方法都可以实现软件已注册现象,只是像我们这些菜鸟不知道为什么要改动这些地方。按我刚入门的知识,这些改动之处好像都不像《加密与解密》书上的经典句式,期待以后的学习中能有WKSWLJ999了凡这样热心的网友帮助我们。总之非常感谢两位,谢谢!
2008-6-17 17:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我是一名新手,不熟悉OD,请教huangfei,如何实现用OD加载EP:007F1001?谢谢
2008-6-28 07:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢了凡,试了多次,终于成功
2008-7-9 20:23
0
游客
登录 | 注册 方可回帖
返回
//