-
-
[原创]为无源码的DLL增加接口功能 (2)
-
发表于: 2023-1-16 23:21 7527
-
承接前篇[原创]为无源码的DLL增加接口功能的内容,本篇作为补充。因为前者是禁用了优化选项。导致接口中循环的index变量,是保存在调用栈的栈帧中,可以使用栈指针进行内存寻址,从而达到控制index的目的。那么,本篇是开启了编译最大优化,接口函数在编译之后,循环变量index是直接保存在寄存器 esi 中的。这样就造成了之前的方法就不能正常使用了。
本篇应该算是使用了轻量级的hook吧,使用Windows API的VirtualProtect修改了代码段的属性,使其为可读写。所以,这个相对于之前的方法有些暴力。但是,对于这种修改寄存器的需求,我目前没有更好的办法。这也难怪前篇下面的评论中,有位老兄说,都是靠hook走天下了。
执行效果和之前的一致,同样能满足需求。
Hook还是极为重要的,后面还是研究一下流行的Hook库吧。
完整源代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | / / SleepDemo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 / / #include <iostream> #include <thread> #include <Windows.h> #pragma warning(disable:4996) using namespace std; void __declspec(dllexport) CalculateFunc( int count) { int index = 0 ; for ( int i = 0 ; i < count; i + + ) { printf( "i=%d, %d...\n" , i, + + index); Sleep( 1000 ); } printf( "Threader Over...\n" ); } void CalculateFuncAsync() { std::thread thread(CalculateFunc, 100 ); thread.join(); / / 等待线程结束 } int main() { std::thread thread(CalculateFuncAsync); Sleep( 3000 ); #define INSTRUCT_LEN 2 char instructBak[INSTRUCT_LEN]{ 0 }; DWORD hookLength = INSTRUCT_LEN; DWORD hookAddress = (DWORD)CalculateFunc + 0x2F ; SuspendThread(thread.native_handle()); DWORD curProtection; VirtualProtect((void * )hookAddress, hookLength, PAGE_EXECUTE_READWRITE, &curProtection); memcpy(instructBak, (void * )hookAddress, INSTRUCT_LEN); memset((void * )hookAddress, 0x90 , hookLength); / / 相当于 break ResumeThread(thread.native_handle()); thread.join(); printf( "Main Over...\n" ); / / 还原 memcpy((void * )hookAddress, (void * )instructBak, INSTRUCT_LEN); DWORD temp; VirtualProtect((void * )hookAddress, hookLength, curProtection, &temp); return 0 ; } |
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2023-1-16 23:28
被_THINCT编辑
,原因:
赞赏记录
参与人
雪币
留言
时间
Semaphore
为你点赞~
2023-9-6 13:17
pysafe
为你点赞~
2023-5-6 10:41
sfzhi
为你点赞~
2023-1-17 16:13
yu781129965
为你点赞~
2023-1-16 23:27
赞赏
他的文章
- 重新认识线程sleep 998
- [原创]CPU爆高,程序卡顿分析 1733
- [原创]再战堆栈损坏:Critical error detected c0000374 1287
- [原创]在无用的堆栈中分析DLL版本错误 1336
- [原创]小白也能通过特征码定位源码 2801
看原图
赞赏
雪币:
留言: