和sfl4800兄弟一起研究一下该软件反内存注册机的机制。国软,下载就不介绍了。大家了解到方法即可。

奇怪的入口点,脱之。
///////////////////////

004AF996 >  90              NOP
004AF997    75 00           JNZ SHORT spa.004AF999
004AF999  - E9 62561900     JMP spa.00645000

///////////////////////

00645000    60              PUSHAD
00645001    E8 00000000     CALL spa.00645006
00645006    5D              POP EBP
00645007    81ED EAA84300   SUB EBP,spa.0043A8EA
0064500D    B8 E4A84300     MOV EAX,spa.0043A8E4
00645012    03C5            ADD EAX,EBP
00645014    2B85 78AD4300   SUB EAX,DWORD PTR SS:[EBP+43AD78]
0064501A    8985 84AD4300   MOV DWORD PTR SS:[EBP+43AD84],EAX
00645020    80BD 6EAD4300 0>CMP BYTE PTR SS:[EBP+43AD6E],0
00645027    75 15           JNZ SHORT spa.0064503E
00645029    FE85 6EAD4300   INC BYTE PTR SS:[EBP+43AD6E]
0064502F    E8 1D000000     CALL spa.00645051
00645034    E8 73020000     CALL spa.006452AC
00645039    E8 0A030000     CALL spa.00645348
0064503E    8B85 70AD4300   MOV EAX,DWORD PTR SS:[EBP+43AD70]
00645044    0385 84AD4300   ADD EAX,DWORD PTR SS:[EBP+43AD84]
0064504A    894424 1C       MOV DWORD PTR SS:[ESP+1C],EAX
0064504E    61              POPAD
0064504F    FFE0            JMP EAX                                  ; 直接F4到这里即可 EAX即OEP

///////////////////////

0059ECC8    55              PUSH EBP                                 ; OEP
0059ECC9    8BEC            MOV EBP,ESP
0059ECCB    B9 0B000000     MOV ECX,0B
0059ECD0    6A 00           PUSH 0
0059ECD2    6A 00           PUSH 0
0059ECD4    49              DEC ECX
0059ECD5  ^ 75 F9           JNZ SHORT spa.0059ECD0

软件的注册信息是放到保存到这里的:
HKEY_LOCAL_MACHINE\SOFTWARE\lsjsoft\spa

当我们输入用户名和名后,软件才调用算法部分。这一手不错 :24ab: 

我们点软件“关于”,从这里可以顺藤摸瓜找到软件的算法,明码比较,奇怪的是软件反内存注册机,呵呵。我们来研究一下他反内存注册机的机制。我们看到这一幅图片,可疑吧:

http://www.chinadforce.com/attachments/day_070726/01_ODSl5MS9T4RB.gif

/////////////////////

0059ED99    FF52 14         CALL DWORD PTR DS:[EDX+14]
0059ED9C    8BD8            MOV EBX,EAX
0059ED9E    4B              DEC EBX
0059ED9F    85DB            TEST EBX,EBX
0059EDA1    7C 7C           JL SHORT spa.0059EE1F                         ; 这里一开始是实现跳转的,当软件监控到有以下内容的时候,这就不跳转了。(只要监控到一次,以后就永久不跳了)
0059EDA3    43              INC EBX
0059EDA4    33F6            XOR ESI,ESI
0059EDA6    8D4D E4         LEA ECX,DWORD PTR SS:[EBP-1C]
0059EDA9    8BD6            MOV EDX,ESI
0059EDAB    A1 D4605A00     MOV EAX,DWORD PTR DS:[5A60D4]
0059EDB0    8B38            MOV EDI,DWORD PTR DS:[EAX]
0059EDB2    FF57 0C         CALL DWORD PTR DS:[EDI+C]
0059EDB5    8B55 E4         MOV EDX,DWORD PTR SS:[EBP-1C]
0059EDB8    B8 DC605A00     MOV EAX,spa.005A60DC
0059EDBD    E8 F256E6FF     CALL spa.004044B4
0059EDC2    BA E0605A00     MOV EDX,spa.005A60E0
0059EDC7    33C9            XOR ECX,ECX
0059EDC9    A1 DC605A00     MOV EAX,DWORD PTR DS:[5A60DC]
0059EDCE    E8 D9E3EFFF     CALL spa.0049D1AC
0059EDD3    A1 FC605A00     MOV EAX,DWORD PTR DS:[5A60FC]
0059EDD8    BA D4F15900     MOV EDX,spa.0059F1D4                     ; 注册器
0059EDDD    E8 8A5AE6FF     CALL spa.0040486C
0059EDE2    74 2D           JE SHORT spa.0059EE11
0059EDE4    8D55 E0         LEA EDX,DWORD PTR SS:[EBP-20]
0059EDE7    A1 F8605A00     MOV EAX,DWORD PTR DS:[5A60F8]
0059EDEC    E8 77A1E6FF     CALL spa.00408F68
0059EDF1    8B45 E0         MOV EAX,DWORD PTR SS:[EBP-20]
0059EDF4    BA E4F15900     MOV EDX,spa.0059F1E4                     ; KEYMAKE.EXE
0059EDF9    E8 6E5AE6FF     CALL spa.0040486C
0059EDFE    74 11           JE SHORT spa.0059EE11
0059EE00    A1 E0605A00     MOV EAX,DWORD PTR DS:[5A60E0]
0059EE05    BA F8F15900     MOV EDX,spa.0059F1F8                     ; 张湘平
0059EE0A    E8 5D5AE6FF     CALL spa.0040486C
0059EE0F    75 0A           JNZ SHORT spa.0059EE1B
0059EE11    A1 303A5A00     MOV EAX,DWORD PTR DS:[5A3A30]            ; [5A3A30]就在这里
0059EE16    C600 01         MOV BYTE PTR DS:[EAX],1                  ; 这里向[5A3A30]赋值为1
0059EE19    EB 04           JMP SHORT spa.0059EE1F
0059EE1B    46              INC ESI
0059EE1C    4B              DEC EBX
0059EE1D  ^ 75 87           JNZ SHORT spa.0059EDA6
0059EE1F    33C0            XOR EAX,EAX
0059EE21    5A              POP EDX

////////////////////////////////

004F733A    E8 5D000000     CALL spa.004F739C                        ; 这个CALL就是算法CALL,我们F7跟进
004F733F    84C0            TEST AL,AL

/////////////////////////////

004F739C    55              PUSH EBP
004F739D    8BEC            MOV EBP,ESP
004F739F    51              PUSH ECX
004F73A0    B9 05000000     MOV ECX,5
004F73A5    6A 00           PUSH 0
004F73A7    6A 00           PUSH 0
004F73A9    49              DEC ECX
004F73AA  ^ 75 F9           JNZ SHORT spa.004F73A5
004F73AC    51              PUSH ECX
004F73AD    874D FC         XCHG DWORD PTR SS:[EBP-4],ECX
004F73B0    53              PUSH EBX
004F73B1    56              PUSH ESI
004F73B2    894D F8         MOV DWORD PTR SS:[EBP-8],ECX
004F73B5    8BF2            MOV ESI,EDX
004F73B7    8945 FC         MOV DWORD PTR SS:[EBP-4],EAX
004F73BA    8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]
004F73BD    E8 4ED5F0FF     CALL spa.00404910
004F73C2    8B45 0C         MOV EAX,DWORD PTR SS:[EBP+C]
004F73C5    E8 46D5F0FF     CALL spa.00404910
004F73CA    33C0            XOR EAX,EAX
004F73CC    55              PUSH EBP
004F73CD    68 8A764F00     PUSH spa.004F768A
004F73D2    64:FF30         PUSH DWORD PTR FS:[EAX]
004F73D5    64:8920         MOV DWORD PTR FS:[EAX],ESP
004F73D8    33DB            XOR EBX,EBX
004F73DA    A1 303A5A00     MOV EAX,DWORD PTR DS:[5A3A30]
004F73DF    8038 00         CMP BYTE PTR DS:[EAX],0
004F73E2    0F85 7F020000   JNZ spa.004F7667                         ; 这里判断[5A3A30]的数值,如果为1则不进行算法的计算,这里可不能让他跳转。跳走之后下放的算法部分的代码可就不执行了。
004F73E8    8D55 F4         LEA EDX,DWORD PTR SS:[EBP-C]
004F73EB    B8 A4764F00     MOV EAX,spa.004F76A4                     ; SOFTAA
004F73F0    E8 FB63FAFF     CALL spa.0049D7F0

/////////////////////////////

004F7574    E8 BB87FDFF     CALL spa.004CFD34
004F7579    8D45 EC         LEA EAX,DWORD PTR SS:[EBP-14]
004F757C    BA B4764F00     MOV EDX,spa.004F76B4                     ; tH4gI8fsU0
004F7581    E8 72CFF0FF     CALL spa.004044F8
004F7586    8B45 0C         MOV EAX,DWORD PTR SS:[EBP+C]
004F7589    E8 92D1F0FF     CALL spa.00404720
004F758E    8BF0            MOV ESI,EAX
004F7590    8B45 F0         MOV EAX,DWORD PTR SS:[EBP-10]
004F7593    E8 88D1F0FF     CALL spa.00404720                        ; 这里EAX中出现真码
004F7598    3BF0            CMP ESI,EAX
004F759A    74 07           JE SHORT spa.004F75A3

////////////////////////////// 

于是搞清楚了反KG机制,我们的内存注册机自然也就出生了。软件呢只要见到一次出现“张湘平/KEYMAKE.EXE/” 它就再也不执行算法部分了,所以我们修改一下地址中的数据(注意哦,一修改这里,内存注册机卡吧可就报毒了),设置如图,我们看一下胜利截图。

软件的算法不难,有兴趣的朋友自己研究下吧。

http://www.chinadforce.com/attachments/day_070726/03_owWNezKuBCKJ.gif
http://www.chinadforce.com/attachments/day_070726/04_KYRA0qD5zAVb.gif
http://www.chinadforce.com/attachments/day_070726/02_f7KRFueDcfsF.gif

////////////
SMC暴破研究

00645000    60              pushad
00645001    E8 00000000     call    00645006
00645006    5D              pop     ebp
00645007    81ED EAA84300   sub     ebp, 0043A8EA
0064500D    B8 E4A84300     mov     eax, 0043A8E4
00645012    03C5            add     eax, ebp
00645014    2B85 78AD4300   sub     eax, dword ptr [ebp+43AD78]
0064501A    8985 84AD4300   mov     dword ptr [ebp+43AD84], eax
00645020    80BD 6EAD4300 0>cmp     byte ptr [ebp+43AD6E], 0
00645027    75 15           jnz     short 0064503E
00645029    FE85 6EAD4300   inc     byte ptr [ebp+43AD6E]
0064502F    E8 1D000000     call    00645051                         ; 我们看这里 645051即是JMP EAX的下一行代码,当我们SMC的时候,我们还需要修补这里的代码。
00645034    E8 73020000     call    006452AC
00645039    E8 0A030000     call    00645348
0064503E    8B85 70AD4300   mov     eax, dword ptr [ebp+43AD70]
00645044    0385 84AD4300   add     eax, dword ptr [ebp+43AD84]
0064504A    894424 1C       mov     dword ptr [esp+1C], eax
0064504E    61              popad
0064504F    FFE0            jmp     eax                              ; 这里的JMP EAX 让他跳到到SMC地址//修改为JMP 646747
00645051    80BD A2AE4300 0>cmp     byte ptr [ebp+43AEA2], 0         ; 当我们修改JMP EAX后以下两行数据将被覆盖
00645058    74 1D           je      short 00645077
0064505A    8DB5 A3AE4300   lea     esi, dword ptr [ebp+43AEA3]

/////////////////////////////

00646747    66:C705 17844F0>mov     word ptr [4F8417], 45C6          ; 以下三行//软件启动时的检测
00646750    C705 1A844F00 0>mov     dword ptr [4F841A], 8B909001
0064675A    C605 2A844F00 E>mov     byte ptr [4F842A], 0EB
00646761    66:C705 DFCD590>mov     word ptr [59CDDF], 45C6          ; 以下三行//软件注册部分
0064676A    C705 E2CD5900 0>mov     dword ptr [59CDE2], 8B909001
00646774    C605 F2CD5900 E>mov     byte ptr [59CDF2], 0EB
0064677B    C605 CDFF5800 0>mov     byte ptr [58FFCD], 1             ; 以下两行//软件关于部分
00646782    66:C705 C8FF580>mov     word ptr [58FFC8], 9090
0064678B    66:C705 76CE590>mov     word ptr [59CE76], 45C6          ; 以下三行//功能设置
00646794    C705 79CE5900 0>mov     dword ptr [59CE79], 8B909001
0064679E    C605 89CE5900 E>mov     byte ptr [59CE89], 0EB
006467A5    C605 94EB5800 E>mov     byte ptr [58EB94], 0EB           ; 以下修改解决掉功能限制//文件彻底删除助手
006467AC    C605 5CD75800 E>mov     byte ptr [58D75C], 0EB           ; 文件分割助手
006467B3  - E9 1085F5FF     jmp     0059ECC8                         ; 返回到OEP // 如有功能限制继续添加

二进制代码如下:

66 C7 05 17 84 4F 00 C6 45 C7 05 1A 84 4F 00 01 90 90 8B C6 05 2A 84 4F 00 EB 66 C7 05 DF CD 59
00 C6 45 C7 05 E2 CD 59 00 01 90 90 8B C6 05 F2 CD 59 00 EB C6 05 CD FF 58 00 01 66 C7 05 C8 FF
58 00 90 90 66 C7 05 76 CE 59 00 C6 45 C7 05 79 CE 59 00 01 90 90 8B C6 05 89 CE 59 00 EB C6 05
94 EB 58 00 EB C6 05 5C D7 58 00 EB E9 10 85 F5 FF

///////////////////////////

打上SMC补丁数据后,发现程序无法运行,重载发现端倪:

00645000    60              pushad
00645001    E8 00000000     call    00645006
00645006    5D              pop     ebp
00645007    81ED EAA84300   sub     ebp, 0043A8EA
0064500D    B8 E4A84300     mov     eax, 0043A8E4
00645012    03C5            add     eax, ebp
00645014    2B85 78AD4300   sub     eax, dword ptr [ebp+43AD78]
0064501A    8985 84AD4300   mov     dword ptr [ebp+43AD84], eax
00645020    80BD 6EAD4300 0>cmp     byte ptr [ebp+43AD6E], 0
00645027    75 15           jnz     short 0064503E
00645029    FE85 6EAD4300   inc     byte ptr [ebp+43AD6E]
0064502F    E8 8B170000     call    00645051                         ; 该CALL指向JMP的下一行代码,所以我们还需要修补这里的代码。修改为Call 006467BF

////////////////

006467BF    80BD A2AE4300 0>cmp     byte ptr [ebp+43AEA2], 0         ; 我们在这里写入数据,需要写两行。    
006467C6  ^ 0F84 ABE8FFFF   je      00645077
006467CC  ^ E9 89E8FFFF     jmp     0064505A                         ; 返回

////////////////

再次保存,软件就OK了。我们再翻回头来看一下软件对功能使用时的条件判断:

当程序返回软件算法CALL  004F72B0时候,出现以下汇编语句:

call    004F72B0
cmp     byte ptr [ebp-5], 0   //都在比较[ebp-5]的数值是否为0
je                            //如果是0则挂掉 

遗憾的是我没在算法CALL找到对[ebp-5]赋值的语句,有兴趣的朋友可以找一下,所以我全部做了这样的修改:

0059CDDA    E8 D1A4F5FF     call    004F72B0                         ; 注册
0059CDDF    C645 FB 01      mov     byte ptr [ebp-5], 1

0059CE71    E8 3AA4F5FF     call    004F72B0                         ; 功能设置
0059CE76    C645 FB 01      mov     byte ptr [ebp-5], 1

0058D753    E8 589BF6FF     call    004F72B0
0058D758    C645 FB 00      mov     byte ptr [ebp-5], 1              ; 文件分割助手

0058EB8B    E8 2087F6FF     call    004F72B0
0058EB90    C645 FB 00      mov     byte ptr [ebp-5], 1              ; 文件彻底删除助手

我们设置特征码:
call    004F72B0
cmp     byte ptr [ebp-5], 0

Ctrl+S搜索该特征码,找到这样一些数据,猜测这些可以还是对一些功能使用上的判断,修改方法和上文相同,这里就不继续研究了。

0056B567    E8 44BDF8FF     call    004F72B0
0056B56C    807D FB 00      cmp     byte ptr [ebp-5], 0
0056B570    74 0F           je      short 0056B581
0056B572    8B45 FC         mov     eax, dword ptr [ebp-4]
0056B575    BA ACB65600     mov     edx, 0056B6AC                    ; ASCII "YesIKnow"
0056B57A    E8 ED92E9FF     call    0040486C
0056B57F    74 12           je      short 0056B593
0056B581    8D83 50030000   lea     eax, dword ptr [ebx+350]
0056B587    BA C0B65600     mov     edx, 0056B6C0                    ; ASCII " Top 5 "
0056B58C    E8 238FE9FF     call    004044B4
0056B591    EB 0B           jmp     short 0056B59E

0056D394    E8 179FF8FF     call    004F72B0
0056D399    807D FB 00      cmp     byte ptr [ebp-5], 0
0056D39D    74 0F           je      short 0056D3AE
0056D39F    8B45 FC         mov     eax, dword ptr [ebp-4]
0056D3A2    BA E0D45600     mov     edx, 0056D4E0                    ; ASCII "YesIKnow"
0056D3A7    E8 C074E9FF     call    0040486C
0056D3AC    74 12           je      short 0056D3C0
0056D3AE    8D83 34030000   lea     eax, dword ptr [ebx+334]
0056D3B4    BA F4D45600     mov     edx, 0056D4F4                    ; ASCII " Top 5 "
0056D3B9    E8 F670E9FF     call    004044B4
0056D3BE    EB 0B           jmp     short 0056D3CB

00570DA7    E8 0465F8FF     call    004F72B0
00570DAC    807D FB 00      cmp     byte ptr [ebp-5], 0
00570DB0    74 0F           je      short 00570DC1
00570DB2    8B45 FC         mov     eax, dword ptr [ebp-4]
00570DB5    BA 7C0E5700     mov     edx, 00570E7C                    ; ASCII "YesIKnow"
00570DBA    E8 AD3AE9FF     call    0040486C
00570DBF    74 12           je      short 00570DD3
00570DC1    8D83 20030000   lea     eax, dword ptr [ebx+320]
00570DC7    BA 900E5700     mov     edx, 00570E90                    ; ASCII " Top 1 "
00570DCC    E8 E336E9FF     call    004044B4
00570DD1    EB 0B           jmp     short 00570DDE

00570F9D    E8 0E63F8FF     call    004F72B0
00570FA2    807D FB 00      cmp     byte ptr [ebp-5], 0
00570FA6    74 0F           je      short 00570FB7
00570FA8    8B45 FC         mov     eax, dword ptr [ebp-4]
00570FAB    BA 34105700     mov     edx, 00571034                    ; ASCII "YesIKnow"
00570FB0    E8 B738E9FF     call    0040486C
00570FB5    74 19           je      short 00570FD0


http://www.chinadforce.com/attachments/day_070727/00_9w3SkukHIXAH.gif