SockMon2005 网络验证的去除(附内存补丁程序源码)

作 者: szdbg
时 间: 2008-02-23,22:38
链 接: http://bbs.pediy.com/showthread.php?t=60114

SockMon2005 网络验证的去除及内存被丁程序源码


【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

前段时间,在网上下载了一个SockMon2005,每隔一分钟就弹出一个要求注册的窗口,运行5分钟后,程序就中止了。

当时就试着破了一下,跟到后来,跟到了网络验证部分,由于对网络验证的破解十分手生,不敢继续往下跟了,就放到一边去了。

这两天心又不甘,再拿来分析,不料,误打误撞,居然给破了。特将破解过程中所作的一些笔记整理一下,串在一起,并贴出来,以供我们这些菜鸟们共同学习,探讨。

高手飘过。
-----------------------------------------------------------------------------------------------------------------------------------------------------

一、程序分析

PEID 侦测: ASPack 2.12 -> Alexey Solodovnikov 壳,

但手工脱壳后,发现引入表加密,就懒得去费心去修复引入表了,直接带壳分析吧

-----------------------------------------------------------------------------------------------------------------------------------------------------
二、设断跟踪

进入注册界面,用第三方工具查出编辑框的句柄值为:3041E, 所以作如下设断:

bp CallWindowProcA [esp+8]==3041E && [esp+0c]==WM_GETTEXT   

用于拦截程序取编辑框上的文本, 点击注册后,通过堆栈窗口,可以返回到:

004A7878    55              PUSH EBP
004A7879    68 1B7A4A00     PUSH SockMon5.004A7A1B
004A787E    64:FF30         PUSH DWORD PTR FS:[EAX]
004A7881    64:8920         MOV DWORD PTR FS:[EAX],ESP
004A7884    8D95 F8FDFFFF   LEA EDX,DWORD PTR SS:[EBP-208]
004A788A    8B83 FC020000   MOV EAX,DWORD PTR DS:[EBX+2FC]
004A7890    E8 7B11FAFF     CALL SockMon5.00448A10

004A7895    8B85 F8FDFFFF   MOV EAX,DWORD PTR SS:[EBP-208]  ;EAX=17F8-65A4-01A1-CB77-6439 机器码
004A789B    E8 88CEF5FF     CALL SockMon5.00404728    ;eax=18h 机器码长度
004A78A0    8BF0            MOV ESI,EAX
004A78A2    8D95 F4FDFFFF   LEA EDX,DWORD PTR SS:[EBP-20C]
004A78A8    8B83 00030000   MOV EAX,DWORD PTR DS:[EBX+300]
004A78AE    E8 5D11FAFF     CALL SockMon5.00448A10    ;<=== 取输入的注册码

004A78B3    8B85 F4FDFFFF   MOV EAX,DWORD PTR SS:[EBP-20C]  ;eax=123456789 输入的注册码
004A78B9    E8 6ACEF5FF     CALL SockMon5.00404728    ;输入注册码长度
004A78BE    8BF8            MOV EDI,EAX
004A78C0    3BFE            CMP EDI,ESI        ;esi=18h;
004A78C2    0F85 2A010000   JNZ SockMon5.004A79F2    ;注册码长度不为18h, 则Over

004A78C8    8D95 F0FDFFFF   LEA EDX,DWORD PTR SS:[EBP-210]  ;注意LEA指令,说明下面子程序中会改写这个数据, 所以 d ebp-210 监视这个数据,现在

显示为 00 00 00 00
004A78CE    8B83 FC020000   MOV EAX,DWORD PTR DS:[EBX+2FC]
004A78D4    E8 3711FAFF     CALL SockMon5.00448A10    ;[ebp-210]=34 C7 B8 00 为存放机器码的地址 17F8-65A4-01A1-CB77-6439

004A78D9    8B85 F0FDFFFF   MOV EAX,DWORD PTR SS:[EBP-210]  ;EAX=机器码:17F8-65A4-01A1-CB77-6439
004A78DF    E8 3CD0F5FF     CALL SockMon5.00404920

004A78E4    8BD0            MOV EDX,EAX        ;EDX=EAX=机器码:17F8-65A4-01A1-CB77-6439
004A78E6    8D85 FFFEFFFF   LEA EAX,DWORD PTR SS:[EBP-101]
004A78EC    E8 B718F6FF     CALL SockMon5.004091A8    ;返回后,EAX还是机器码

004A78F1    8D95 ECFDFFFF   LEA EDX,DWORD PTR SS:[EBP-214]  ;注意LEA指令
004A78F7    8B83 00030000   MOV EAX,DWORD PTR DS:[EBX+300]
004A78FD    E8 0E11FAFF     CALL SockMon5.00448A10    ;返回后,[ebp-214] 为输入的注册码

004A7902    8B85 ECFDFFFF   MOV EAX,DWORD PTR SS:[EBP-214]
004A7908    E8 13D0F5FF     CALL SockMon5.00404920    ;EAX=注册码

004A790D    8BD0            MOV EDX,EAX
004A790F    8D85 FEFDFFFF   LEA EAX,DWORD PTR SS:[EBP-202]
004A7915    E8 8E18F6FF     CALL SockMon5.004091A8    ;返回后,EAX还是注册码

004A791A    8D56 01         LEA EDX,DWORD PTR DS:[ESI+1]  ;EDX=机器码长度+1=19h
004A791D    8D85 FFFEFFFF   LEA EAX,DWORD PTR SS:[EBP-101]  ;EAX为机器码
004A7923    E8 7882FFFF     CALL SockMon5.0049FBA0

004A7928    8D57 01         LEA EDX,DWORD PTR DS:[EDI+1]  ;EDX=注册码长度+1=19h
004A792B    8D85 FEFDFFFF   LEA EAX,DWORD PTR SS:[EBP-202]  ;EAX为注册码
004A7931    E8 6A82FFFF     CALL SockMon5.0049FBA0
...
004A7988    50              PUSH EAX
004A7989    68 687A4A00     PUSH SockMon5.004A7A68                   ; ASCII "SMCommVer"
004A798E    68 747A4A00     PUSH SockMon5.004A7A74                   ; ASCII "Software/SockMon/5.0/SetOther"    HKEY=80000001
004A7993    E8 FC70FFFF     CALL SockMon5.0049EA94                   ; JMP 到 smcomm.SMVar_SetData
004A7998    47              INC EDI
004A7999    57              PUSH EDI
004A799A    8D95 E4FDFFFF   LEA EDX,DWORD PTR SS:[EBP-21C]
004A79A0    8B83 00030000   MOV EAX,DWORD PTR DS:[EBX+300]
004A79A6    E8 6510FAFF     CALL SockMon5.00448A10
004A79AB    8B85 E4FDFFFF   MOV EAX,DWORD PTR SS:[EBP-21C]
004A79B1    E8 6ACFF5FF     CALL SockMon5.00404920
004A79B6    50              PUSH EAX
004A79B7    68 947A4A00     PUSH SockMon5.004A7A94                   ; ASCII "SMCommDll"
004A79BC    68 747A4A00     PUSH SockMon5.004A7A74                   ; ASCII "Software/SockMon/5.0/SetOther"
004A79C1    E8 CE70FFFF     CALL SockMon5.0049EA94                   ; JMP 到 smcomm.SMVar_SetData
004A79C6    8BC3            MOV EAX,EBX
004A79C8    E8 2FF0FBFF     CALL SockMon5.004669FC
004A79CD    8D95 E0FDFFFF   LEA EDX,DWORD PTR SS:[EBP-220]
004A79D3    B8 A87A4A00     MOV EAX,SockMon5.004A7AA8                ; ASCII "

HMLOGNINANCMGMEPGLPKDFPGDGLGNEPGOGDKMKCNENBLDOHNCKCLBOEMMNJLLLJMKPANHKDKBK"
004A79D8    E8 8778FFFF     CALL SockMon5.0049F264
004A79DD    8B85 E0FDFFFF   MOV EAX,DWORD PTR SS:[EBP-220]
004A79E3    E8 1CA2F9FF     CALL SockMon5.00441C04
...

当注册码长度为24位时,将注册信息记入注册表中,HKEY_CURRENT_USER/Software/SockMon/5.0/SetOther

SMCommDll : 记录输入的注册码
SMCommVer : 记录机器码

然后要求重启验证

-----------------------------------------------------------------------------------------------------------------------------------------------------
三、重启分析

HF 12FFC0 设硬件断点,到OEP处。

bp RegQueryValueExA 设断, 中断时观察堆栈中字符串:

0012FB70   10001D0D  /CALL 到 RegQueryValueExA 来自 smcomm.10001D07
0012FB74   000000C8  |hKey = C8
0012FB78   004BA0B0  |ValueName = "SMCommVer"
0012FB7C   00000000  |Reserved = NULL
0012FB80   00000000  |pValueType = NULL
0012FB84   0012FCE7  |Buffer = 0012FCE7
0012FB88   0012FB98  /pBufSize = 0012FB98
0012FB8C   10002667  返回到 smcomm.10002667 来自 smcomm.10001CE0
...
0012FBB4   004B9EC6  返回到 SockMon5.004B9EC6 来自 SockMon5.0049EA8C  <=== 定位到这里
0012FBB8   004BA0BC  ASCII "Software/SockMon/5.0/SetOther"
0012FBBC   004BA0B0  ASCII "SMCommVer"

004B9EAB    68 00010000     PUSH 100
004B9EB0    8D85 FFFEFFFF   LEA EAX,DWORD PTR SS:[EBP-101]
004B9EB6    50              PUSH EAX
004B9EB7    68 B0A04B00     PUSH SockMon5.004BA0B0                   ; ASCII "SMCommVer"
004B9EBC    68 BCA04B00     PUSH SockMon5.004BA0BC                   ; ASCII "Software/SockMon/5.0/SetOther"
004B9EC1    E8 C64BFEFF     CALL SockMon5.0049EA8C                   ; JMP 到 smcomm.SMVar_GetData

004B9EC6    68 00010000     PUSH 100
004B9ECB    8D85 FEFDFFFF   LEA EAX,DWORD PTR SS:[EBP-202]
004B9ED1    50              PUSH EAX
004B9ED2    68 DCA04B00     PUSH SockMon5.004BA0DC                   ; ASCII "SMCommDll"
004B9ED7    68 BCA04B00     PUSH SockMon5.004BA0BC                   ; ASCII "Software/SockMon/5.0/SetOther"
004B9EDC    E8 AB4BFEFF     CALL SockMon5.0049EA8C                   ; JMP 到 smcomm.SMVar_GetData
                     ;EBP-202上存放了注册码

004B9EE1    E8 01000000     CALL SockMon5.004B9EE7         ;进去后,就进入正常运行了
  
  004B9EE7    830424 06       ADD DWORD PTR SS:[ESP],6       ;[esp]=ret 地址,也就是:004B9EE6
                     ;[esp]改成了: 004B9EE6+6=004B9EEC
  004B9EEB    C3              RETN        

004B9EE6  - E9 83042406     JMP 066FA36E           ;程序不会运行到这里来
004B9EEB    C3              RETN
--------------------------------------------------------------------
由上来到这里:

004B9EEC    68 E8A04B00     PUSH SockMon5.004BA0E8                   ; ASCII "SOCKMON5.50"
004B9EF1    68 E8A04B00     PUSH SockMon5.004BA0E8                   ; ASCII "SOCKMON5.50"
004B9EF6    E8 C14BFEFF     CALL SockMon5.0049EABC                   ; JMP 到 smcomm.SMVer_Check
004B9EFB    8D83 C8050000   LEA EAX,DWORD PTR DS:[EBX+5C8]
004B9F01    50              PUSH EAX
004B9F02    68 90010000     PUSH 190
004B9F07    E8 84CCF4FF     CALL SockMon5.00406B90                   ; JMP 到 kernel32.GetTempPathA
004B9F0C    BA F4A04B00     MOV EDX,SockMon5.004BA0F4                ; ASCII "SMCache"
004B9F11    8D8B C8050000   LEA ECX,DWORD PTR DS:[EBX+5C8]
004B9F17    03C1            ADD EAX,ECX
004B9F19    E8 8AF2F4FF     CALL SockMon5.004091A8
004B9F1E    8D83 C8050000   LEA EAX,DWORD PTR DS:[EBX+5C8]
004B9F24    50              PUSH EAX
004B9F25    E8 0A4BFEFF     CALL SockMon5.0049EA34                   ; JMP 到 smcomm.SMCache_Open
004B9F2A    8BF0            MOV ESI,EAX
004B9F2C    89B3 B8050000   MOV DWORD PTR DS:[EBX+5B8],ESI
004B9F32    85F6            TEST ESI,ESI
004B9F34    75 23           JNZ SHORT SockMon5.004B9F59
004B9F36    8D95 F8FDFFFF   LEA EDX,DWORD PTR SS:[EBP-208]
004B9F3C    B8 04A14B00     MOV EAX,SockMon5.004BA104                ; ASCII "

DLFPKMMLLLPKKMNPOLNNOMEMMLOPELNOOMDPMCDNGKDNDMDLMMANCPMLELNLLKGNFNGNJLBC"
004B9F41    E8 1E53FEFF     CALL SockMon5.0049F264
004B9F46    8B85 F8FDFFFF   MOV EAX,DWORD PTR SS:[EBP-208]
004B9F4C    E8 CFA9F4FF     CALL SockMon5.00404920
...
------------------------------------------------------------------------------------------------------------
跟踪时,发现有大量的花指令:

004BEEE1    E8 01000000      CALL SockMon5.004BEEE7    ;NOP掉
004BEEE6  - E9 83042406      JMP 066FF36E      ;NOP掉
004BEEEB    C3               RETN        ;NOP掉
004BEEEC    8B03             MOV EAX,DWORD PTR DS:[EBX]
...

这此花指令,可以通过脚本,一次性将其去掉
------------------------------------------------------------------------------------------------------------
跟踪时,还发现有很多GetTickCount,来检测程序运行时间,单步运行时,就很容易Over了,如下:

004BED4B    E8 507EF4FF      CALL SockMon5.00406BA0                   ; JMP 到 kernel32.GetTickCount
004BED50    2BC6             SUB EAX,ESI
004BED52    3D E8030000      CMP EAX,3E8
004BED57    0F87 96010000    JA SockMon5.004BEEF3      ;检查运行时间
004BED5D    E8 01000000      CALL SockMon5.004BED63
004BED62  - E9 83042406      JMP 066FF1EA
;
004BEDB9    E8 E27DF4FF      CALL SockMon5.00406BA0                   ; JMP 到 kernel32.GetTickCount
004BEDBE    2BC6             SUB EAX,ESI
004BEDC0    3D D0070000      CMP EAX,7D0
004BEDC5    0F87 28010000    JA SockMon5.004BEEF3
004BEDCB    E8 01000000      CALL SockMon5.004BEDD1
004BEDD0  - E9 83042406      JMP 066FF258
;
这一点好办,通脚本控制,快速运行到相应位置,即可.

由于是重启验证,不好判断注册算法的具体位置,只好在跟踪函数时,时刻观察堆栈上的数据, 若看到机器码或注册码
出现,就要注意了。
-------------------------------------------------------------------------------------------------------------
004B9EEC    68 E8A04B00     PUSH SockMon5.004BA0E8                     ; ASCII "SOCKMON5.50"
004B9EF1    68 E8A04B00     PUSH SockMon5.004BA0E8                     ; ASCII "SOCKMON5.50"
004B9EF6    E8 C14BFEFF     CALL SockMon5.0049EABC                     ; JMP 到 smcomm.SMVer_Check
跟进后,来到:

100089A1    55              PUSH EBP        ;EBP=17F8-65A4-01A1-CB77-6439
100089A2    8BEC            MOV EBP,ESP    
100089A4    51              PUSH ECX        ;ECX=0
100089A5    53              PUSH EBX        ;EBX=012345678901234567890123 (注册码)
100089A6    E8 C0B9FFFF     CALL smcomm.1000436B
...

这里在对注册码进行操作:
10001BCF    E8 ACF9FFFF     CALL smcomm.10001580
------------
10001580    8B5424 04       MOV EDX,DWORD PTR SS:[ESP+4]  ;EDX 注册码
10001584    8BC2            MOV EAX,EDX        ;EAX 注册码
10001586    56              PUSH ESI        

10001587    8D70 01         LEA ESI,DWORD PTR DS:[EAX+1]  ;ESI 指向注册码的第二位
1000158A    8D9B 00000000   LEA EBX,DWORD PTR DS:[EBX]
10001590    8A08            MOV CL,BYTE PTR DS:[EAX]
10001592    40              INC EAX        ;EAX 指向注册码的下一位
10001593    84C9            TEST CL,CL
10001595  ^ 75 F9           JNZ SHORT smcomm.10001590
10001597    2BC6            SUB EAX,ESI        ;EAX 得注册码长度

10001599    33C9            XOR ECX,ECX
1000159B    85C0            TEST EAX,EAX
1000159D    5E              POP ESI
1000159E    7E 0F           JLE SHORT smcomm.100015AF    ;长度为0,Over

100015A0    803C11 20       CMP BYTE PTR DS:[ECX+EDX],20  ;注册码中当前字符是否为空格
100015A4    7F 04           JG SHORT smcomm.100015AA
100015A6    C60411 2D       MOV BYTE PTR DS:[ECX+EDX],2D  ;如果是空格,就用 "-" 号代替
100015AA    41              INC ECX
100015AB    3BC8            CMP ECX,EAX
100015AD  ^ 7C F1           JL SHORT smcomm.100015A0
100015AF    C2 0400         RETN 4

10001BCC    53              PUSH EBX
10001BCD    8BCE            MOV ECX,ESI
10001BCF    E8 ACF9FFFF     CALL smcomm.10001580    ;检查注册码长度,并将空格取代为"-"
;
10001BD4    8D86 00040000   LEA EAX,DWORD PTR DS:[ESI+400]  ;EAX=00-E0-4C-8E-EE
10001BDA    50              PUSH EAX
10001BDB    8BCE            MOV ECX,ESI        ;ECX=SOCKMON5.50
10001BDD    E8 9EF9FFFF     CALL smcomm.10001580    ;同上
;
再往下跟踪,就来到了网络验证部分

四、网络验证:

10001819    6A 00           PUSH 0
1000181B    BF 01000000     MOV EDI,1
10001820    57              PUSH EDI
10001821    6A 02           PUSH 2
10001823    897C24 30       MOV DWORD PTR SS:[ESP+30],EDI
10001827    E8 6A190000     CALL smcomm.10003196                     ; JMP 到 WS2_32.socket
1000182C    8BF0            MOV ESI,EAX
1000182E    83FE FF         CMP ESI,-1
10001831    0F84 61010000   JE smcomm.10001998
;
10001837    8D5424 24       LEA EDX,DWORD PTR SS:[ESP+24]
1000183B    52              PUSH EDX
1000183C    68 7E660480     PUSH 8004667E
10001841    56              PUSH ESI
10001842    E8 49190000     CALL smcomm.10003190                     ; JMP 到 WS2_32.ioctlsocket
10001847    83F8 FF         CMP EAX,-1
1000184A    0F84 42010000   JE smcomm.10001992
10001850    68 6CAC0010     PUSH smcomm.1000AC6C                     ; ASCII "WWW.CNASM.COM"
10001855    E8 30190000     CALL smcomm.1000318A                     ; JMP 到 WS2_32.gethostbyname
1000185A    8BD8            MOV EBX,EAX
1000185C    85DB            TEST EBX,EBX
1000185E    0F84 2E010000   JE smcomm.10001992
;
10001864    33C0            XOR EAX,EAX
10001866    894424 14       MOV DWORD PTR SS:[ESP+14],EAX
1000186A    894424 18       MOV DWORD PTR SS:[ESP+18],EAX
1000186E    894424 1C       MOV DWORD PTR SS:[ESP+1C],EAX
10001872    6A 50           PUSH 50
10001874    894424 24       MOV DWORD PTR SS:[ESP+24],EAX
10001878    66:C74424 18 02>MOV WORD PTR SS:[ESP+18],2
1000187F    E8 00190000     CALL smcomm.10003184                     ; JMP 到 WS2_32.ntohs
10001884    66:894424 16    MOV WORD PTR SS:[ESP+16],AX
;
10001889    8B4B 0C         MOV ECX,DWORD PTR DS:[EBX+C]
1000188C    8B11            MOV EDX,DWORD PTR DS:[ECX]
1000188E    8B02            MOV EAX,DWORD PTR DS:[EDX]
10001890    6A 10           PUSH 10
10001892    8D4C24 18       LEA ECX,DWORD PTR SS:[ESP+18]
10001896    51              PUSH ECX
10001897    56              PUSH ESI
10001898    894424 24       MOV DWORD PTR SS:[ESP+24],EAX
1000189C    E8 DD180000     CALL smcomm.1000317E                     ; JMP 到 WS2_32.connect
;
100018A1    8D5424 28       LEA EDX,DWORD PTR SS:[ESP+28]
100018A5    52              PUSH EDX
100018A6    8D8424 44020000 LEA EAX,DWORD PTR SS:[ESP+244]
100018AD    50              PUSH EAX
100018AE    8D4C24 38       LEA ECX,DWORD PTR SS:[ESP+38]
100018B2    51              PUSH ECX
100018B3    6A 00           PUSH 0
100018B5    6A 00           PUSH 0
100018B7    C74424 40 00000>MOV DWORD PTR SS:[ESP+40],0
100018BF    C74424 3C 03000>MOV DWORD PTR SS:[ESP+3C],3
100018C7    89B424 50010000 MOV DWORD PTR SS:[ESP+150],ESI
100018CE    89BC24 4C010000 MOV DWORD PTR SS:[ESP+14C],EDI
100018D5    897424 48       MOV DWORD PTR SS:[ESP+48],ESI
100018D9    897C24 44       MOV DWORD PTR SS:[ESP+44],EDI
100018DD    89B424 58020000 MOV DWORD PTR SS:[ESP+258],ESI
100018E4    89BC24 54020000 MOV DWORD PTR SS:[ESP+254],EDI
100018EB    E8 88180000     CALL smcomm.10003178                     ; JMP 到 WS2_32.select
;
1000190B    6A 00           PUSH 0
1000190D    55              PUSH EBP
1000190E    8D9424 E0040000 LEA EDX,DWORD PTR SS:[ESP+4E0]
10001915    52              PUSH EDX
10001916    56              PUSH ESI
10001917    E8 56180000     CALL smcomm.10003172                     ; JMP 到 WS2_32.send
1000191C    E8 4B180000     CALL smcomm.1000316C                     ; JMP 到 WS2_32.WSAGetLastError
;
10001921    6A 00           PUSH 0
10001923    8D8424 44020000 LEA EAX,DWORD PTR SS:[ESP+244]
1000192A    50              PUSH EAX
1000192B    6A 00           PUSH 0
1000192D    8D8C24 44010000 LEA ECX,DWORD PTR SS:[ESP+144]
10001934    51              PUSH ECX
10001935    6A 00           PUSH 0
10001937    89B424 50010000 MOV DWORD PTR SS:[ESP+150],ESI
1000193E    89BC24 4C010000 MOV DWORD PTR SS:[ESP+14C],EDI
10001945    897424 48       MOV DWORD PTR SS:[ESP+48],ESI
10001949    897C24 44       MOV DWORD PTR SS:[ESP+44],EDI
1000194D    89B424 58020000 MOV DWORD PTR SS:[ESP+258],ESI
10001954    89BC24 54020000 MOV DWORD PTR SS:[ESP+254],EDI
1000195B    E8 18180000     CALL smcomm.10003178                     ; JMP 到 WS2_32.select
10001960    39BC24 38010000 CMP DWORD PTR SS:[ESP+138],EDI
10001967    75 29           JNZ SHORT smcomm.10001992
10001969    33C0            XOR EAX,EAX
1000196B    50              PUSH EAX
1000196C    68 00100000     PUSH 1000
10001971    8D9424 E0040000 LEA EDX,DWORD PTR SS:[ESP+4E0]
10001978    52              PUSH EDX
10001979    B9 00040000     MOV ECX,400
1000197E    8DBC24 E4040000 LEA EDI,DWORD PTR SS:[ESP+4E4]
10001985    56              PUSH ESI
10001986    F3:AB           REP STOS DWORD PTR ES:[EDI]
10001988    E8 D9170000     CALL smcomm.10003166                     ; JMP 到 wsock32.recv
1000198D    E8 DA170000     CALL smcomm.1000316C                     ; JMP 到 WS2_32.WSAGetLastError
;
10001992    56              PUSH ESI
10001993    E8 C8170000     CALL smcomm.10003160                     ; JMP 到 WS2_32.closesocket
10001998    E8 BD170000     CALL smcomm.1000315A                     ; JMP 到 WS2_32.WSACleanup

发送的数据:

  0012DE60   000000F0  |Socket = F0
  0012DE64   0012E348  |Data = 0012E348
  0012DE68   000000E2  |DataSize = E2 (226.)
  0012DE6C   00000000  /Flags = 0
0012E348  47 45 54 20 2F 53 6F 63 6B 4D 6F 6E 2F 55 70 64  GET /SockMon/Upd
0012E358  61 74 65 2E 61 73 70 3F 54 49 4D 3D 32 30 30 38  ate.asp?TIM=2008
0012E368  2D 32 2D 31 32 2B 32 32 3A 32 31 3A 35 36 26 5A  -2-12+22:21:56&Z
0012E378  43 48 3D 31 37 46 38 2D 36 35 41 34 2D 30 31 41  CH=17F8-65A4-01A
0012E388  31 2D 43 42 37 37 2D 36 34 33 39 26 5A 43 4D 3D  1-CB77-6439&ZCM=
0012E398  31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36  1234567890123456
0012E3A8  37 38 39 30 31 32 33 34 26 4D 41 43 3D 30 30 2D  78901234&MAC=00-
0012E3B8  45 30 2D 34 43 2D 38 45 2D 45 45 26 55 53 52 3D  E0-4C-8E-EE&USR=
0012E3C8  63 78 67 26 43 4D 50 3D 42 49 4C 4C 47 41 54 45  cxg&CMP=BILLGATE
0012E3D8  53 26 53 59 53 3D 57 69 6E 58 70 2C 53 65 72 76  S&SYS=WinXp,Serv
0012E3E8  69 63 65 2D 50 61 63 6B 2D 31 26 56 45 52 3D 53  ice-Pack-1&VER=S
0012E3F8  4F 43 4B 4D 4F 4E 35 2E 35 30 20 20 20 48 54 54  OCKMON5.50   HTT
0012E408  50 2F 31 2E 31 0D 0A 48 6F 73 74 3A 20 57 57 57  P/1.1..Host: WWW
0012E418  2E 43 4E 41 53 4D 2E 43 4F 4D 0D 0A 0D 0A 0D 0A  .CNASM.COM......
0012E428  0D 0A 00 77 D8 13 15 00 38 27 F6 77 C7 27 F6 77  ...w?.8'鰓?鰓


接收到的数据:
  0012DE60   000000F0  |Socket = F0
  0012DE64   0012E348  |Buffer = 0012E348
  0012DE68   00001000  |BufSize = 1000 (4096.)
  0012DE6C   00000000  /Flags = 0
0012E348  48 54 54 50 2F 31 2E 31 20 32 30 30 20 4F 4B 0D  HTTP/1.1 200 OK.
0012E358  0A 44 61 74 65 3A 20 46 72 69 2C 20 32 32 20 46  .Date: Fri, 22 F
0012E368  65 62 20 32 30 30 38 20 31 34 3A 30 34 3A 32 39  eb 2008 14:04:29
0012E378  20 47 4D 54 0D 0A 53 65 72 76 65 72 3A 20 4D 69   GMT..Server: Mi
0012E388  63 72 6F 73 6F 66 74 2D 49 49 53 2F 36 2E 30 0D  crosoft-IIS/6.0.
0012E398  0A 58 2D 50 6F 77 65 72 65 64 2D 42 79 3A 20 41  .X-Powered-By: A
0012E3A8  53 50 2E 4E 45 54 0D 0A 43 6F 6E 74 65 6E 74 2D  SP.NET..Content-
0012E3B8  4C 65 6E 67 74 68 3A 20 32 0D 0A 43 6F 6E 74 65  Length: 2..Conte
0012E3C8  6E 74 2D 54 79 70 65 3A 20 74 65 78 74 2F 68 74  nt-Type: text/ht
0012E3D8  6D 6C 0D 0A 53 65 74 2D 43 6F 6F 6B 69 65 3A 20  ml..Set-Cookie:
0012E3E8  41 53 50 53 45 53 53 49 4F 4E 49 44 53 51 42 44  ASPSESSIONIDSQBD
0012E3F8  43 43 52 41 3D 4A 4C 50 46 4A 48 44 44 4C 4D 45  CCRA=JLPFJHDDLME
0012E408  49 47 42 46 48 43 41 48 47 44 49 45 4D 3B 20 70  IGBFHCAHGDIEM; p
0012E418  61 74 68 3D 2F 0D 0A 43 61 63 68 65 2D 63 6F 6E  ath=/..Cache-con
0012E428  74 72 6F 6C 3A 20 70 72 69 76 61 74 65 0D 0A 0D  trol: private...
0012E438  0A 4F 4B 00 00 00 00 00 00 00 00 00 00 00 00 00  .OK.............

继续往下跟,跟来跟去,也不知程序是在哪里开始分析这一块数据的,试图在这一段内存上设下内存访问断点,结果程序老是出现异常,跟得甚是郁闷。

-----------------------------------------------------------------------------------------------------------------------------------------------------
四、另辟蹊径

没办法,现在只好通过注册窗口,来寻找突破点了:

bp CreateWindowExA 下断,即可对注册窗口弹出过程拦截到:

返回到父函数,就是:

0044C421    FF91 9C000000   CALL DWORD PTR DS:[ECX+9C]               ; SockMon5.0044C498  弹出注册窗口
0044C427    83BE 80010000 0>CMP DWORD PTR DS:[ESI+180],0
0044C42E    75 05           JNZ SHORT SockMon5.0044C435


0044C498    53              PUSH EBX
...
0044C4CA    50              PUSH EAX
0044C4CB    E8 50ABFBFF     CALL SockMon5.00407020                   ; JMP 到 user32.CreateWindowExA
...
第一次是通过CreateWindowExA() 弹出窗口,但随后几次弹出,通过bp CreateWindowExA 却拦不下来。

可能是窗口隐藏了,并没有卸载,bp ShowWindow 一试,果然拦下。

附近函数再跟进,跟踪来到:

00466515   .  80B8 2F020000>CMP BYTE PTR DS:[EAX+22F],1
0046651C   .  0F85 B5000000 JNZ SockMon5.004665D7
...
004665D7   > /8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
004665DA   .  0FB680 2B0200>MOVZX EAX,BYTE PTR DS:[EAX+22B]
004665E1   .  8B0485 CC0D4C>MOV EAX,DWORD PTR DS:[EAX*4+4C0DCC]
004665E8   .  50            PUSH EAX
004665E9   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
004665EC   .  E8 FF8BFEFF   CALL SockMon5.0044F1F0
004665F1    50              PUSH EAX
004665F2    E8 390FFAFF     CALL SockMon5.00407530                   ; JMP 到 user32.ShowWindow  ; 注册窗口显示控制


;下面是主窗口显示控制
00465D06   .  50            PUSH EAX                                 ; |hWnd
00465D07   .  E8 2418FAFF   CALL SockMon5.00407530                   ; /ShowWindow    ; 主窗口显示控制


ShowWindow返回后,返回到下面的:00449E6C

00449E69 >|.  FF51 EC       CALL DWORD PTR DS:[ECX-14]
00449E6C  |>  5F            POP EDI
00449E6D  |.  5E            POP ESI
00449E6E  |.  5B            POP EBX
00449E6F  |.  8BE5          MOV ESP,EBP
00449E71  |.  5D            POP EBP
00449E72  /.  C3            RETN



0012F9B8  /0012FAE0
0012F9BC  |00449E6C  返回到 SockMon5.00449E6C
0012F9C0  |00B4A038  ASCII "TuJ"
0012F9C4  |0012FB34


由于注册窗口是以CreateWindow 和 ShowWindow方式进行,而不是以DoModal方式进行,所以,应该就会将主窗口EnableWindow FALSE

那么我们就可以将EnableWindow FALSE 改为 Enalbe TRUE, 然后在显示注册窗口时,改为ShowWindow FALSE

这样一改,就不会再每过一分钟就弹出一个注册窗口,但还是有5分钟的总时间限制。

进行 bp EnableWindow 拦截:可以得到:(会有两次调用)

00460BDC    50              PUSH EAX
00460BDD    E8 1665FAFF     CALL SockMon5.004070F8                   ; JMP 到 user32.EnumThreadWindows

返回:
00466BA9    33C0            XOR EAX,EAX
00466BAB    E8 D89FFFFF     CALL SockMon5.00460B88
;
到函数头:
00466AB4  /.  55            PUSH EBP

到父函数:
0043ABA4   .  53            PUSH EBX
0043ABA5   .  66:8378 3A 00 CMP WORD PTR DS:[EAX+3A],0
0043ABAA   .  74 0A         JE SHORT SockMon5.0043ABB6
0043ABAC   .  8BD8          MOV EBX,EAX
0043ABAE   .  8BD0          MOV EDX,EAX
0043ABB0   .  8B43 3C       MOV EAX,DWORD PTR DS:[EBX+3C]
0043ABB3   .  FF53 38       CALL DWORD PTR DS:[EBX+38]
0043ABB6   >  5B            POP EBX
0043ABB7   .  C3            RETN


将上面的 0043ABAA   .  74 0A         JE SHORT SockMon5.0043ABB6 改为:

0043ABAA   /EB 0A           JMP SHORT SockMon5.0043ABB6


发现,OK,居然全破了,SockMon2005 状态栏上的计时停止了,再没有注册窗口弹出,5分钟过后也再不会退出程序。

爆破成功。也就是将0043ABAA处的数值 740A 改为EB0A 即可。

如果不脱壳,可以写一个内存补丁程序,对 0043ABAA 处的数值 进行修正:

带壳程序入口点:  00504001  PUSHAD

OD刚加载时,0043ABAA 处的代码不对, 单步运行壳中的程序,当壳运行到00504189时,0043ABAA 处的代码已经解出。

所以,可以在00504189处,对程序代码进行修正.

-----------------------------------------------------------------------------------------------------------------------------------------------------
五. 内存补丁程序源码:

;==========================================================================================
;
;程序说明: SockMon5.exe 内存补丁程序
;
;工作原理:本程序直接加载带壳的SockMon5.exe程序,当外壳解完程序代码后,将0043ABAA处的
;
;          指令由 740A 改为EB0A 即可, 也就是JNZ 改为JMP。
;
;运行要求:将编译后的内存注册机放SockMon5.exe程序的同一目录下,然后运行内存注册机即可启动
;          SockMon5.exe, 没有时间限制。
;
;==========================================================================================

.386
.model     flat,stdcall
option     casemap:none

include     c:/radasm/masm32/include/windows.inc
include   c:/radasm/masm32/include/kernel32.inc
include    c:/radasm/masm32/include/user32.inc
include   c:/radasm/masm32/include/masm32.inc
include   c:/radasm/masm32/Macros/Strings.mac

includelib   c:/radasm/masm32/lib/kernel32.lib
includelib   c:/radasm/masm32/lib/masm32.lib
includelib   c:/radasm/masm32/lib/user32.lib


.code
;==================================================================================================
; 修改目标进程代码(只更改一个BYTE值),返回值为修改之前的值 
WriteProcessByte proc hProcess:DWORD,Address:DWORD,NewByte:DWORD

  LOCAL  dwTemp,OldByte
  
  .if  Address>=80000000h || Address == 0        ;0x80000000以上的地址为系统共有区域,不可以修改
    mov  eax,NewByte
    ret
  .endif

  invoke  ReadProcessMemory,hProcess,Address,addr OldByte,1,addr dwTemp  ;取得原来的代码
  mov  ebx,NewByte
  .if  !eax || OldByte==ebx
    mov  eax,OldByte    ;原来的代码和准备修改的代码相同,没有必要再修改  
    ret
  .endif
  
  invoke  WriteProcessMemory,hProcess,Address,addr NewByte,1,addr dwTemp  ;修改目标代码
  mov  eax,OldByte  
  ret
WriteProcessByte endp

;==================================================================================================
; 修改目标进程代码(更改数量由参数定义)
WriteProcessCode proc hProcess:DWORD,Address:DWORD,lpBuf:DWORD,nSize:DWORD

  LOCAL  dwTemp  
  .if  Address>=80000000h || Address == 0        ;0x80000000以上的地址为系统共有区域,不可以修改
    xor   eax,eax
    ret
  .endif
  
  invoke  WriteProcessMemory,hProcess,Address,lpBuf,nSize,addr dwTemp  ;修改目标代码
  mov  ebx,nSize
  xor  eax,eax  

  .if  ebx == dwTemp
    inc  eax    
  .endif
  ret
WriteProcessCode endp


;==================================================================================================
;
;调试API函数  参数:DbgSoftPath - 目标程序的路径(地址)
;
;==================================================================================================
DbgSoft proc DbgSoftPath
  LOCAL   startinfo:STARTUPINFO
  LOCAL   pi:PROCESS_INFORMATION
  LOCAL   DBEvent:DEBUG_EVENT
  LOCAL  stCT:CONTEXT

  LOCAL  hProcess,OldByte,NewCode
  LOCAL  OEPAddr,ObjAddr1,BkPointAddr  
  LOCAL  PatchAddr1      ; 代码补丁处地址
  
  mov  OEPAddr,00504001h    ; OEP 处地址
  mov  ObjAddr1,00504189h    ; 让被调程序运行到目标地址上停下的地址

  mov  PatchAddr1,0043ABAAh    ; 代码补丁处地址
  
  ;以调试方式运行目标程序
  invoke GetStartupInfo,addr startinfo   
  invoke CreateProcess, DbgSoftPath, NULL, NULL, NULL, FALSE, DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS,NULL, NULL, addr startinfo, addr pi
  .if  eax == 0
    invoke  MessageBox,NULL,$CTA0("无法运行目标程序."),$CTA0("错误"),MB_OK or MB_ICONINFORMATION
    ret
  .endif 
  
  .while   TRUE 
       invoke WaitForDebugEvent, addr DBEvent, INFINITE 
       
       .if DBEvent.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENT     ;被调试进程退出       
             .break
             
       .elseif DBEvent.dwDebugEventCode==CREATE_PROCESS_DEBUG_EVENT   ;被调试进程创建
      push  DBEvent.u.CreateProcessInfo.hProcess
      pop  hProcess
      invoke  WriteProcessByte,hProcess,OEPAddr,0CCh    ;在被调试程序的 OEP 处设置一个断点
      mov  OldByte,eax
                   
       .elseif DBEvent.dwDebugEventCode==EXCEPTION_DEBUG_EVENT   ;被调试进程出现异常事件
             
             ;得到断点地址
             push  DBEvent.u.Exception.pExceptionRecord.ExceptionAddress
             pop  BkPointAddr          
             
             ;如果是断点事件异常, 让被调试进程继续运行
             .if DBEvent.u.Exception.pExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOINT   
                mov  eax,BkPointAddr
                
                .if  eax==OEPAddr  ;如果断点在OEP处
                  invoke  WriteProcessByte,hProcess,OEPAddr,OldByte    ;恢复OEP处代码
                  invoke  WriteProcessByte,hProcess,ObjAddr1,0cch      ;在目标地址处设置断点
                  mov  OldByte,eax
                  
                  mov  stCT.ContextFlags,CONTEXT_FULL
                  invoke  GetThreadContext,pi.hThread,addr stCT      ;取得线程上下文
                  dec  stCT.regEip            
                  invoke  SetThreadContext,pi.hThread,addr stCT  
                        
                .elseif  eax==ObjAddr1  ;如果断在目标地址处                  
                  invoke  WriteProcessByte,hProcess,ObjAddr1,OldByte    ;修正目标地址处的代码
                  
                  mov  stCT.ContextFlags,CONTEXT_FULL
                  invoke  GetThreadContext,pi.hThread,addr stCT      ;取得线程上下文
                  dec  stCT.regEip            
                  invoke  SetThreadContext,pi.hThread,addr stCT
                
                  mov  NewCode,90900aebh          ;新代码 eb 0a 也就是改为: jmp ***
                  
                  invoke  WriteProcessCode,hProcess,PatchAddr1,addr NewCode,2  ;对被丁地址处,进行修改代码(2个字节)             
                .endif
             .endif            
       .endif        
    invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_CONTINUE  ;DBG_EXCEPTION_NOT_HANDLED
     
  .endw 
  
  invoke CloseHandle,pi.hProcess 
  invoke CloseHandle,pi.hThread 
  ret
DbgSoft endp

DebugRunProgramme proc lpFileName
  LOCAL  szDbgExePath[256]:byte
  
  invoke  GetAppPath,addr szDbgExePath  ;获得应用程序路径(不含执行文件名)
  invoke  lstrcat,addr szDbgExePath,lpFileName
  
  invoke  DbgSoft,addr szDbgExePath

  ret
DebugRunProgramme endp


;==================================================================================================
;
;程序入口
;
;==================================================================================================
start:  
         invoke  DebugRunProgramme,$CTA0("SockMon5.exe")      ;调试运行目标程序
        invoke ExitProcess,NULL
end start


-----------------------------------------------------------------------------------------------------------------------------------------------------
六、后记

这个软件虽然误打误撞,给破了,但感觉还是很遗憾,没有能力从网络数据包分析的途径来分析破解它。此次破解,只能说是一个幸运!

 
下面这个模块是我使用易语言时写补丁最常用的一个模块(当然很多也是抄的),一开始我觉得bug肯定会很多,放出去肯定又会坑很多人,后来我发现坑坑更健康,当你明白一个东西的优缺点之后,你才会更好的选择你所需要的。所以呢,现在模块开源了,希望对某些朋友有参考意义或者说使用价值吧。 声明:大家使用过程中发现任何问题都不要来问我,请自己想办法解决。我现在已经完全放弃易语言了,改用VC++了。 以下是全部接口: 模块名称:sunflover.ec 作者:by sunflover 版本:2015.2 自己收集的一些常用函数,方便写补丁。 @备注: 自己收集的一些常用函数 ------------------------------ .版本 2 .子程序 Ansi2Unicode, 字节集, 公开, 将Ansi码转换为Unicode码 (返回转换后的字节集) .参数 Ansi, 文本型, , 欲转换的Ansi文本 .子程序 AntiDebug, 逻辑型, 公开, 这个没啥用,效果差;可放在程序运行的第一个函数 被调试返回真 .子程序 AntiODMenu, 逻辑型, 公开, 这个效果较好,推荐用这个;找到OD相关句柄返回真, 此函数枚举窗口通过菜单名来 判定是否OD窗口。 .子程序 AntiStrongOD, 逻辑型, 公开, 这个效果还行,检测带有驱动的 OD调试器 此函数专门对付 StrongOD 插件 .参数 判断OD运行状态, 逻辑型, 可空, 此参数作用: 发现OD驱动时 —是否检测OD运行状态作为返回值基础 ,默认判断运行状态 .子程序 Bin2Dec, 整数型, 公开, 字节集到整数 .参数 Bin, 字节集 .子程序 Bin2Hex, 文本型, 公开, 字节集到十六进制文本 .参数 字节集, 字节集 .子程序 Bin2Hex1, 文本型, 公开, 文本型->文本型 .参数 Bin, 文本型 .子程序 BinXor, 字节集, 公开, 字节集异或 .参数 需异或的字节集, 字节集, , 返回的字节集 .参数 参与异或的字节集, 字节集 .子程序 Dec2Hex, 文本型, 公开, 十到十六 .参数 十进制转换数据, 长整数型 .子程序 GetAPIAddress, 整数型, 公开, 失败返回0 .参数 模块名, 文本型, , 如"user32.dll","kernel32.dll" .参数 API, 文本型, , 如“CreateWindowExA” .子程序 Hex2Bin, 字节集, 公开, 十六进制文本到字节集 .参数 原文, 文本型 .子程序 Hex2Bin1, 文本型, 公开, 文本型->文本型 .参数 Hex, 文本型 .子程序 Hex2Dec, 整数型, 公开, 十六到十 .参数 十六进制转换数据, 文本型 .子程序 InjectDll, 逻辑型, 公开, 向目标进程中注入一个指定 Dll 模块文件;注入成功返回 true, 注入失败则返回 false,CreateRemoteThread法 .参数 进程ID, 整数型, , 进程PID .参数 DLL文件名, 文本型, , 欲注入的DLL名称 .子程序 InjectDLL1, 逻辑型, 公开, SuspendThread,shellcode,SetEip .参数 PID, 整数型 .参数 DLL路径, 文本型 .子程序 InjectDLL2, 逻辑型, 公开, code cave,与InjectDLL1同 .参数 进程ID, 整数型 .参数 DLL文件名, 文本型 .子程序 inline_patch, 逻辑型, 公开, 失败返回假,成功返回真;适合patch尚未运行的加壳或不加壳的可执行文件 .参数 文件名, 文本型, , 文件全路径 .参数 模块名, 文本型, , 如"user32.dll" .参数 API, 文本型, , 如“CreateWindowExA” .参数 地址, 整数型, , 如Hex2Dec (“00401000”) .参数 数据, 字节集, , 如 Hex2Bin (“90909090”) .子程序 inline_patch_Pro, 逻辑型, 公开, 失败返回假,成功返回真;适合patch尚未运行的加壳不加壳的可执行文件,需要补丁的数据较多时建议使用这个,在子程序中打补丁 .参数 文件名, 文本型, , 文件全路径 .参数 模块名, 文本型, , 如"user32.dll" .参数 API, 文本型, , 如“CreateWindowExA” .参数 子程序指针, 子程序指针, , 如&子程序1 .子程序 inline_patch_Pro1, 逻辑型, 公开, 失败返回假,成功返回真;适合patch尚未运行的加壳或不加壳的可执行文件,解码时机判断是选用VirtualProtect;如果壳检测到了,自行换用inline_patch或inline_patch_Pro .参数 文件名, 文本型, , 文件全路径 .参数 子程序指针, 子程序指针, , 如&子程序1 .参数 地址, 整数型, 可空, 如Hex2Dec (“00401000”),用来判断是否解码完成;如果没壳,就空着 .子程序 inline_patch1, 逻辑型, 公开, patch尚未运行的,没加壳的程序,并运行它 .参数 文件名, 文本型, , 文件全路径 .参数 地址, 整数型, , 如Hex2Dec (“00401000”) .参数 数据, 字节集, , 如 Hex2Bin (“90909090”) .子程序 InlinePatch, 逻辑型, 公开, 失败返回假,成功返回真;适合patch尚未运行的加壳不加壳的可执行文件,需要补丁的数据较多时建议使用这个,在子程序中打补丁 .参数 文件名, 文本型, , 文件全路径,如"D:\test.exe" .参数 运行参数, 文本型, 可空, 可空,没有参数则留空,大多数情况没有参数;有参数时填写,如"-s" .参数 模块名, 文本型, , 如"user32.dll" .参数 API, 文本型, , 如“CreateWindowExA” .参数 API中断次数, 整数型, 可空, 可空,有些时候需要计次,根据需要填写;一般留空即可,留空表示中断第一次,就开始补丁 .参数 补丁程序, 子程序指针, , 如&子程序1 .参数 寄存器结构体, context_, 参考 可空, 可空,CONTEXT,返回寄存器结构体,方便写补丁函数;这个属于高级功能,看不懂的话就留空吧 .参数 进程信息结构体, PROCESS_INFORMATION, 参考 可空, 可空,PROCESS_INFORMATION,返回进程信息结构体,方便写补丁函数;这个属于高级功能,看不懂的话就留空吧 .子程序 OpenProcessPro, 整数型, 公开, 返回句柄权限是完全访问 .参数 PID, 整数型 .子程序 OpenThreadPro, 整数型, 公开, 返回句柄权限是完全访问 .参数 进程ID, 整数型 .子程序 Unicode2Ansi, 文本型, 公开, 将Unicode码转换为Ansi码 (返回转换后的文本) .参数 Unicode, 字节集, , 欲转换的Unicode字节集 .子程序 UnInjectDLL1, 逻辑型, 公开, SuspendThread,shellcode,SetEip .参数 PID, 整数型 .参数 DLL路径, 文本型 .子程序 UnInjectDLL2, 逻辑型, 公开, 远程时钟卸载dll .参数 参数_窗口句柄, 整数型, , FindWindow(字符 (0),“计算器”) .参数 参数_DLL路径, 文本型, , '可以是DLL全路径也可以只是DLL名称 .子程序 超级延时, , 公开, 高精度延时,cpu占用低,窗口不卡死,一次最大可延时几年 (无返回值) .参数 延时间隔, 整数型, , 1000微秒 = 1毫秒 ; 1000毫秒 = 1秒 .参数 延时单位, 整数型, 可空, 可空:毫秒 0 毫秒 1 微秒 2 秒 3 分 4 小时 5 天 .子程序 打开保存文件对话框, 文本型, 公开, 未提示 是否有重复的文件存在 自己注意一下 .参数 窗口句柄, 整数型, 可空, 调用处窗口句柄 .参数 窗口标题, 文本型, 可空, 对话框窗口标题 .参数 过滤器, 文本型, 可空, 格式:“MP3文件(*.mp3)|*.mp3|媒体文件(*.mpg)|*.mpg” .参数 初始路径, 文本型, 可空, 可以被省略。如果本参数被省略,默认从“我的文档”开始。否则,请给出盘符,如“d:” .子程序 打开多文件对话框, 文本型, 公开, 如果多选文件,返回文件路径以“;”(半角分号)分隔。失败或取消返回空文本。 .参数 窗口句柄, 整数型, 可空, 调用处窗口句柄 .参数 窗口标题, 文本型, 可空, 对话框窗口标题 .参数 过滤器, 文本型, 可空, 格式:“MP3文件(*.mp3)|*.mp3|媒体文件(*.mpg)|*.mpg” .参数 初始路径, 文本型, 可空, 可以被省略。如果本参数被省略,默认从“我的文档”开始。否则,请给出盘符,如“d:” .参数 窗口风格, 整数型, 可空, 可以被省略。如果本参数被省略,默认为 0 。位置值从 0 开始。从0-11之间,可以设置多种窗口风格。0.工具栏、只读选择框-未选中;1.工具栏、只读选择框-选中;2.工具栏;3.工具栏、只读选择框-未选中,帮助按钮;4.工具栏、只读选择框-选中,帮助按钮;5.工具栏,帮助按钮;6.普通风格、只读选择框-未选中;7.普通风格、只读选择框-选中;8.普通风格;9.普通风格、只读选择框-未选中,帮助按钮;10.普通风格、只读选择框-选中,帮助按钮;11.普通风格、帮助按钮。 .子程序内存字节集, 字节集, 公开, 从内存中读取字节集数据(返回字节集,失败返回0字节长度的空字节集) .参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , 内存地址 .参数 长度, 整数型, , 欲读取内存数据的长度 .子程序 复制文件夹, 逻辑型, 公开, 可复制文件,也可复制目录。成功返回真,失败返回假。 .参数 被复制的文件或目录, 文本型 .参数 复制到的位置, 文本型 .子程序 恢复进程, 逻辑型, 公开 .参数 PID, 整数型 .子程序 结束进程, 逻辑型, 公开 .参数 进程ID, 整数型 .子程序 进程取ID, 整数型, 公开, 取指定进程的进程ID(返回第一个进程ID,失败返回空信息) .参数 进程名, 文本型, , 程序进程名(不区分大小写!) .子程序 进程是否存在1, 逻辑型, 公开 .参数 进程ID, 整数型 .子程序 进程是否存在2, 逻辑型, 公开 .参数 进程名, 文本型 .子程序 蓝屏, , 公开, 惩罚破解者函数 。 在确定当前程序被调试后 可使用此函数让系统蓝屏。 慎重使用! .子程序 内存补丁, 逻辑型, 公开, 根据进程名补丁内存,patch已经运行的可执行文件 .参数 进程名, 文本型, , '完整的文件名,注意大小写 .参数 地址, 文本型, , 需patch地址,如“00401000” .参数 代码, 文本型, , 被替换的代码,如“90909090” .子程序 内存补丁1, 逻辑型, 公开, 根据进程ID补丁内存,patch已经运行的可执行文件 .参数 进程ID, 整数型, , 要补丁的进程ID .参数 地址, 文本型, , 需patch地址,如“00401000” .参数 代码, 文本型, , 被替换的代码,如“90909090” .子程序 内存搜索, 整数型, 公开, 某些情况,需提升权限(返回结果数目,失败返回0),返回搜索到的数目 .参数 进程ID, 整数型, , 进程ID .参数 搜索内容, 字节集, , 欲搜索的内容 其他类型-需自行转换为字节集类型 .参数 结果数组, 整数型, 参考 数组, 用来保存搜索的结果 .子程序 取汇编指令长度, 整数型, 公开, 返回指定进程指定地址处的首条汇编指令的长度。注:计算方法使用的是LDX32 .参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , 指令地址,如Hex2Dec("00401000") .子程序 取寄存器值, 文本型, 公开, 适用于明码读码,运行到地址处读真码;如 取寄存器值(文件名,"user32.dll",“CreateWindowExA”,Hex2Dec (“00401000”),“Eax”) .参数 文件名, 文本型, , 文件全路径 .参数 模块名, 文本型, , 如"user32.dll" .参数 API, 文本型, , 如“CreateWindowExA”,这里主要为了解码时机 .参数 地址, 整数型, , 如Hex2Dec (“00401000”) .参数 寄存器, 文本型, , 可选Dr0-Dr7,Eax,Ecx,Ebx,Edx,Ebp,Esp,Eip,Edi,Esi,SegGs,SegFs,SegEs,SegDs,SegCs,EFlags,Esp,SegSs .子程序 取进程主线程, 整数型, 公开, 失败返回0 .参数 进程ID, 整数型 .子程序 取路径目录, 文本型, 公开, 返回一个文件所在目录,如"C:\Program Files\WinRAR\WinRAR.exe",返回"C:\Program Files\WinRAR" .参数 路径, 文本型, , 如"C:\Program Files\WinRAR\WinRAR.exe" .子程序 取路径文件名, 文本型, 公开, 根据文件路径获取文件名 .参数 路径, 文本型, , 文件完整路径 .子程序 取线程起始地址, 整数型, 公开, 失败返回0 .参数 参数_dwThreadId, 整数型 .子程序 去除空格, 文本型, 公开 .参数 文本, 文本型 .子程序 设置颜色对话框, 逻辑型, 公开, 例如:如果真 (设置颜色对话框 (取窗口句柄 (), j));编辑框1.文本颜色 = 到整数 (j)。 .参数 窗口句柄, 整数型 .参数 返回_颜色, 文本型, , 返回的颜色~~需要传回整数 .子程序 申请内存Pro, 整数型, 公开, 成功返回申请的首地址,失败返回0;申请的内存可读可写可执行 .参数 进程ID, 整数型, , .参数 申请内存大小, 整数型 .子程序 释放内存Pro, 逻辑型, 公开 .参数 进程ID, 整数型, , .参数 内存地址, 整数型 .子程序 特征码模糊搜索, 整数型, 公开, 最多支持三段通配符如“68 00 00 00 40 ?? ?? ?? ?? ?? ?? ?? ?? 50 E8 ?? ?? ?? ?? 12 34 ?? ?? ?? ?? 85 69” .参数 进程ID, 整数型, , 进程ID .参数 特征码, 文本型, , 十六进制文本,如“68 00 00 00 40 ?? ?? ?? ?? ?? ?? ?? ?? 50 E8” .参数 结果数组, 整数型, 参考 数组, 用来保存搜索的结果 .参数 偏移, 整数型, 可空, 默认为0 .参数 起始地址, 文本型, 可空, 默认为“00400000” .参数 结束地址, 文本型, 可空, 默认为“00800000” .子程序 提升进程权限, 逻辑型, 公开 .参数 目标进程, 整数型, 可空 .参数 权限类别, 文本型, 可空, 默认为“SeDebugPrivilege”;可选“SeDebugPrivilege”,“SeShutdownPrivilege”,“SeRestorePrivilege”,“SeBackupPrivilege” .子程序内存字节集, 逻辑型, 公开, 往内存中写入字节集数据(成功返回真,失败返回假);注:内部有VirtualProtectEx处理 .参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , 内存地址 .参数 数据, 字节集, , 写入数据 如果为其它数据类型,可以用 到字节集() 将数据转换为字节集 .参数 写入长度, 整数型, 可空, 默认为全部数据,(参考: 1字节型 2短整数型 4长整数型,小数型,指针 8长整数型,双精度小数型,日期时间型) .子程序 移动文件夹, 逻辑型, 公开, 可移动文件,也可移动目录。成功返回真,失败返回假。 .参数 被移动的文件或目录, 文本型 .参数 移动到的位置, 文本型 .子程序 隐藏进程, 逻辑型, 公开, hide.dll,会被误报,大家看着处理 .参数 进程ID, 整数型 .子程序 暂停进程, 逻辑型, 公开 .参数 PID, 整数型 .子程序 终止进程Pro, , 公开, 终止进程,终止所有指定进程 .参数 进程名, 文本型, , 程序进程名(不区分大小写!) .子程序 终止线程, 逻辑型, 公开, 成功返回真 失败返回假 .参数 参数_线程ID, 整数型 .数据类型 context_, 公开, 公开 .成员 ContextFlags, 整数型 .成员 Dr0, 整数型 .成员 Dr1, 整数型 .成员 Dr2, 整数型 .成员 Dr3, 整数型 .成员 Dr4, 整数型 .成员 Dr5, 整数型 .成员 Dr6, 整数型 .成员 Dr7, 整数型 .成员 ControlWord, 整数型 .成员 StatusWord, 整数型 .成员 TagWord, 整数型 .成员 ErrorOffset, 整数型 .成员 ErrorSelector, 整数型 .成员 DataOffset, 整数型 .成员 DataSelector, 整数型 .成员 RegisterArea, 字节型, , "72" .成员 Cr0NpxState, 整数型 .成员 SegGs, 整数型 .成员 SegFs, 整数型 .成员 SegEs, 整数型 .成员 SegDs, 整数型 .成员 Edi, 整数型 .成员 Esi, 整数型 .成员 Ebx, 整数型 .成员 Edx, 整数型 .成员 Ecx, 整数型 .成员 Eax, 整数型 .成员 Ebp, 整数型 .成员 Eip, 整数型 .成员 SegCs, 整数型 .成员 EFlags, 整数型 .成员 Esp, 整数型 .成员 SegSs, 整数型 .成员 reserve, 字节型, , "512" .数据类型 FLOATING_SAVE_AREA, 公开 .成员 ControlWord, 整数型 .成员 StatusWord, 整数型 .成员 TagWord, 整数型 .成员 ErrorOffset, 整数型 .成员 ErrorSelector, 整数型 .成员 DataOffset, 整数型, , , ; .成员 DataSelector, 整数型 .成员 RegisterArea, 字节型, , "80" .成员 Cr0NpxState, 整数型 .数据类型 LuID, 公开 .成员 lowpart, 整数型 .成员 highpart, 整数型 .数据类型 MEMORY_BASIC_INFORMATION, 公开 .成员 BaseAddress, 整数型 .成员 AllocationBase, 整数型 .成员 AllocattionProtect, 整数型 .成员 RegionSize, 整数型 .成员 State, 整数型 .成员 Protect, 整数型 .成员 Type, 整数型 .数据类型 MODULEENTRY32, 公开, MODULEENTRY32 .成员 dwSize, 整数型, , , dwSize .成员 th32ModuleID, 整数型, , , th32ModuleID .成员 th32ProcessID, 整数型, , , th32ProcessID .成员 GlblcntUsage, 整数型, , , GlblcntUsage .成员 ProccntUsage, 整数型, , , ProccntUsage .成员 modBaseAddr, 整数型, , , modBaseAddr .成员 modBaseSize, 整数型, , , modBaseSize .成员 hModule, 整数型, , , hModule .成员 szModule, 字节型, , "256", 模块名称 .成员 szExePath, 字节型, , "260", 文件路径 .数据类型 PROCESS_BASIC_INFORMATION, 公开 .成员 ExitStatus, 整数型 .成员 PebBaseAddress, 整数型 .成员 AffinityMask, 整数型 .成员 BasePriority, 整数型 .成员 UniqueProcessId, 整数型 .成员 InheritedFromUniqueProcessId, 整数型 .数据类型 PROCESS_INFORMATION, 公开 .成员 hProcess, 整数型 .成员 hThread, 整数型 .成员 dwProcessId, 整数型 .成员 dwThreadId, 整数型 .数据类型 SECURITY_ATTRIBUTES, 公开, , SECURITY_ATTRIBUTES .成员 nLength, 整数型 .成员 lpSecurityDescriptor, 整数型 .成员 bInheritHandle, 整数型 .数据类型 SHFILEOPSTRUCT, 公开 .成员 句柄, 整数型 .成员 wFunc, 整数型 .成员 pFrom, 字节集 .成员 pTo, 字节集 .成员 fFlags, 短整数型 .成员 fAnyOperationsAborted, 整数型 .成员 hNameMappings, 整数型 .成员 lpszProgressTitle, 文本型 .数据类型 STARTUPINFO, 公开 .成员 cb, 整数型 .成员 lpReserved, 文本型 .成员 lpDesktop, 文本型 .成员 lpTitle, 文本型 .成员 dwX, 整数型 .成员 dwY, 整数型 .成员 dwXSize, 整数型 .成员 dwYSize, 整数型 .成员 dwXCountChars, 整数型 .成员 dwYCountChars, 整数型 .成员 dwFillAttribute, 整数型 .成员 dwFlags, 整数型 .成员 wShowWindow, 短整数型 .成员 cbReserved2, 短整数型 .成员 lpReserved2, 整数型 .成员 hStdInput, 整数型 .成员 hStdOutput, 整数型 .成员 hStdError, 整数型 .数据类型 STARTUPINFO1, 公开 .成员 cb, 整数型 .成员 lpReserved, 整数型 .成员 lpDesktop, 整数型 .成员 lpTitle, 整数型 .成员 dwX, 整数型 .成员 dwY, 整数型 .成员 dwXSize, 整数型 .成员 dwYSize, 整数型 .成员 dwXCountChars, 整数型 .成员 dwYCountChars, 整数型 .成员 dwFillAttribute, 整数型 .成员 dwFlags, 整数型 .成员 wShowWindow, 短整数型 .成员 cbReserved2, 短整数型 .成员 lpReserved2, 字节型 .成员 hStdInput, 整数型 .成员 hStdOutput, 整数型 .成员 hStdError, 整数型 .数据类型 THREADENTRY32, 公开 .成员 dwsize, 整数型 .成员 cntUsage, 整数型 .成员 th32ThreadID, 整数型 .成员 th32OwnerProcessID, 整数型 .成员 tpBasePri, 长整数型 .成员 tpDeltaPri, 长整数型 .成员 dwFlags, 整数型 .数据类型 窗口句柄类, 公开 .成员 句柄, 整数型 .成员 标题, 文本型 .成员 类名, 文本型 .数据类型 打开文件名, 公开, OPENFILENAME .成员 结构大小, 整数型, , , lStructSize .成员 窗口句柄, 整数型, , , hwndOwner .成员 实例句柄, 整数型, , , hInstance .成员 过滤器, 字节集, , , lpstrFilter .成员 自定义过滤器, 文本型, , , lpstrCustomFilter .成员 自定义过滤器最大长度, 整数型, , , nMaxCustFilter .成员 过滤器索引, 整数型, , , nFilterIndex .成员 文件名, 字节集, , , lpstrFile .成员 文件名最大长度, 整数型, , , nMaxFile .成员 文件标题, 文本型, , , lpstrFileTitle .成员 文件标题最大长度, 整数型, , , nMaxFileTitle .成员 初始目录, 文本型, , , lpstrInitialDir .成员 标题, 文本型, , , lpstrTitle .成员 标志, 整数型, , , flags .成员 文件偏移量, 整数型, , , nFileOffset .成员 文件扩展名, 整数型, , , nFileExtension .成员 默认扩展名, 文本型, , , lpstrDefExt .成员 自定义数据, 整数型, , , lCustData .成员 回调函数地址, 整数型, , , lpfnHook .成员 模板名, 文本型, , , lpTemplateName .数据类型 函数信息, 公开 .成员 模块索引, 整数型 .成员 ThunkRav, 文本型 .成员 Thunk偏移, 文本型 .成员 Thunk值, 文本型 .成员 序数, 文本型 .成员 名称, 文本型 .数据类型 寄存器, 公开 .成员 标记, 整数型 .成员 dr0, 整数型 .成员 dr1, 整数型 .成员 dr2, 整数型 .成员 dr3, 整数型 .成员 dr6, 整数型 .成员 dr7, 整数型 .成员 FloatSave, FLOATING_SAVE_AREA .成员 seggs, 整数型 .成员 segfs, 整数型 .成员 seges, 整数型 .成员 segds, 整数型 .成员 edi, 整数型 .成员 esi, 整数型 .成员 ebx, 整数型 .成员 edx, 整数型 .成员 ecx, 整数型 .成员 eax, 整数型 .成员 ebp, 整数型 .成员 eip, 整数型 .成员 SegCs, 整数型 .成员 eflags, 整数型 .成员 esp, 整数型 .成员 SegSs, 整数型 .数据类型 进程信息, 公开, 进程信息 .成员 dwSize, 整数型 .成员 cntUsage, 整数型 .成员 进程ID, 整数型 .成员 th32DefaultHeapID, 整数型 .成员 th32ModuleID, 整数型 .成员 cntThreads, 整数型 .成员 th32ParentProcessID, 整数型 .成员 pcPriClassBase, 整数型 .成员 dwFlags, 整数型 .成员 进程名称, 字节型, , "256" .数据类型 逻辑字体, 公开, $(a)LOGFONT .成员 高度, 整数型, , , lfHeight .成员 宽度, 整数型, , , lfWidth .成员 控制摆, 整数型, , , lfEscapement .成员 定方位, 整数型, , , lfOrientation .成员 加粗, 整数型, , , lfWeight .成员 斜体, 字节型, , , lfItalic .成员 下划线, 字节型, , , lfUnderline .成员 删除线, 字节型, , , lfStrikeOut .成员 零碎工作组合, 字节型, , , lfCharSet .成员 出自精确, 字节型, , , lfOutPrecision .成员 修剪精确, 字节型, , , lfClipPrecision .成员 性质, 字节型, , , lfQuality .成员 间距, 字节型, , , lfPitchAndFamily .成员 字体名称, 字节型, , "32", 用LF_FACESIZE,lfFaceName? .数据类型 色盒, 公开 .成员 lStructsize, 整数型 .成员 hwndOwner, 整数型 .成员 hInstance, 整数型 .成员 rgbResult, 整数型 .成员 lpCustColors, 文本型, , , 可以指定16个数组,也可以不用指定,但无论用否,必须传址 .成员 flags, 整数型 .成员 lCustData, 整数型 .成员 lpfnHook, 子程序指针 .成员 lpTemplateName, 文本型 .数据类型 设定执行文件信息, 公开, SHELLEXECUTEINFO .成员 结构大小, 整数型, , , cbSize .成员 标志, 整数型, , , fMask .成员 窗口句柄, 整数型, , , hwnd .成员 操作命令, 文本型, , , lpVerb .成员 文件名, 文本型, , , lpFile .成员 应用程序参数, 文本型, , , lpParameters .成员 目录, 文本型, , , lpDirectory .成员 显示标志, 整数型, , , nShow .成员 实例句柄, 整数型, , , hInstApp .成员 项目标识符列表结构指针, 整数型, , , lpIDList .成员 文件类别, 文本型, , , lpClass .成员 热键句柄, 整数型, , , hkeyClass .成员 热键, 整数型, , , dwHotKey .成员 图标句柄, 整数型, , , hIcon .成员 进程句柄, 整数型, , , hProcess .数据类型 文件夹信息, 公开, BROWSEINFO .成员 窗口句柄, 整数型, , , hOwner .成员 根目录, 整数型, , , pidlRoot .成员 显示名称, 文本型, , , pszDisplayName .成员 标题, 文本型, , , lpszTitle .成员 标志, 整数型, , , ulFlags .成员 回调函数地址, 整数型, , , lpfn .成员 回调函数参数, 整数型, , , lParam .成员 图像索引, 整数型, , , iImage .数据类型 项目标识符列表, 公开, ITEMIDLIST .成员 结构大小, 整数型, , , cb .成员 标识符长度, 字节型, , "255", abID .数据类型 选择字体, 公开, CHOOSEFONT .成员 结构大小, 整数型, , , lStructSize .成员 窗口句柄, 整数型, , , hwndOwner,caller's window handle .成员 设备场景句柄, 整数型, , , hDC,printer DC/IC or NULL .成员 字体结构指针, 整数型, , , lpLogFont‘ptr. to a LOGFONT struct .成员 点大小, 整数型, , , iPointSize,10 * size in points of selected font .成员 标志, 整数型, , , flags,enum. type flags .成员 颜色值, 整数型, , , rgbColors,returned text color .成员 自定义数据, 整数型, , , lCustData,data passed to hook fn. .成员 回调函数地址, 整数型, , , lpfnHook,ptr. to hook function .成员 模板名称, 文本型, , , lpTemplateName,custom template name .成员 实例句柄, 整数型, , , hInstance,instance handle of.EXE that contains cust. dlg. template .成员 字体风格, 文本型, , , lpszStyle,return the style field here must be LF_FACESIZE(32) or bigger .成员 字体类型, 短整数型, , , nFontType,same value reported to the EnumFonts,call back with the extra FONTTYPE_ bits added .成员 空白队列, 短整数型 .成员 最小尺寸, 整数型 .成员 最大尺寸, 整数型 .数据类型 字体信息, 公开 .成员 名称, 文本型 .成员 大小, 整数型 .成员 颜色, 整数型 .成员 类型, 整数型 .成员 斜体, 整数型 .成员 下划线, 整数型 .程序集 IATHOOK类, , 公开 .子程序 APIAddr, 整数型, 公开, '此方法放在IATHOOK后调用方可成功,失败返回0 .子程序 IATHook, 逻辑型, 公开, 完事后注意调用IATUnHook .参数 进程ID, 整数型, 可空, '为空表示自身进程 .参数 模块名, 文本型, , 需加后缀,如“user32.dll” .参数 函数名, 文本型, , 注意大小写,如“MessageBoxA” .参数 新地址, 整数型, , 到整数 (&HookCallBack) .子程序 IATUnHook, 逻辑型, 公开, 与IATHOOK参数完全相同 .参数 进程ID, 整数型, 可空, 为空表示本进程 .参数 模块名, 文本型, , 需加后缀,如“user32.dll” .参数 函数名, 文本型, , 注意大小写,如“MessageBoxA” .参数 地址, 整数型, , 与IATHOOK最后一个参数相同 .程序集 PE类, , 公开, 获取可执行程序入口点,加数据; .子程序 GetEntryPoint, 整数型, 公开, 获取的是OEP,即EP+imagebase .参数 全文件路径, 文本型, , 要处理的文件全路径 .子程序 overlay, 字节集, 公开, 获取PE文件的加数据 .参数 全文件路径, 文本型, , 要处理的文件全路径 .程序集 超级解压类, , 公开, 调用7z解压文件,支持7z,zip,rar等压缩文件的带密码解压 .子程序 超级解压, 逻辑型, 公开, 解压压缩文件,支持rar,zip,7z等等压缩文件的解压,支持带密码解压 .参数 待解压文件, 文本型, , 欲解压的文件的全路径 .参数 解压到的目录, 文本型, , 欲解压到的路径 .参数 解压密码, 文本型, 可空, 解压所用密码,没有密码就不填 .程序集 汇编类, , 公开, 用于辅助生成shellcode,返回值都是字节集 .子程序 add_eax_char, 字节集, 公开, 占用3个字节,char值在0-127之间,返回汇编指令对应的字节集 .参数 char, 字节型, , add eax,1,参数为1,注意进制;16进制,请用Hex2Dec(Hex)转换 .子程序 add_eax_Num, 字节集, 公开, 占用5个字节,返回汇编指令对应的字节集 .参数 Num, 整数型, , add eax,8,参数为8,注意进制;16进制,请用Hex2Dec(Hex)转换 .子程序 add_esp_char, 字节集, 公开, 占用3个字节,char值在0-127之间,返回汇编指令对应的字节集 .参数 char, 字节型, , add esp,8,参数为8,注意进制;16进制,请用Hex2Dec(Hex)转换 .子程序 call, 字节集, 公开, 占用5个字节,call转换,返回汇编指令对应的字节集,此处为十进制,想用16进制,请自行转换;示例:call (Hex2Dec (“402000”), Hex2Dec (“401000”)) .参数 call到的地址, 整数型, , 00401000 call 00402000,参数为00402000 .参数 call所在的地址, 整数型, , 00401000 call 00402000,参数为00401000 .子程序 call_API, 字节集, 公开, 占用5个字节,如00401000 call MessageBoxA .参数 call所在地址, 整数型, , 自行转换,Hex2Dec("00401000") .参数 lpProcName, 文本型, , 如MessageBoxA .参数 hModule, 文本型, , 如user32.dll .子程序 call_API_FF15, 字节集, 公开, 占用6个字节,如00401000 call MessageBoxA .参数 lpProcName, 文本型, , 如MessageBoxA .参数 hModule, 文本型, , 如user32.dll .子程序 call_eax, 字节集, 公开, 占用2个字节,返回汇编指令对应的字节集 .子程序 call_FF15, 字节集, 公开, 占用6个字节,call转换,返回汇编指令对应的字节集,此处为十进制,想用16进制,请自行转换;示例:call (Hex2Dec (“402000”)) .参数 call到的地址, 整数型, , 00401000 call 00402000,参数为00402000 .子程序 jmp, 字节集, 公开, 占用5个字节,jmp转换,返回汇编指令对应的字节集,此处为十进制,想用16进制,请自行转换;jmp (Hex2Dec (“402000”), Hex2Dec (“401000”)) .参数 jmp_to, 整数型, , 00401000 jmp 00402000,参数为00402000 .参数 jmp_from, 整数型, , 00401000 jmp 00402000,参数为00401000 .子程序 jmp_FF25, 字节集, 公开, 占用6个字节,jmp转换,返回汇编指令对应的字节集,此处为十进制,想用16进制,请自行转换;jmp (Hex2Dec (“402000”)) .参数 jmp_to, 整数型, , 00401000 jmp 00402000,参数为00402000 .子程序 mov_eax_Num, 字节集, 公开, 占用5个字节,返回汇编指令对应的字节集 .参数 Num, 整数型, , 自己注意进制,mov eax,401000,参数为Hex2Dec(“401000”) .子程序 nop, 字节集, 公开, 占用个字节,返回汇编指令对应的字节集 .子程序 popad, 字节集, 公开, 占用1个字节,返回汇编指令对应的字节集 .子程序 popfd, 字节集, 公开, 占用1个字节,返回汇编指令对应的字节集 .子程序 push_char, 字节集, 公开, 占用2个字节,char值在0-127之间,返回汇编指令对应的字节集 .参数 char, 字节型, , push 8,参数为8,注意进制;16进制,请用Hex2Dec(Hex)转换 .子程序 push_eax, 字节集, 公开, 占用1个字节,返回汇编指令对应的字节集 .子程序 push_ebp, 字节集, 公开, 占用1个字节,返回汇编指令对应的字节集 .子程序 push_ebx, 字节集, 公开, 占用1个字节,返回汇编指令对应的字节集 .子程序 push_ecx, 字节集, 公开, 占用1个字节,返回汇编指令对应的字节集 .子程序 push_edi, 字节集, 公开, 占用1个字节,返回汇编指令对应的字节集 .子程序 push_edx, 字节集, 公开, 占用1个字节,返回汇编指令对应的字节集 .子程序 push_esi, 字节集, 公开, 占用1个字节,返回汇编指令对应的字节集 .子程序 push_esp, 字节集, 公开, 占用1个字节,返回汇编指令对应的字节集 .子程序 push_Num, 字节集, 公开, 占用5个字节,返回汇编指令对应的字节集 .参数 Num, 整数型, , push 401000,参数为Hex2Dec(401000),注意进制;16进制,请用Hex2Dec(Hex)转换 .子程序 pushad, 字节集, 公开, 占用1个字节,将通用寄存器的内容压入堆栈;返回汇编指令对应的字节集 .子程序 pushfd, 字节集, 公开, 占用1个字节,本指令可以把标志寄存器的内容保存到堆栈中去;返回汇编指令对应的字节集 .子程序 retn, 字节集, 公开, 占用1个字节,返回汇编指令对应的字节集 .子程序 retn_n, 字节集, 公开, 占用3个字节,返回汇编指令对应的字节集 .参数 n, 短整数型, , retn 3,参数填3,注意进制;16进制,请用Hex2Dec(Hex)转换 .子程序 xor_eax_eax, 字节集, 公开, 占用2个字节,返回汇编指令对应的字节集 .子程序 xor_ebx_ebx, 字节集, 公开, 占用2个字节,返回汇编指令对应的字节集 .子程序 xor_ecx_ecx, 字节集, 公开, 占用2个字节,返回汇编指令对应的字节集 .子程序 xor_edi_edi, 字节集, 公开, 占用2个字节,返回汇编指令对应的字节集 .子程序 xor_edx_edx, 字节集, 公开, 占用2个字节,返回汇编指令对应的字节集 .子程序 xor_esi_esi, 字节集, 公开, 占用2个字节,返回汇编指令对应的字节集 .程序内存DLL注入类, , 公开, 可能还有点问题 .子程序 取DLL函数地址, 整数型, 公开, 返回已经注入到指定进程内的DLL的函数地址。失败返回0。 .参数 DLL函数名, 文本型, , 区分大小写。 .子程序 是否已注入, 逻辑型, 公开, 已注入返回真,未注入返回假。 .子程序 卸载DLL, 逻辑型, 公开, 卸载已经注入的内存中的DLL,成功返回真,失败返回假.(最好不要卸载,卸载的话被注入的进程很容易崩溃) .子程序 执行DLL函数, 整数型, 公开, 执行已经注入到指定进程内的DLL的函数,成功返回所执行的函数的地址,失败返回0。 .参数 DLL函数名, 文本型, , 区分大小写。 .参数 等待函数执行完毕, 逻辑型, 可空, 默认为假,为真则函数执行完毕后本函数才返回。 .参数 返回值, 整数型, 参考 可空, 如果上一个参数为真,则可提供一个变量保存被执行的DLL函数的返回值。 .参数 线程句柄, 整数型, 参考 可空, 可提供变量保存函数执行线程的句柄,不需要请留空.接收了句柄记得不用时要关闭. .参数 参数1, 整数型, 可空, 可提供给被执行函数最多10个参数(理论上支持无限个,自己看着改吧)不需要的请留空。 .参数 参数2, 整数型, 可空, 非整数型参数需传递变量的内存数据指针,该指针必须是在目标进程内的。 .参数 参数3, 整数型, 可空, 提供的参数请与所执行的函数的参数个数一致,否则被注入的进程绝对会崩溃! .参数 参数4, 整数型, 可空 .参数 参数5, 整数型, 可空 .参数 参数6, 整数型, 可空 .参数 参数7, 整数型, 可空 .参数 参数8, 整数型, 可空 .参数 参数9, 整数型, 可空 .参数 参数10, 整数型, 可空 .子程序 注入DLL, 整数型, 公开, 成功返回DLL的模块句柄,失败或已注入返回0。 .参数 进程句柄, 整数型, , 句柄必须拥有对被注入进程的完全操作权限。注入后如果没有其他用处可以关闭该句柄。 .参数 DLL数据, 字节集 .程序集 取机器码类, , 公开, 获取硬件信息,硬盘等等 .子程序 取3段机器码, 文本型, 公开, 获取3段32位机器码,如1111111111-2222222222-3333333333 .参数 bios, 逻辑型, 可空, 填 假 表示此段全为0,可空,默认为真 .参数 HardDisk, 逻辑型, 可空, 填 假 表示此段全为0,可空,默认为真 .参数 MAC, 逻辑型, 可空, 填 假 表示此段全为0,可空,默认为真 .子程序 取4段机器码, 文本型, 公开, 获取4段23位机器码,如11111-22222-33333-44444 .参数 bios, 逻辑型, 可空, 填 假 表示此段全为0,可空,默认为真 .参数 HardDisk, 逻辑型, 可空, 填 假 表示此段全为0,可空,默认为真 .参数 Video, 逻辑型, 可空, 填 假 表示此段全为0,可空,默认为真 .参数 MAC, 逻辑型, 可空, 填 假 表示此段全为0,可空,默认为真 .DLL命令 _窗口是否可见, 整数型, "user32", "IsWindowVisible", 公开, 判断窗口是否可见 如窗口可见则返回TRUE(非零) .参数 窗口句柄, 整数型, , 要测试的那个窗口的句柄 .DLL命令 AdjustTokenPrivileges, 逻辑型, "advapi32.dll", "AdjustTokenPrivileges", 公开 .参数 TokenHandle, 整数型 .参数 DisableAllPrivileges, 整数型 .参数 NewState, , 传址 .参数 BufferLength, 整数型 .参数 PreviousState, , 传址 .参数 ReturnLength, 整数型, 传址 .DLL命令 API_IsDebuggerPresent, 整数型, "kernel32.dll", "IsDebuggerPresent", 公开 .DLL命令 CallNextHookEx, 整数型, "user32.dll", "CallNextHookEx", 公开 .参数 hhk, 整数型, , 钩子句柄 .参数 nCode, 整数型, , 钩子类型 .参数 wParam, 整数型 .参数 LPARAM, 整数型 .DLL命令 CloseHandle, 整数型, "kernel32.dll", "CloseHandle", 公开, 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。涉及文件处理时,这个函数通常与vb的close命令相似。应尽可能的使用close,因为它支持vb的差错控制。注意这个函数使用的文件句柄与vb的文件编号是完全不同的 非零表示成功,零表示失败。会设置GetLastError .参数 对象句柄, 整数型, , 欲关闭的一个对象的句柄; .DLL命令 CreateFileA, 整数型, "kernel32.dll", "CreateFileA", 公开, , 成功返回文件句柄,失败返回0 .参数 打开文件名, 文本型, , lpFileName,要打开的文件的名字 .参数 访问权限, 整数型, , dwDesiredAccess,访问权限 .参数 共享方式, 整数型, , dwShareMode,共享方式 .参数 安全特性, SECURITY_ATTRIBUTES, 传址, lpSecurityAttributes,安全特性信息 .参数 创建方式, 整数型, , dwCreationDisposition,创建方式 .参数 文件属性, 整数型, , dwFlagsAndAttributes,参见相关帮助 .参数 从文件复制文件属性, 整数型, , hTemplateFile,参见相关帮助 .DLL命令 CreateProcess, 整数型, "kernel32.dll", "CreateProcessA", 公开, CreateProcess(编辑框1.内容, “”, 0, 0, 0, 4, 0, 取运行目录(), si, pi) .参数 lpApplicationName, 文本型 .参数 lpCommandLine, 文本型 .参数 lpProcessAttributes, 整数型 .参数 lpThreadAttributes, 整数型 .参数 bInheritHandles, 整数型 .参数 dwCreationFlags, 整数型, , 0正常,4挂起,3调试,6调试挂起 .参数 lpEnvironment, 整数型 .参数 lpCurrentDriectory, 文本型 .参数 lpStartupInfo, STARTUPINFO, 传址 .参数 lpProcessInformation, PROCESS_INFORMATION, 传址 .DLL命令 CreateRemoteThread, 整数型, "kernel32", "CreateRemoteThread", 公开, 在另一进程中建立线索 .参数 hProcess, 整数型 .参数 lpThreadAttributes, 整数型 .参数 dwStackSize, 整数型 .参数 lpStartAddress, 整数型 .参数 lpParameter, 整数型 .参数 dwCreationFlags, 整数型 .参数 lpThreadId, 整数型, 传址 .DLL命令 CreateToolhelp32Snapshot, 整数型, "kernel32.dll", "CreateToolhelp32Snapshot", 公开, 返回快照后的句柄 .参数 快照标志, 整数型, , 进程=15,线程=4,DLL=8,堆= .参数 进程标识符, 整数型, , lProcessID 欲照快照的进程标识符 .DLL命令 DuplicateHandle, 整数型, "kernel32", "DuplicateHandle", 公开, 复制对象句柄 .参数 hSourceProcessHandle, 整数型 .参数 hSourceHandle, 整数型 .参数 hTargetProcessHandle, 整数型 .参数 lpTargetHandle, 整数型, 传址 .参数 dwDesiredAccess, 整数型 .参数 bInheritHandle, 整数型 .参数 dwOptions, 整数型 .DLL命令 ExitProcess, 整数型, "kernel32.dll", "ExitProcess", 公开, , .参数 进程句柄, 整数型, , 填0即可 .DLL命令 FindWindow, 整数型, "user32.dll", "FindWindowA", 公开, FindWindow,寻找窗口列表中第一个符合指定条件的顶级窗口 .参数 窗口类名, 文本型, , lpClassName,参见相关帮助,字符 (0) .参数 窗口文本, 文本型, , lpWindowName,参见相关帮助 .DLL命令 GetClassName, 整数型, "user32.dll", "GetClassNameA", 公开, 为指定的窗口取得类名 以字节数表示的类名长度;排除最后的空中止字符。零表示出错。会设置GetLastError .参数 句柄, 整数型, , 欲获得类名的那个窗口的句柄 .参数 文本, 文本型, , 随同类名载入的缓冲区。预先至少必须分配nMaxCount+1个字符 .参数 文本长度, 整数型, , 由lpClassName提供的缓冲区长度; .DLL命令 GetCurrentProcess, 整数型, "kernel32.dll", "GetCurrentProcess", 公开 .DLL命令 GetCurrentProcessId, 整数型, "kernel32.dll", "GetCurrentProcessId", 公开 .DLL命令 GetExitCodeThread, 整数型, , "GetExitCodeThread", 公开, 取线程返回值 .参数 hThread, 整数型 .参数 lpExitCode, 整数型, 传址 .DLL命令 GetModuleHandleA, 整数型, "kernel32.dll", "GetModuleHandleA", 公开, , 获取一个应用程序或动态链接库的模块句柄 如执行成功成功,则返回模块句柄。零表示失败。会设置GetLastError .参数 lpModuleName, 文本型, , lpModuleName,指定模块名,这通常是与模块的文件名相同的一个名字。例如,NOTEPAD.EXE程序的模块文件名就叫作NOTEPAD .DLL命令 GetProcAddress, 整数型, "kernel32.dll", "GetProcAddress", 公开, , .参数 hModule, 整数型, , hModule .参数 lpProcName, 文本型, , lpProcName .DLL命令 GetThreadContext, 逻辑型, "kernel32", "GetThreadContext", 公开 .参数 hThreadId, 整数型 .参数 线程环境, context_ .DLL命令 GetThreadContext1, 逻辑型, "kernel32", "GetThreadContext", 公开 .参数 线程句柄, 整数型 .参数 寄存器, 寄存器 .DLL命令 GetWindow, 整数型, "user32", "GetWindow", 公开, 获得一个窗口的句柄,该窗口与某源窗口有特定的关系 由wCmd决定的一个窗口的句柄。如没有找到相符窗口,或者遇到错误,则返回零值。会设置GetLastError .参数 源窗口, 整数型, , 源窗口 .参数 关系, 整数型, , 指定结果窗口与源窗口的关系,它们建立在下述常数基础上:;GW_CHILD:寻找源窗口的第一个子窗口;GW_HWNDFIRST:为一个源子窗口寻找第一个兄弟(同级)窗口,或寻找第一个顶级窗口;GW_HWNDLAST:为一个源子窗口寻找最后一个兄弟(同级)窗口,或寻找最后一个顶级窗口;GW_HWNDNEXT:为源窗口寻找下一个兄弟窗口;GW_HWNDPREV:为源窗口寻找前一个兄弟窗口;GW_OWNER:寻找窗口的所有者; .DLL命令 GetWindowText, 整数型, "user32.dll", "GetWindowTextA", 公开, 取得一个窗体的标题(caption)文字,或者一个控件的内容(在vb里使用:使用vb窗体或控件的caption或text属性) 复制到lpString的字串长度;不包括空中止字符。会设置GetLastError .参数 句柄, 整数型, , 欲获取文字的那个窗口的句柄 .参数 文本, 文本型, , 预定义的一个缓冲区,至少有cch+1个字符大小;随同窗口文字载入 .参数 文本长度, 整数型, , lp缓冲区的长度; .DLL命令 GetWindowTextLength, 整数型, "user32", "GetWindowTextLengthA", 公开, 调查窗口标题文字或控件内容的长短(在vb里使用:直接使用vb窗体或控件的caption或text属性) 字串长度,不包括空中止字符 .参数 hwnd, 整数型, , 想调查文字长度的窗口的句柄; .DLL命令 GetWindowThreadProcessId, 整数型, "user32.dll", "GetWindowThreadProcessId", 公开, GetWindowThreadProcessId,获取与指定窗口关联在一起的一个线程和进程标识符 .参数 窗口句柄, 整数型, , hwnd,指定窗口句柄 .参数 进程标识符, 整数型, 传址, lpdwProcessId,指定一个变量,用于装载拥有那个窗口的一个进程的标识符 .DLL命令 KillTimer, 整数型, "user32.dll", "KillTimer", 公开 .参数 窗口句柄, 整数型, , hwnd .参数 事件标识符, 整数型, , nIDEvent .DLL命令 LoadLibraryA, 整数型, "kernel32.dll", "LoadLibraryA", 公开, , 载入指定的动态链接库,并将它映射到当前进程使用的地址空间 .参数 动态链接库名称, 文本型, , lpLibFileName,指定要载入的动态链接库的名称 .DLL命令 LookupPrivilegeValueA, 逻辑型, "advapi32.dll", "LookupPrivilegeValueA", 公开 .参数 lpSystemName, 文本型 .参数 lpName, 文本型 .参数 lpLuid, LuID, 传址 .DLL命令 Module32First, 整数型, "kernel32.dll", "Module32First", 公开 .参数 hSnapshot, 整数型, , hSnapshot .参数 模块进程结构, MODULEENTRY32, 传址 .DLL命令 Module32Next, 整数型, "kernel32.dll", "Module32Next", 公开 .参数 hSnapshot, 整数型, , hSnapshot .参数 模块进程结构, MODULEENTRY32, 传址 .DLL命令 OpenProcess, 整数型, "kernel32.dll", "OpenProcess", 公开, kernel32.dll .参数 访问级别, 整数型, , 2035711完全访问 .参数 子进程继承, 逻辑型, , 0为子进程继承 .参数 进程ID, 整数型, , 要打开的进程标识 .DLL命令 OpenProcessToken, 整数型, "advapi32.dll", "OpenProcessToken", 公开 .参数 ProcessHandle, 整数型 .参数 DesiredAccess, 整数型 .参数 TokenHandle, 整数型, 传址 .DLL命令 OpenThread, 整数型, "kernel32.dll", "OpenThread", 公开 .参数 dwDesiredAccess, 整数型 .参数 bInheritHandle, 逻辑型 .参数 dwThreadId, 整数型 .DLL命令 Process32First, 整数型, "kernel32.dll", "Process32First", 公开, 取进程快照第一个进程信息返回内存指针 .参数 快照句柄, 整数型 .参数 进程信息, 进程信息 .DLL命令 Process32Next, 整数型, "kernel32.dll", "Process32Next", 公开 .参数 快照句柄, 整数型 .参数 进程信息, 进程信息 .DLL命令 ReadProcessMemory, 整数型, "kernel32.dll", "ReadProcessMemory", 公开, 在进程中读内存数据 地址1048576 .参数 进程句柄, 整数型, , 欲读取的进程句柄(可用OpenProcess函数得到) .参数 地址, 整数型, , 读取的起始地址 .参数 返回内容, 字节集, 传址, 返回的数据,其类型可设为整数、文本和字节集 .参数 长度, 整数型, , 一次读取的字节长度(读取的字节数4) .参数 实际长度, 整数型, 传址, 实际读取的字节长度 .DLL命令 RegOpenKeyExA, 整数型, , "RegOpenKeyExA", 公开, 打开注册表项 .参数 hKey, 整数型 .参数 lpSubKey, 文本型 .参数 ulOptions, 整数型 .参数 samDesired, 整数型 .参数 phkResult, 整数型, 传址 .DLL命令 ResumeThread, 整数型, "kernel32.dll", "ResumeThread", 公开, 开始暂停的线程 .参数 线程句柄, 整数型 .DLL命令 RtlMoveMemory, 整数型, , "RtlMoveMemory", 公开 .参数 lpvDest, 整数型, 传址 .参数 lpvSource, 整数型 .参数 cbCopy, 整数型 .DLL命令 SetThreadContext, 逻辑型, "kernel32", "SetThreadContext", 公开 .参数 hThreadId, 整数型 .参数 线程环境, context_ .DLL命令 SetThreadContext1, 逻辑型, "kernel32", "SetThreadContext", 公开 .参数 线程句柄, 整数型 .参数 寄存器, 寄存器 .DLL命令 SetTimer, 整数型, "user32.dll", "SetTimer", 公开 .参数 窗口句柄, 整数型, , hwnd .参数 事件标识符, 整数型, , nIDEvent .参数 时钟周期, 整数型, , uElapse .参数 回调函数地址, 整数型, , lpTimerFunc .DLL命令 SetWindowsHookEx, 整数型, "user32.dll", "SetWindowsHookExA", 公开 .参数 钩子类型, 整数型 .参数 处理函数入口, 整数型 .参数 函数所在模块, 整数型 .参数 目标线程ID, 整数型 .DLL命令 SHFileOperation, 整数型, "Shell32.dll", "SHFileOperationA", 公开 .参数 文件参数, SHFILEOPSTRUCT .DLL命令 SuspendThread, 整数型, , "SuspendThread", 公开 .参数 线程句柄, 整数型 .DLL命令 TerminateProcess, 整数型, "kernel32.dll", "TerminateProcess", 公开, 成功返回非零 .参数 进程句柄, 整数型 .参数 退出代码, 整数型, , 传入0 .DLL命令 TerminateThread, 逻辑型, "kernel32", "TerminateThread", 公开 .参数 hThread, 整数型 .参数 dwExitCode, 整数型 .DLL命令 Thread32First, 逻辑型, "kernel32.dll", "Thread32First", 公开 .参数 hSnapshot, 整数型 .参数 lpte, THREADENTRY32, 传址 .DLL命令 Thread32Next, 逻辑型, "kernel32.dll", "Thread32Next", 公开 .参数 hSnapshot, 整数型 .参数 lpte, THREADENTRY32, 传址 .DLL命令 VirtualAllocEx, 整数型, "kernel32.dll", "VirtualAllocEx", 公开, 成功返回分配内存的首地址,失败返回0 .参数 hProcess, 整数型, , 申请内存所在的进程句柄 .参数 lpAddress, 整数型, , 填0 .参数 dwSize, 整数型, , 欲分配的内存大小 .参数 flAllocationType, 整数型, , 填4096,MEM_COMMI .参数 flProtect, 整数型, , 填64,可读可写,可执行 .DLL命令 VirtualFreeEx, 整数型, "kernel32.dll", "VirtualFreeEx", 公开 .参数 hProcess, 整数型 .参数 lpAddress, 整数型 .参数 dwSize, 整数型, , 填0 .参数 dwFreeType, 整数型, , 填32768 .DLL命令 VirtualProtect, 整数型, "kernel32.dll", "VirtualProtect", 公开, 成功返回非0,失败返回0 .参数 起始地址, 整数型, , lpAddress .参数 长度, 整数型, , dwSize .参数 新保护权限, 整数型, , 可读写权限(PAGE_READWRITE)=4;PAGE_EXECUTE_READWRITE=64 .参数 旧保护权限, 整数型, 传址, 保存旧属性的结构变量地址 .DLL命令 VirtualProtectEx, 整数型, "kernel32.dll", "VirtualProtectEx", 公开, 成功返回非0,失败返回0 .参数 hprocess, 整数型, , 要修改内存的进程句柄 .参数 起始地址, 整数型, , lpAddress .参数 长度, 整数型, , dwSize .参数 新保护权限, 整数型, , 可读写权限(PAGE_READWRITE)=4 .参数 旧保护权限, 整数型, 传址, 保存旧属性的结构变量地址 .DLL命令 VirtualQueryEx, 整数型, "kernel32.dll", "VirtualQueryEx", 公开 .参数 hProcess, 整数型 .参数 lpAddress, 整数型 .参数 info, MEMORY_BASIC_INFORMATION, 传址 .参数 dwLength, 整数型 .DLL命令 VMProtectBegin, , "VMProtectSDK32.lib", "_VMProtectBegin@4", 公开, 功能:设置开始标记 .参数 MarkerName, 文本型, 传址, 标记名 .DLL命令 VMProtectBeginMutation, , "VMProtectSDK32.lib", "_VMProtectBeginMutation@4", 公开, 功能:设置[变异]标记 .参数 MarkerName, 文本型, 传址, 标记名 .DLL命令 VMProtectBeginUltra, , "VMProtectSDK32.lib", "_VMProtectBeginUltra@4", 公开, 功能:设置[虚拟+变异]标记 .参数 MarkerName, 文本型, 传址 .DLL命令 VMProtectBeginUltraLockByKey, , "VMProtectSDK32.lib", "_VMProtectBeginUltraLockByKey@4", 公开 .参数 MarkerName, 文本型, 传址, 标记名 .DLL命令 VMProtectBeginVirtualization, , "VMProtectSDK32.lib", "_VMProtectBeginVirtualization@4", 公开, 功能:设置[虚拟]标记 .参数 MarkerName, 文本型, 传址, 标记名 .DLL命令 VMProtectBeginVirtualizationLockByKey, , "VMProtectSDK32.lib", "_VMProtectBeginVirtualizationLockByKey@4", 公开 .参数 MarkerName, 文本型, 传址 .DLL命令 VMProtectDecryptStringA, 整数型, "VMProtectSDK32.lib", "_VMProtectDecryptStringA@4", 公开, 功能:加密Ansi字符串常量,返回加密后的字符串指针 .参数 char, 文本型, 传址, 提供Ansi字符串常量 .DLL命令 VMProtectDecryptStringW, 整数型, "VMProtectSDK32.lib", "_VMProtectDecryptStringW@4", 公开, 功能:加Unicode字符串,返回加密后的字符串指针 .参数 wchar_t, 文本型, 传址, 提供Unicode字符串常量 .DLL命令 VMProtectEnd, , "VMProtectSDK32.lib", "_VMProtectEnd@0", 公开, 功能:设置与虚拟/变异等功能配对的结束标记 .DLL命令 VMProtectIsDebuggerPresent, 逻辑型, "VMProtectSDK32.lib", "_VMProtectIsDebuggerPresent@4", 公开, 功能:检测调试器是否存在 .参数 CheckKernelMode, 逻辑型, , 是否检测KernelMode调试器.为假,则检测user-mode调试器,例如OllyDBG, WinDBG等..为真,则同时检测user-mode和KernelMode(包括SoftICE, Syser等...)调试器, .DLL命令 VMProtectIsValidImageCRC, 逻辑型, "VMProtectSDK32.lib", "_VMProtectIsValidImageCRC@0", 公开, 功能:检测程序内存没有没有被改变 .DLL命令 VMProtectIsVirtualMachinePresent, 逻辑型, "VMProtectSDK32.lib", "_VMProtectIsVirtualMachinePresent@0", 公开, 功能:检测程序是否运行在虚拟机,比如VMware, Virtual PC, VirtualBox, Sandboxie等... .DLL命令 WaitForSingleObject, 整数型, "kernel32.dll", "WaitForSingleObject", 公开 .参数 hHandle, 整数型 .参数 dwMilliseconds, 整数型, , 填-1 .DLL命令 WriteProcessMemory, 逻辑型, "kernel32.dll", "WriteProcessMemory", 公开 .参数 进程句柄, 整数型 .参数 开始写入进址, 整数型, , 内存地址 .参数 写入数值数据, 字节集, 传址, 数据指针 .参数 写入长度, 整数型, , 长度 .参数 实际写入长度, 整数型, , 实际写出长度0 .DLL命令 取文本指针, 整数型, "kernel32", "lstrcpyn", 公开, 感谢海洋老师的例程 .参数 变量, , 传址, 一定要传址 .参数 变量, , 传址, 一定要传址.重复一次,骗骗Windows:) .参数 保留, 整数型, , 0 .图片 SE_PROTECT_END, 公开, 置入代码 (#SE_PROTECT_END)'结束标记 .图片 SE_PROTECT_START, 公开, 置入代码 (#SE_PROTECT_START)'默认保护 .图片 SE_PROTECT_START_MUTATION, 公开, 置入代码 (#SE_PROTECT_START_MUTATION)'乱序变形 .图片 SE_PROTECT_START_ULTRA, 公开, 置入代码 (#SE_PROTECT_START_ULTRA)'乱序+虚拟 .图片 SE_PROTECT_START_VIRTUALIZATION, 公开, 置入代码 (#SE_PROTECT_START_VIRTUALIZATION)'虚拟 .图片 SE_UNPROTECT_END, 公开, 置入代码 (#SE_UNPROTECT_END)'屏蔽特定代码的乱序和混淆 .图片 SE_UNPROTECT_START, 公开, 置入代码 (#SE_UNPROTECT_START)'屏蔽特定代码的乱序和混淆 .图片 VMProtect_Begin, 公开, 置入代码 (#VMProtect_Begin) 'VMP保护开始标志 .图片 VMProtect_End, 公开, 置入代码 (#VMProtect_End) 'VMP保护结束标志
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值