Nisy 发表于 2007-8-12 01:08:18

XXXX助理 Anti-KEYMAKE+SMC研究

和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:
0064501A    8985 84AD4300   MOV DWORD PTR SS:,EAX
00645020    80BD 6EAD4300 0>CMP BYTE PTR SS:,0
00645027    75 15         JNZ SHORT spa.0064503E
00645029    FE85 6EAD4300   INC BYTE PTR SS:
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:
00645044    0385 84AD4300   ADD EAX,DWORD PTR SS:
0064504A    894424 1C       MOV DWORD PTR SS:,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:

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



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

0059ED99    FF52 14         CALL DWORD PTR DS:
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:
0059EDA9    8BD6            MOV EDX,ESI
0059EDAB    A1 D4605A00   MOV EAX,DWORD PTR DS:
0059EDB0    8B38            MOV EDI,DWORD PTR DS:
0059EDB2    FF57 0C         CALL DWORD PTR DS:
0059EDB5    8B55 E4         MOV EDX,DWORD PTR SS:
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:
0059EDCE    E8 D9E3EFFF   CALL spa.0049D1AC
0059EDD3    A1 FC605A00   MOV EAX,DWORD PTR DS:
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:
0059EDE7    A1 F8605A00   MOV EAX,DWORD PTR DS:
0059EDEC    E8 77A1E6FF   CALL spa.00408F68
0059EDF1    8B45 E0         MOV EAX,DWORD PTR SS:
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:
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:            ; 就在这里
0059EE16    C600 01         MOV BYTE PTR DS:,1                  ; 这里向赋值为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:,ECX
004F73B0    53            PUSH EBX
004F73B1    56            PUSH ESI
004F73B2    894D F8         MOV DWORD PTR SS:,ECX
004F73B5    8BF2            MOV ESI,EDX
004F73B7    8945 FC         MOV DWORD PTR SS:,EAX
004F73BA    8B45 F8         MOV EAX,DWORD PTR SS:
004F73BD    E8 4ED5F0FF   CALL spa.00404910
004F73C2    8B45 0C         MOV EAX,DWORD PTR SS:
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:
004F73D5    64:8920         MOV DWORD PTR FS:,ESP
004F73D8    33DB            XOR EBX,EBX
004F73DA    A1 303A5A00   MOV EAX,DWORD PTR DS:
004F73DF    8038 00         CMP BYTE PTR DS:,0
004F73E2    0F85 7F020000   JNZ spa.004F7667                         ; 这里判断的数值,如果为1则不进行算法的计算,这里可不能让他跳转。跳走之后下放的算法部分的代码可就不执行了。
004F73E8    8D55 F4         LEA EDX,DWORD PTR SS:
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:
004F757C    BA B4764F00   MOV EDX,spa.004F76B4                     ; tH4gI8fsU0
004F7581    E8 72CFF0FF   CALL spa.004044F8
004F7586    8B45 0C         MOV EAX,DWORD PTR SS:
004F7589    E8 92D1F0FF   CALL spa.00404720
004F758E    8BF0            MOV ESI,EAX
004F7590    8B45 F0         MOV EAX,DWORD PTR SS:
004F7593    E8 88D1F0FF   CALL spa.00404720                        ; 这里EAX中出现真码
004F7598    3BF0            CMP ESI,EAX
004F759A    74 07         JE SHORT spa.004F75A3

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

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

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







////////////
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
0064501A    8985 84AD4300   mov   dword ptr , eax
00645020    80BD 6EAD4300 0>cmp   byte ptr , 0
00645027    75 15         jnz   short 0064503E
00645029    FE85 6EAD4300   inc   byte ptr
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
00645044    0385 84AD4300   add   eax, dword ptr
0064504A    894424 1C       mov   dword ptr , eax
0064504E    61            popad
0064504F    FFE0            jmp   eax                              ; 这里的JMP EAX 让他跳到到SMC地址//修改为JMP 646747
00645051    80BD A2AE4300 0>cmp   byte ptr , 0         ; 当我们修改JMP EAX后以下两行数据将被覆盖
00645058    74 1D         je      short 00645077
0064505A    8DB5 A3AE4300   lea   esi, dword ptr

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

00646747    66:C705 17844F0>mov   word ptr , 45C6          ; 以下三行//软件启动时的检测
00646750    C705 1A844F00 0>mov   dword ptr , 8B909001
0064675A    C605 2A844F00 E>mov   byte ptr , 0EB
00646761    66:C705 DFCD590>mov   word ptr , 45C6          ; 以下三行//软件注册部分
0064676A    C705 E2CD5900 0>mov   dword ptr , 8B909001
00646774    C605 F2CD5900 E>mov   byte ptr , 0EB
0064677B    C605 CDFF5800 0>mov   byte ptr , 1             ; 以下两行//软件关于部分
00646782    66:C705 C8FF580>mov   word ptr , 9090
0064678B    66:C705 76CE590>mov   word ptr , 45C6          ; 以下三行//功能设置
00646794    C705 79CE5900 0>mov   dword ptr , 8B909001
0064679E    C605 89CE5900 E>mov   byte ptr , 0EB
006467A5    C605 94EB5800 E>mov   byte ptr , 0EB         ; 以下修改解决掉功能限制//文件彻底删除助手
006467AC    C605 5CD75800 E>mov   byte ptr , 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
0064501A    8985 84AD4300   mov   dword ptr , eax
00645020    80BD 6EAD4300 0>cmp   byte ptr , 0
00645027    75 15         jnz   short 0064503E
00645029    FE85 6EAD4300   inc   byte ptr
0064502F    E8 8B170000   call    00645051                         ; 该CALL指向JMP的下一行代码,所以我们还需要修补这里的代码。修改为Call 006467BF

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

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

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

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

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

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

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

0059CDDA    E8 D1A4F5FF   call    004F72B0                         ; 注册
0059CDDF    C645 FB 01      mov   byte ptr , 1

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

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

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

我们设置特征码:
call    004F72B0
cmp   byte ptr , 0

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

0056B567    E8 44BDF8FF   call    004F72B0
0056B56C    807D FB 00      cmp   byte ptr , 0
0056B570    74 0F         je      short 0056B581
0056B572    8B45 FC         mov   eax, dword ptr
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
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 , 0
0056D39D    74 0F         je      short 0056D3AE
0056D39F    8B45 FC         mov   eax, dword ptr
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
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 , 0
00570DB0    74 0F         je      short 00570DC1
00570DB2    8B45 FC         mov   eax, dword ptr
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
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 , 0
00570FA6    74 0F         je      short 00570FB7
00570FA8    8B45 FC         mov   eax, dword ptr
00570FAB    BA 34105700   mov   edx, 00571034                  ; ASCII "YesIKnow"
00570FB0    E8 B738E9FF   call    0040486C
00570FB5    74 19         je      short 00570FD0

weixd02 发表于 2007-8-17 01:42:39

向高手学习了。 下来慢慢研究

飘云 发表于 2007-8-17 09:02:21

学习... 谢谢好文

悠悠魂 发表于 2007-8-18 00:52:28

前天碰到一个软件 也是会反内存注册机的,不知道该怎么办 ,现在终于知道思路了 ,谢谢LZ了。
页: [1]
查看完整版本: XXXX助理 Anti-KEYMAKE+SMC研究