防调试代码

程序功能:“断线程”技术防调试
运行平台:x86 & x64
编写时间:2012.12.13-2012.12.14
参考资料:毕业设计第一版、《加密与解密》、网上的一些x64平台资料

00401013  |.  60            PUSHAD
00401014  |.  6A 00         PUSH 0
00401016  |.  6A 00         PUSH 0
00401018  |.  6A 11         PUSH 11
0040101A  |.  6A FE         PUSH -2
0040101C  |.  33C9          XOR ECX,ECX
0040101E  |.  64:8B71 30    MOV ESI,DWORD PTR FS:[ECX+30]
00401022  |.  8B76 0C       MOV ESI,DWORD PTR DS:[ESI+0C]
00401025  |.  8B76 1C       MOV ESI,DWORD PTR DS:[ESI+1C]
00401028  |.  8B6E 08       MOV EBP,DWORD PTR DS:[ESI+8]
0040102B  |.  8B5D 3C       MOV EBX,DWORD PTR SS:[EBP+3C]
0040102E  |.  8B5C2B 78     MOV EBX,DWORD PTR DS:[EBP+EBX+78]
00401032  |.  03DD          ADD EBX,EBP
00401034  |.  8B4B 18       MOV ECX,DWORD PTR DS:[EBX+18]
00401037  |>  8B7B 20       /MOV EDI,DWORD PTR DS:[EBX+20]
0040103A  |.  03FD          |ADD EDI,EBP
0040103C  |.  8B7C8F FC     |MOV EDI,DWORD PTR DS:[ECX*4+EDI-4]
00401040  |.  03FD          |ADD EDI,EBP
00401042  |.  33C0          |XOR EAX,EAX
00401044  |.  99            |CDQ
00401045  |>  3217          |/XOR DL,BYTE PTR DS:[EDI]
00401047  |.  C1C2 05       ||ROL EDX,5
0040104A  |.  AE            ||SCAS BYTE PTR ES:[EDI]
0040104B  |.^ 75 F8         |\JNE SHORT 00401045
0040104D  |.  8B43 24       |MOV EAX,DWORD PTR DS:[EBX+24]
00401050  |.  03C5          |ADD EAX,EBP
00401052  |.  0FB74448 FE   |MOVZX EAX,WORD PTR DS:[ECX*2+EAX-2]
00401057  |.  8B7B 1C       |MOV EDI,DWORD PTR DS:[EBX+1C]
0040105A  |.  03FD          |ADD EDI,EBP
0040105C  |.  8BF5          |MOV ESI,EBP
0040105E  |.  033487        |ADD ESI,DWORD PTR DS:[EAX*4+EDI]
00401061  |.  81FA 8D98A0E2 |CMP EDX,E2A0988D
00401067  |.  74 02         |JE SHORT 0040106B
00401069  |.^ E2 CC         \LOOP SHORT 00401037
0040106B  |>  8B46 01       MOV EAX,DWORD PTR DS:[ESI+1]
0040106E  |.  8BD4          MOV EDX,ESP
00401070  |.  33C9          XOR ECX,ECX
00401072  |.  64:8B35 C0000 MOV ESI,DWORD PTR FS:[0C0]
00401079  |.  85F6          TEST ESI,ESI
0040107B  |.  75 04         JNZ SHORT 00401081
0040107D  |.  CD 2E         INT 2E
0040107F  |.  EB 07         JMP SHORT 00401088
00401081  |>  89E5          MOV EBP,ESP
00401083  |.  FF5E 01       CALL FAR FWORD PTR DS:[ESI+1]            ; Far jump or call
00401086  |.  89EC          MOV ESP,EBP
00401088  |>  83C4 10       ADD ESP,10
0040108B  |.  61            POPAD
HEX: 606A006A006A116AFE33C9648B71308B760C8B761C8B6E088B5D3C8B5C2B7803DD8B4B188B7B2003FD8B7C8FFC03FD33C0993217C1C205AE75F88B432403C50FB74448FE8B7B1C03FD8BF503348781FA8D98A0E27402E2CC8B46018BD433C9648B35C000000085F67504CD2EEB0789E5FF5E0189EC83C41061

4 Replies to “防调试代码”

  1. 不知道博主能看到不?好久的文章了。。。
    我在学习这个,偶然看到您的这些代码,前面我知道其实就是获取 ZwSetInformationThread 的地址而已,但是后面从 0040106B 开始我就不知道是在干啥了,貌似这个API根本没调用。。。。
    能给解释下吗?多谢!

    1. 401072处OD没显示完全,hex部分少了三个0,复制时需注意。已更新用于正确复制的hex。
      api是用int2e或farcall直接调的,这样全部代码都是inline的,省得被从ntdll下断。32与64位win7测试通过。

  2. int 2e的作用和用法我弄懂了个大概;
    至于OD没显示全的那个到没事,因为我主要在读指令部分看到底是啥原理,而您说的那个地址处:
    MOV ESI,DWORD PTR FS:[0C0]
    这句是我最迷糊的,在查到的TEB结构资料里,c0偏移处显示的成员名称叫WOW32Reserved,看起来是32位的保留成员,32位下就是0,莫非在64位下有其他作用?
    请问这方面的资料哪里能找到呢?谢谢

    1. wow64程序进内核要通过64位代码中转,可搜索X86SwitchTo64BitMode关键字

Leave a Reply to npzs Cancel reply

Your email address will not be published. Required fields are marked *