| 
注册时间2005-6-29
阅读权限255
最后登录1970-1-1UID2198 副坛主   
 
 该用户从未签到 | 
 
|   
 群里又在群.P.软件,于是下载一起搞下,加了 Themida 的壳,不过里边的关键代码没有 V 掉,所以还是可以很轻松的定位到关键点 :
 
 
 复制代码
014A1FF0    55              PUSH    EBP
014A1FF1    8BEC            MOV     EBP, ESP
014A1FF3    A1 F032F401     MOV     EAX, DWORD PTR DS:[1F432F0]
014A1FF8    83EC 10         SUB     ESP, 10
014A1FFB    85C0            TEST    EAX, EAX
014A1FFD    74 1C           JE      SHORT ManyCam.014A201B
014A1FFF    8B40 08         MOV     EAX, DWORD PTR DS:[EAX+8]
014A2002    83F8 02         CMP     EAX, 2                           ; Pro 版本
014A2005    74 0B           JE      SHORT ManyCam.014A2012
014A2007    83F8 03         CMP     EAX, 3                           ; Studio 版本
014A200A    74 06           JE      SHORT ManyCam.014A2012
014A200C    33C0            XOR     EAX, EAX                         ; 未注册
014A200E    8BE5            MOV     ESP, EBP
014A2010    5D              POP     EBP                              ; ntdll.77AB019D
014A2011    C3              RETN
014A2012    B8 01000000     MOV     EAX, 1                           ; 注册版
014A2017    8BE5            MOV     ESP, EBP
014A2019    5D              POP     EBP                              ; ntdll.77AB019D
014A201A    C3              RETN
 看到这个代码,可想而已,整个关键点应该就是这个类对象的枚举成员,是什么类型。但是有 themida 的内存效检,所以如果修改内存代码的话,还需要搞定 themida 的内存效检,这样相对比较麻烦。
 
 a_p 给了以下一些方案,这里简单整理下:
 
 1.  对任意代码下内存读硬件断点,跟到后逐层返回 VM_HANDLE 然后来过效检。
 2. SMC 直接去搞掉效检。
 3. 找到 themida 数据解密前的数据,并修正为需要Path后的数据。
 
 以上三种体力活,不好搞,于是又有以下一些方案:
 
 1. Dll 进去找到初始化赋值 ,然后修改赋值。
 2. 定位到这个全局对象,然后直接赋值为3。
 这两个方案都是直接修改内存值来达到过效检的。先说方案一的实现,a_p 哥的实现方案如下:
 
 
 复制代码
67001160 Qt5Core.??0QString@@QAE@ABV0@@Z  // 初始化后会调用这个函数 于是在这个QT DLL的函数尾部Path汇编代码
Path 在函数尾段 ...
67232B0A      60                       PUSHAD
67232B0B      9C                       PUSHFD
67232B0C      E8 0D000000              CALL 67232B1E
// ManyCam.exe
67232B11      4D                       DEC EBP
67232B12      61                       POPAD
67232B13      6E                       OUTSB                                             ;  I/O command
67232B14      79 43                    JNS SHORT 67232B59
67232B16      61                       POPAD
67232B17      6D                       INSD                                              ;  I/O command
67232B18      2E:                      PREFIX CS:                                        ;  Superfluous prefix
67232B19      65:78 65                 JS SHORT 67232B81                                 ;  Superfluous prefix
67232B1C      0000                     ADD BYTE PTR DS:[EAX],AL
67232B1E      8B0424                   MOV EAX,DWORD PTR SS:[ESP]                        ;  ManyCam.0109439C
67232B21      FF90 9B060000            CALL DWORD PTR DS:[EAX+0x69B]                        // GetModuleHandleA
67232B27      83F8 00                  CMP EAX,0x0
67232B2A      74 07                    JE SHORT 67232B33
67232B2C      C680 E85FC900 03         MOV BYTE PTR DS:[EAX+0xC95FE8],0x3
67232B33      9D                       POPFD
67232B34      61                       POPAD
67232B35      C2 0400                  RETN 0x4
方案2 我是直接下硬件断点,中断后,读取该全局变量地址,直接对其成员赋值。
 
 
   
 | 
 |