【目     标】:xxxx(外挂程序,不便写出名字)
【工     具】:Olydbg1.1(diy版)、LORDPE、ImportREC1.6F 
【任     务】:修复输入表 
【操作平台】:WinXP sp2 
【作     者】: LOVEBOOM[DFCG][FCG][US]
【简要说明】: 人生就是一个脱壳破解过程,当你脱壳过程中遇到很多问题不能解决的时候,人会苦烦,当人生有挫折的时候人会有无助,有伤心(自己都没有底你怎么去答应你的那个她呢,如何给对方,给自己的一个承诺)。当你的基础高的时候你会脱了,你又会发现其中的乐趣。人生路漫长曲折,脱壳软件,破解人生(心情不是很好,看到自己的现在,很有失落的感觉,因此在人生路上做个标记)
以前写过一篇这个版本的文章,现在补上一篇,为自己加深点记忆。这篇文章之所以没有写怎么样找回STOLEN CODE的原因是stolen code没有什么技巧可言,也没有什么弯路可走。只能Step by step的来。
【详细过程】:
设置:忽略除INT3之外的全部异常项。隐藏好OD。
载入后:
00401000 >  68 01604800     PUSH 00486001                            ; 壳EP
00401005    E8 01000000     CALL 0040100B
F9运行一次INT3异常中断:
009F341F    90              NOP                                      ; INT 3 Exception
009F3420    EB 01           JMP SHORT 009F3423
……
这里向下找到第一个RETN:
……
009F34C2    5B              POP EBX                                  ; 找到这里
009F34C3    5A              POP EDX
009F34C4    59              POP ECX
009F34C5    C3              RETN                                     ; 在这里下断
在009F34C5处下断,这里下断的作用是方便后面到STOLEN CODE处。CTRL+F查找命令’CMP AL,2’找到那个远程条件跳:
009ECCCC    84C0            TEST AL,AL                               ; AL ==0的情况
009ECCCE    75 20           JNZ SHORT 009ECCF0                       ; 找到后在这里下断
009ECCD0    68 48C79E00     PUSH 9EC748
009ECCD5    68 08BB9E00     PUSH 9EBB08
009ECCDA    68 60C79E00     PUSH 9EC760
009ECCDF    56              PUSH ESI
009ECCE0    8D43 08         LEA EAX,DWORD PTR DS:[EBX+8]
009ECCE3    50              PUSH EAX
009ECCE4    8B4424 28       MOV EAX,DWORD PTR SS:[ESP+28]
009ECCE8    50              PUSH EAX
009ECCE9    E8 82FAFFFF     CALL 009EC770
009ECCEE  ^ EB 83           JMP SHORT 009ECC73
009ECCF0    3C 02           CMP AL,2                                 ; 找到这里,这里判断AL == 2的情况
009ECCF2    0F85 14010000   JNZ 009ECE0C
在009ECCCE处下断,然后shift+f9运行,这样就会中断009ECCCE处了。
在这个程序里壳也只出现过AL=0124的情况,没有AL=35的情况。
中断后慢慢分析,分析完再修改代码:
009ECCCC    84C0            TEST AL,AL                               ; AL ==0的情况
009ECCCE    75 20           JNZ SHORT 009ECCF0                       ; 找到后在这里下断
009ECCD0    68 48C79E00     PUSH 9EC748
009ECCD5    68 08BB9E00     PUSH 9EBB08
009ECCDA    68 60C79E00     PUSH 9EC760
009ECCDF    56              PUSH ESI
009ECCE0    8D43 08         LEA EAX,DWORD PTR DS:[EBX+8]
009ECCE3    50              PUSH EAX
009ECCE4    8B4424 28       MOV EAX,DWORD PTR SS:[ESP+28]
009ECCE8    50              PUSH EAX
009ECCE9    E8 82FAFFFF     CALL 009EC770                            ; AL=0里的处理,这里要跟进,上次的的那篇没有al=0的情况
跟进看一下:
009EC770    55              PUSH EBP
009EC771    8BEC            MOV EBP,ESP
009EC773    53              PUSH EBX
009EC774    56              PUSH ESI
009EC775    8B45 0C         MOV EAX,DWORD PTR SS:[EBP+C]
009EC778    EB 01           JMP SHORT 009EC77B
009EC77A    9A 8B108B32 830>CALL FAR 0083:328B108B                   ; Far call
009EC781    04 6A           ADD AL,6A
009EC783    04 FF           ADD AL,0FF
009EC785    55              PUSH EBP
009EC786    14 8B           ADC AL,8B
009EC788    D8EB            FSUBR ST,ST(3)
009EC78A    01E9            ADD ECX,EBP
009EC78C    56              PUSH ESI
009EC78D    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
009EC790    50              PUSH EAX
009EC791    FF55 18         CALL DWORD PTR SS:[EBP+18]
009EC794    90              NOP
009EC795    90              NOP
009EC796    90              NOP
009EC797    8903            MOV DWORD PTR DS:[EBX],EAX               ; 这里开始填充壳申请的地址,所以这里要改一下代码
009EC799    8B45 10         MOV EAX,DWORD PTR SS:[EBP+10]
009EC79C    8918            MOV DWORD PTR DS:[EAX],EBX
009EC79E    5E              POP ESI
009EC79F    5B              POP EBX
009EC7A0    5D              POP EBP
009EC7A1    C2 1800         RETN 18
……
009ECCEE  ^\EB 83           JMP SHORT 009ECC73
009ECCF0    3C 02           CMP AL,2                                 ; 找到这里,这里判断AL == 2的情况
009ECCF2    0F85 14010000   JNZ 009ECE0C
009ECCF8    33C0            XOR EAX,EAX
009ECCFA    894424 20       MOV DWORD PTR SS:[ESP+20],EAX
009ECCFE    8B43 08         MOV EAX,DWORD PTR DS:[EBX+8]
009ECD01    8A00            MOV AL,BYTE PTR DS:[EAX]
009ECD03    FF43 08         INC DWORD PTR DS:[EBX+8]
009ECD06    EB 01           JMP SHORT 009ECD09
009ECD08    C7              ???                                      ; Unknown command
009ECD09    2C 01           SUB AL,1
009ECD0B    73 34           JNB SHORT 009ECD41
009ECD0D    8BC3            MOV EAX,EBX
009ECD0F    E8 08F1FFFF     CALL 009EBE1C
009ECD14    8B43 08         MOV EAX,DWORD PTR DS:[EBX+8]
009ECD17    0FB600          MOVZX EAX,BYTE PTR DS:[EAX]
009ECD1A    FF43 08         INC DWORD PTR DS:[EBX+8]
009ECD1D    8B53 08         MOV EDX,DWORD PTR DS:[EBX+8]
009ECD20    8B12            MOV EDX,DWORD PTR DS:[EDX]
009ECD22    8343 08 04      ADD DWORD PTR DS:[EBX+8],4
009ECD26    8D4C24 24       LEA ECX,DWORD PTR SS:[ESP+24]
009ECD2A    51              PUSH ECX
009ECD2B    8A4C24 0B       MOV CL,BYTE PTR SS:[ESP+B]
009ECD2F    51              PUSH ECX
009ECD30    8BCA            MOV ECX,EDX
009ECD32    8BD3            MOV EDX,EBX
009ECD34    92              XCHG EAX,EDX
009ECD35    E8 26F8FFFF     CALL 009EC560
009ECD3A    894424 20       MOV DWORD PTR SS:[ESP+20],EAX
009ECD3E    EB 01           JMP SHORT 009ECD41
009ECD40    9A 8B43088B 288>CALL FAR 8328:8B08438B                   ; Far call
009ECD47    43              INC EBX
009ECD48    08048B          OR BYTE PTR DS:[EBX+ECX*4],AL
009ECD4B    44              INC ESP
009ECD4C    24 10           AND AL,10
009ECD4E    E8 F957FEFF     CALL 009D254C
009ECD53    894424 0C       MOV DWORD PTR SS:[ESP+C],EAX
009ECD57    8BD5            MOV EDX,EBP
009ECD59    8B4424 14       MOV EAX,DWORD PTR SS:[ESP+14]
009ECD5D    E8 DEECFFFF     CALL 009EBA40                            ; GetProcAddress
009ECD62    8BE8            MOV EBP,EAX
009ECD64    85ED            TEST EBP,EBP
009ECD66    75 0A           JNZ SHORT 009ECD72
009ECD68    68 C8D09E00     PUSH 9ED0C8                              ; ASCII "10
"
009ECD6D    E8 BE6DFFFF     CALL 009E3B30
009ECD72    837C24 20 00    CMP DWORD PTR SS:[ESP+20],0
009ECD77    74 44           JE SHORT 009ECDBD
009ECD79    8B4424 0C       MOV EAX,DWORD PTR SS:[ESP+C]
009ECD7D    8B5424 20       MOV EDX,DWORD PTR SS:[ESP+20]
009ECD81    8910            MOV DWORD PTR DS:[EAX],EDX
009ECD83    8B4424 20       MOV EAX,DWORD PTR SS:[ESP+20]
009ECD87    034424 24       ADD EAX,DWORD PTR SS:[ESP+24]
009ECD8B    C600 68         MOV BYTE PTR DS:[EAX],68
009ECD8E    6A 00           PUSH 0
009ECD90    68 08BC9E00     PUSH 9EBC08
009ECD95    8D4C24 20       LEA ECX,DWORD PTR SS:[ESP+20]
009ECD99    8BD5            MOV EDX,EBP
009ECD9B    8BC3            MOV EAX,EBX
009ECD9D    E8 CAF5FFFF     CALL 009EC36C
009ECDA2    8B5424 20       MOV EDX,DWORD PTR SS:[ESP+20]
009ECDA6    035424 24       ADD EDX,DWORD PTR SS:[ESP+24]
009ECDAA    42              INC EDX
009ECDAB    8902            MOV DWORD PTR DS:[EDX],EAX
009ECDAD    8B4424 20       MOV EAX,DWORD PTR SS:[ESP+20]
009ECDB1    034424 24       ADD EAX,DWORD PTR SS:[ESP+24]
009ECDB5    83C0 05         ADD EAX,5
009ECDB8    C600 C3         MOV BYTE PTR DS:[EAX],0C3
009ECDBB    EB 29           JMP SHORT 009ECDE6
009ECDBD    6A 00           PUSH 0
009ECDBF    68 08BC9E00     PUSH 9EBC08
009ECDC4    8D4C24 20       LEA ECX,DWORD PTR SS:[ESP+20]
009ECDC8    8BD5            MOV EDX,EBP
009ECDCA    8BC3            MOV EAX,EBX
009ECDCC    E8 9BF5FFFF     CALL 009EC36C
009ECDD1    8B5424 0C       MOV EDX,DWORD PTR SS:[ESP+C]
009ECDD5    8902            MOV DWORD PTR DS:[EDX],EAX
009ECDD7    8D4C24 0C       LEA ECX,DWORD PTR SS:[ESP+C]
009ECDDB    8A5424 07       MOV DL,BYTE PTR SS:[ESP+7]
009ECDDF    8BC3            MOV EAX,EBX
009ECDE1    E8 FAF7FFFF     CALL 009EC5E0
009ECDE6    8BC6            MOV EAX,ESI
009ECDE8    83E8 02         SUB EAX,2
009ECDEB    66:8338 00      CMP WORD PTR DS:[EAX],0
009ECDEF    75 10           JNZ SHORT 009ECE01
009ECDF1    8B5424 0C       MOV EDX,DWORD PTR SS:[ESP+C]
009ECDF5    8B12            MOV EDX,DWORD PTR DS:[EDX]
009ECDF7    E8 8469FFFF     CALL 009E3780                            ; AL ==2时的处理,这里也跟进
跟进:
009E3780    53              PUSH EBX
009E3781    8BD8            MOV EBX,EAX
009E3783    8BC3            MOV EAX,EBX
009E3785    E8 56FFFFFF     CALL 009E36E0
009E378A    C603 E8         MOV BYTE PTR DS:[EBX],0E8                ; 改成Call xxx的方式,这里也要修改下
009E378D    43              INC EBX
009E378E    8903            MOV DWORD PTR DS:[EBX],EAX
009E3790    5B              POP EBX
009E3791    C3              RETN
……
009ECDFC  ^\E9 72FEFFFF     JMP 009ECC73
009ECE01    8B4424 0C       MOV EAX,DWORD PTR SS:[ESP+C]
009ECE05    8906            MOV DWORD PTR DS:[ESI],EAX
009ECE07  ^ E9 67FEFFFF     JMP 009ECC73
009ECE0C    3C 01           CMP AL,1                                 ; AL == 1时的情况
009ECE0E    0F85 B2000000   JNZ 009ECEC6
009ECE14    EB 01           JMP SHORT 009ECE17
009ECE16    9A 8B43088B 008>CALL FAR 8900:8B08438B                   ; Far call
009ECE1D    04 24           ADD AL,24
009ECE1F    8343 08 04      ADD DWORD PTR DS:[EBX+8],4
009ECE23    837B 44 00      CMP DWORD PTR DS:[EBX+44],0
009ECE27    74 09           JE SHORT 009ECE32
009ECE29    8B0424          MOV EAX,DWORD PTR SS:[ESP]
009ECE2C    FF53 44         CALL DWORD PTR DS:[EBX+44]
009ECE2F    890424          MOV DWORD PTR SS:[ESP],EAX
009ECE32    8B43 08         MOV EAX,DWORD PTR DS:[EBX+8]
009ECE35    66:8B00         MOV AX,WORD PTR DS:[EAX]
009ECE38    66:894424 04    MOV WORD PTR SS:[ESP+4],AX
009ECE3D    8343 08 02      ADD DWORD PTR DS:[EBX+8],2
009ECE41    807C24 1C 00    CMP BYTE PTR SS:[ESP+1C],0
009ECE46    74 0B           JE SHORT 009ECE53
009ECE48    8B4424 28       MOV EAX,DWORD PTR SS:[ESP+28]
009ECE4C    C64424 1C 00    MOV BYTE PTR SS:[ESP+1C],0
009ECE51    EB 06           JMP SHORT 009ECE59
009ECE53    8B4424 18       MOV EAX,DWORD PTR SS:[ESP+18]
009ECE57    8B00            MOV EAX,DWORD PTR DS:[EAX]
009ECE59    8BC8            MOV ECX,EAX
009ECE5B    66:8B5424 04    MOV DX,WORD PTR SS:[ESP+4]
009ECE60    8B43 08         MOV EAX,DWORD PTR DS:[EBX+8]
009ECE63    E8 8CACFFFF     CALL 009E7AF4
009ECE68    8B4424 10       MOV EAX,DWORD PTR SS:[ESP+10]
009ECE6C    E8 DB56FEFF     CALL 009D254C
009ECE71    894424 0C       MOV DWORD PTR SS:[ESP+C],EAX
009ECE75    8B43 08         MOV EAX,DWORD PTR DS:[EBX+8]
009ECE78    50              PUSH EAX
009ECE79    8B4424 18       MOV EAX,DWORD PTR SS:[ESP+18]
009ECE7D    50              PUSH EAX
009ECE7E    A1 B8A69F00     MOV EAX,DWORD PTR DS:[9FA6B8]
009ECE83    8B00            MOV EAX,DWORD PTR DS:[EAX]
009ECE85    FFD0            CALL EAX                                 ; GetProcAddress
009ECE87    8BE8            MOV EBP,EAX
009ECE89    85ED            TEST EBP,EBP
009ECE8B    75 0A           JNZ SHORT 009ECE97                       ; 如果获取失败就over了
009ECE8D    68 D8D09E00     PUSH 9ED0D8                              ; ASCII "11
"
009ECE92    E8 996CFFFF     CALL 009E3B30
009ECE97    8B0424          MOV EAX,DWORD PTR SS:[ESP]
009ECE9A    50              PUSH EAX
009ECE9B    68 08BC9E00     PUSH 9EBC08
009ECEA0    8D4C24 20       LEA ECX,DWORD PTR SS:[ESP+20]
009ECEA4    8BD5            MOV EDX,EBP
009ECEA6    8BC3            MOV EAX,EBX
009ECEA8    E8 BFF4FFFF     CALL 009EC36C
009ECEAD    8B5424 0C       MOV EDX,DWORD PTR SS:[ESP+C]             ; AL ==1时的处理
009ECEB1    8902            MOV DWORD PTR DS:[EDX],EAX               ; 这里也要修改才行
009ECEB3    8B4424 0C       MOV EAX,DWORD PTR SS:[ESP+C]
009ECEB7    8906            MOV DWORD PTR DS:[ESI],EAX
009ECEB9    0FB74424 04     MOVZX EAX,WORD PTR SS:[ESP+4]
009ECEBE    0143 08         ADD DWORD PTR DS:[EBX+8],EAX
009ECEC1  ^ E9 ADFDFFFF     JMP 009ECC73
009ECEC6    3C 04           CMP AL,4                                 ; AL ==4时的情况
009ECEC8    0F85 F4000000   JNZ 009ECFC2
009ECECE    90              NOP
009ECECF    90              NOP
009ECED0    90              NOP
009ECED1    8B43 08         MOV EAX,DWORD PTR DS:[EBX+8]
009ECED4    8A00            MOV AL,BYTE PTR DS:[EAX]
009ECED6    FF43 08         INC DWORD PTR DS:[EBX+8]
009ECED9    84C0            TEST AL,AL
009ECEDB    75 5B           JNZ SHORT 009ECF38                       ; 如果不相等则跳去AL==4的第二个分支处理
009ECEDD    8B43 08         MOV EAX,DWORD PTR DS:[EBX+8]
009ECEE0    8B30            MOV ESI,DWORD PTR DS:[EAX]
009ECEE2    8343 08 04      ADD DWORD PTR DS:[EBX+8],4
009ECEE6    8B43 08         MOV EAX,DWORD PTR DS:[EBX+8]
009ECEE9    8B28            MOV EBP,DWORD PTR DS:[EAX]
009ECEEB    8343 08 04      ADD DWORD PTR DS:[EBX+8],4
009ECEEF    8B43 08         MOV EAX,DWORD PTR DS:[EBX+8]
009ECEF2    8B00            MOV EAX,DWORD PTR DS:[EAX]
009ECEF4    894424 2C       MOV DWORD PTR SS:[ESP+2C],EAX
009ECEF8    8343 08 04      ADD DWORD PTR DS:[EBX+8],4
009ECEFC    837B 30 00      CMP DWORD PTR DS:[EBX+30],0
009ECF00    75 0A           JNZ SHORT 009ECF0C
009ECF02    68 E8D09E00     PUSH 9ED0E8                              ; ASCII "81
"
009ECF07    E8 246CFFFF     CALL 009E3B30
009ECF0C    8D5424 30       LEA EDX,DWORD PTR SS:[ESP+30]
009ECF10    8BC3            MOV EAX,EBX
009ECF12    E8 8DF8FFFF     CALL 009EC7A4                            ; AL ==4的第一个分支处理情况,这里跟进
跟进:
009EC7A4    53              PUSH EBX
009EC7A5    56              PUSH ESI
009EC7A6    8BF2            MOV ESI,EDX
009EC7A8    8BD8            MOV EBX,EAX
009EC7AA    B8 04000000     MOV EAX,4
009EC7AF    E8 985DFEFF     CALL 009D254C
009EC7B4    8906            MOV DWORD PTR DS:[ESI],EAX               ; 这里要修改
009EC7B6    8B43 40         MOV EAX,DWORD PTR DS:[EBX+40]
009EC7B9    8946 04         MOV DWORD PTR DS:[ESI+4],EAX
009EC7BC    5E              POP ESI
009EC7BD    5B              POP EBX
009EC7BE    C3              RETN
……
009ECF17    8B4424 2C       MOV EAX,DWORD PTR SS:[ESP+2C]
009ECF1B    50              PUSH EAX
009ECF1C    8D4424 34       LEA EAX,DWORD PTR SS:[ESP+34]
009ECF20    50              PUSH EAX
009ECF21    55              PUSH EBP
009ECF22    A1 70A59F00     MOV EAX,DWORD PTR DS:[9FA570]
009ECF27    8B00            MOV EAX,DWORD PTR DS:[EAX]
009ECF29    50              PUSH EAX
009ECF2A    56              PUSH ESI
009ECF2B    8B4424 28       MOV EAX,DWORD PTR SS:[ESP+28]
009ECF2F    50              PUSH EAX
009ECF30    FF53 30         CALL DWORD PTR DS:[EBX+30]
009ECF33  ^ E9 3BFDFFFF     JMP 009ECC73
009ECF38    8B43 08         MOV EAX,DWORD PTR DS:[EBX+8]
009ECF3B    8B00            MOV EAX,DWORD PTR DS:[EAX]
009ECF3D    890424          MOV DWORD PTR SS:[ESP],EAX
009ECF40    8343 08 04      ADD DWORD PTR DS:[EBX+8],4
009ECF44    8B43 08         MOV EAX,DWORD PTR DS:[EBX+8]
009ECF47    66:8B00         MOV AX,WORD PTR DS:[EAX]
009ECF4A    66:894424 04    MOV WORD PTR SS:[ESP+4],AX
009ECF4F    8343 08 02      ADD DWORD PTR DS:[EBX+8],2
009ECF53    8B0C24          MOV ECX,DWORD PTR SS:[ESP]
009ECF56    66:8B5424 04    MOV DX,WORD PTR SS:[ESP+4]
009ECF5B    8B43 08         MOV EAX,DWORD PTR DS:[EBX+8]
009ECF5E    E8 91ABFFFF     CALL 009E7AF4
009ECF63    8B4424 10       MOV EAX,DWORD PTR SS:[ESP+10]
009ECF67    E8 E055FEFF     CALL 009D254C
009ECF6C    894424 0C       MOV DWORD PTR SS:[ESP+C],EAX
009ECF70    8B43 08         MOV EAX,DWORD PTR DS:[EBX+8]
009ECF73    50              PUSH EAX
009ECF74    8B4424 18       MOV EAX,DWORD PTR SS:[ESP+18]
009ECF78    50              PUSH EAX
009ECF79    A1 B8A69F00     MOV EAX,DWORD PTR DS:[9FA6B8]
009ECF7E    8B00            MOV EAX,DWORD PTR DS:[EAX]
009ECF80    FFD0            CALL EAX                                 ; GetProcAddress
009ECF82    8BE8            MOV EBP,EAX
009ECF84    85ED            TEST EBP,EBP
009ECF86    75 0C           JNZ SHORT 009ECF94
009ECF88    68 F8D09E00     PUSH 9ED0F8                              ; ASCII "250
"
009ECF8D    E8 9E6BFFFF     CALL 009E3B30
009ECF92    EB 15           JMP SHORT 009ECFA9
009ECF94    A1 ECA59F00     MOV EAX,DWORD PTR DS:[9FA5EC]
009ECF99    3B28            CMP EBP,DWORD PTR DS:[EAX]
009ECF9B    75 0C           JNZ SHORT 009ECFA9
009ECF9D    837B 34 00      CMP DWORD PTR DS:[EBX+34],0
009ECFA1    74 06           JE SHORT 009ECFA9
009ECFA3    8B6B 34         MOV EBP,DWORD PTR DS:[EBX+34]
009ECFA6    036B 40         ADD EBP,DWORD PTR DS:[EBX+40]
009ECFA9    8B4424 0C       MOV EAX,DWORD PTR SS:[ESP+C]             ; AL ==4的第二个分支处理,这里和al==1的处理一样
009ECFAD    8928            MOV DWORD PTR DS:[EAX],EBP
009ECFAF    8B4424 0C       MOV EAX,DWORD PTR SS:[ESP+C]
009ECFB3    8906            MOV DWORD PTR DS:[ESI],EAX
009ECFB5    0FB74424 04     MOVZX EAX,WORD PTR SS:[ESP+4]
009ECFBA    0143 08         ADD DWORD PTR DS:[EBX+8],EAX
009ECFBD  ^ E9 B1FCFFFF     JMP 009ECC73
009ECFC2    3C 03           CMP AL,3                                 ; AL==3和下面的5没有发生,所以我也就不写
到这里输入表处理部分基本分析完,现在申请空间,我这里申请到的空间为:00C10000。写上一点修复代码:
------------------------------------------------------------
AL == 0时的处理:

009ECCE9    E8 82FAFFFF     CALL 009EC770                            ; AL == 0时的处理
009ECCEE  ^ EB 83           JMP SHORT 009ECC73
进入后代码:
009EC797    8903            MOV DWORD PTR DS:[EBX],EAX               ; API函数保存在第一层地址处
009EC799    8B45 10         MOV EAX,DWORD PTR SS:[EBP+10]
009EC79C    8918            MOV DWORD PTR DS:[EAX],EBX               ; 把存放第一层地址保存到IAT中

;修复代码:

009EC797    E8 14392200     CALL 00C100B0      ;全部改成CALL方便代码直接写到一块去,方便调用
009EC79C    90              NOP
009EC79D    90              NOP
------------------------------------------------------------


------------------------------------------------------------
AL==1时的处理:

009ECEA8    E8 BFF4FFFF     CALL 009EC36C                            ; 对AL=1进的处理
009ECEAD    8B5424 0C       MOV EDX,DWORD PTR SS:[ESP+C]


;修复
009ECEA8    E8 BFF4FFFF     CALL 009EC36C                            ; 对AL=1进的处理
009ECEAD    E8 8E312200     CALL 00C10040
009ECEB2    90              NOP
009ECEB3    90              NOP
009ECEB4    90              NOP
009ECEB5    90              NOP
009ECEB6    90              NOP
009ECEB7    90              NOP
009ECEB8    90              NOP
------------------------------------------------------------

------------------------------------------------------------
AL==2时的处理:
009ECDF7    E8 8469FFFF     CALL 009E3780   ;跟进
009ECDFC  ^ E9 72FEFFFF     JMP 009ECC73
;修复
009E378A    E8 71C82200     CALL 00C10000  ;修改一
009E378F    90              NOP
------------------------------------------------------------

-----------------------------------------------------------------------------------------
AL==4时的处理:
*******************************************
009EC7AF    E8 985DFEFF     CALL 009D254C                            ; AL == 4的第一个分支处理
009EC7B4    8906            MOV DWORD PTR DS:[ESI],EAX


//修复代码:
009EC7AF    E8 985DFEFF     CALL 009D254C                            ; AL == 4的第一个分支处理
009EC7B4    E8 C1382200     CALL 00C1007A
009EC7B9    8946 04         MOV DWORD PTR DS:[ESI+4],EAX             ; UnKillEr.00400000
009EC7BC    5E              POP ESI
009EC7BD    5B              POP EBX
009EC7BE    C3              RETN
*******************************************

*******************************************
009ECFA9    8B4424 0C       MOV EAX,DWORD PTR SS:[ESP+C]             ; AL==4的第二个分支
009ECFAD    8928            MOV DWORD PTR DS:[EAX],EBP
009ECFAF    8B4424 0C       MOV EAX,DWORD PTR SS:[ESP+C]
009ECFB3    8906            MOV DWORD PTR DS:[ESI],EAX
009ECFB5    0FB74424 04     MOVZX EAX,WORD PTR SS:[ESP+4]
009ECFBA    0143 08         ADD DWORD PTR DS:[EBX+8],EAX

;修复代码:
009ECFA9    E8 92302200     CALL 00C10040                            ; AL==4的第二个分支
009ECFAE    90              NOP
009ECFAF    90              NOP
009ECFB0    90              NOP
009ECFB1    90              NOP
009ECFB2    90              NOP
009ECFB3    90              NOP
009ECFB4    90              NOP
*******************************************
--------------------------------------------------------------------------------------


现在把代码集中写在一个地方,代码比较简单,我也不过多的写注释:
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
全部修复代码:
00C10000    51              PUSH ECX                                 ; AL ==2时的修复代码
00C10001    52              PUSH EDX
00C10002    8B5424 28       MOV EDX,DWORD PTR SS:[ESP+28]
00C10006    3B15 0020C100   CMP EDX,DWORD PTR DS:[C12000]            ; 判断是否处理完当前DLL的函数
00C1000C    74 0D           JE SHORT 00C1001B
00C1000E    8915 0020C100   MOV DWORD PTR DS:[C12000],EDX
00C10014    8305 1020C100 0>ADD DWORD PTR DS:[C12010],4
00C1001B    8B0D 1020C100   MOV ECX,DWORD PTR DS:[C12010]            ; UnKillEr.0047E0A4
00C10021    8929            MOV DWORD PTR DS:[ECX],EBP               ; 写入正确的API
00C10023    66:C703 FF25    MOV WORD PTR DS:[EBX],25FF               ; JMP [address]
00C10028    890E            MOV DWORD PTR DS:[ESI],ECX               ; 写入正确的IAT
00C1002A    8305 1020C100 0>ADD DWORD PTR DS:[C12010],4              
00C10031    5A              POP EDX
00C10032    59              POP ECX
00C10033    C3              RETN
00C10034    90              NOP
00C10035    90              NOP
00C10036    90              NOP
00C10037    90              NOP
00C10038    90              NOP
00C10039    90              NOP
00C1003A    90              NOP
00C1003B    90              NOP
00C1003C    90              NOP
00C1003D    90              NOP
00C1003E    90              NOP
00C1003F    90              NOP
00C10040    51              PUSH ECX                                 ; AL==1时的修复代码
00C10041    52              PUSH EDX
00C10042    8B5424 20       MOV EDX,DWORD PTR SS:[ESP+20]
00C10046    3B15 0020C100   CMP EDX,DWORD PTR DS:[C12000]            ; wsock32.#1139
00C1004C    74 0D           JE SHORT 00C1005B
00C1004E    8915 0020C100   MOV DWORD PTR DS:[C12000],EDX
00C10054    8305 1020C100 0>ADD DWORD PTR DS:[C12010],4
00C1005B    8B0D 1020C100   MOV ECX,DWORD PTR DS:[C12010]            ; UnKillEr.0047E0A4
00C10061    8929            MOV DWORD PTR DS:[ECX],EBP
00C10063    890E            MOV DWORD PTR DS:[ESI],ECX
00C10065    8305 1020C100 0>ADD DWORD PTR DS:[C12010],4
00C1006C    5A              POP EDX
00C1006D    59              POP ECX
00C1006E    C3              RETN
00C1006F    90              NOP
00C10070    90              NOP
00C10071    90              NOP
00C10072    90              NOP
00C10073    90              NOP
00C10074    90              NOP
00C10075    90              NOP
00C10076    90              NOP
00C10077    90              NOP
00C10078    90              NOP
00C10079    90              NOP
00C1007A    51              PUSH ECX                                 ; AL==4的第一个分支修复代码,第二个分支调用AL==1的代码
00C1007B    52              PUSH EDX
00C1007C    8B5424 2C       MOV EDX,DWORD PTR SS:[ESP+2C]
00C10080    3B15 0020C100   CMP EDX,DWORD PTR DS:[C12000]            ; wsock32.#1139
00C10086    74 0D           JE SHORT 00C10095
00C10088    8915 0020C100   MOV DWORD PTR DS:[C12000],EDX
00C1008E    8305 1020C100 0>ADD DWORD PTR DS:[C12010],4
00C10095    8B0D 1020C100   MOV ECX,DWORD PTR DS:[C12010]            ; UnKillEr.0047E0A4
00C1009B    890E            MOV DWORD PTR DS:[ESI],ECX
00C1009D    8305 1020C100 0>ADD DWORD PTR DS:[C12010],4
00C100A4    5A              POP EDX
00C100A5    59              POP ECX
00C100A6    8B43 40         MOV EAX,DWORD PTR DS:[EBX+40]
00C100A9    C3              RETN
00C100AA    90              NOP
00C100AB    90              NOP
00C100AC    90              NOP
00C100AD    90              NOP
00C100AE    90              NOP
00C100AF    90              NOP
00C100B0    51              PUSH ECX                                 ; AL == 0时的修复代码
00C100B1    52              PUSH EDX
00C100B2    8B5424 1C       MOV EDX,DWORD PTR SS:[ESP+1C]
00C100B6    3B15 0020C100   CMP EDX,DWORD PTR DS:[C12000]            ; wsock32.#1139
00C100BC    74 0D           JE SHORT 00C100CB
00C100BE    8915 0020C100   MOV DWORD PTR DS:[C12000],EDX
00C100C4    8305 1020C100 0>ADD DWORD PTR DS:[C12010],4
00C100CB    8B4D 10         MOV ECX,DWORD PTR SS:[EBP+10]
00C100CE    8B15 1020C100   MOV EDX,DWORD PTR DS:[C12010]            ; UnKillEr.0047E0A4
00C100D4    8911            MOV DWORD PTR DS:[ECX],EDX               
00C100D6    8902            MOV DWORD PTR DS:[EDX],EAX
00C100D8    8305 1020C100 0>ADD DWORD PTR DS:[C12010],4
00C100DF    5A              POP EDX
00C100E0    59              POP ECX
00C100E1    C3              RETN
00C100E2    90              NOP
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
代码写完后,记得先在C12010处写上一个起始地址,否则会异常的^_^。
现在取消009ECCCE处的断点,忽略全部异常。运行中断在我们第一次设断处中断。断下后,取消内存异常,F9运行发生异常:
009F6807    C700 7F0677B9   MOV DWORD PTR DS:[EAX],B977067F          ; 异常发生在这里
009F680D    FB              STI
异常后CTRL+B查找二进制FF35,可以找到几地方,正确的地方应该是:
push [addr]
ret
找到下面的地址后下断,shift+f9,中断后ret返回的地址就是Stolen code的开始处。
009F6AF0    FF35 4024A000   PUSH DWORD PTR DS:[A02440]    
009F6AF6    C3              RETN

 
后面的Stolen code只能用手工慢慢找,当然你也可以用fly的方法来做的:-P.
修复之类的和本文无关,所以不写了:- )。这个方法对2.0.6.23的以上版本无效的说。
最后我想对所以的新们说的:
很多初学者喜欢崇洋眉外,说什么国内的文章写没有国外的好之类的,国内的文章多数写How to do it,而不是why?多数写怎么做,而不是说为什么要这么做。对此我说一下自己的意见,如果你连尖字都不会写,连汉语都不会写,你会知道尖字为什么是这样写吗?你会理解汉字中的深澳吗?如果连mov eax,edx之类的都不知道,你会知道why?吗,于其去问点解倒不如去做。


Greetz:
 Fly.Jingulong,yock,tDasm.David.hexer,hmimys,ahao.UFO(brother).alan(sister).all of my friends and you!

By loveboom[DFCG][FCG][US]
Email:loveboom#163.com
http://bulo.163.com/-BPEl.html
Date:4/9/2005 12:56:00 PM