- UID
- 2198
注册时间2005-6-29
阅读权限255
最后登录1970-1-1
副坛主
该用户从未签到
|
群里又在群.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 我是直接下硬件断点,中断后,读取该全局变量地址,直接对其成员赋值。
|
|