(简称逆向工程第二十七章学习)
代码注入
代码注入是一种向目标进程插入独立运行代码并使之运行的技术,一般调用CreateRemoteThread() API远程线程形式运行插入代码(万能的CreateRemoteThread
所以也被称为线程注入
注意,代码注入以线程过程形式注入,而代码中的数据则以线程参数传入,也就是说代码和数据分别注入。
使用代码注入的原因
- 占用内存少
- 难以查找痕迹(比如恶意代码中就喜欢使用
- DLL注入技术主要用于代码量大且复杂的时候,而代码注入则适合用于代码量小且简单
实验环节
填上进程号,注进去咯
审计代码
开审!
main
把PID作为参数传入InjectionCode函数
1 | int main(int argc, char *argv[]) |
ThreadProc
- 可以先不传递LoadLibrary和GetProcAddress的地址,直接传递MessageBoxA地址也可以
但原则上是要的这两个API,这种方式好处在于可以把相关库准确加载到指定进制
- ThreadPrco函数是可以独立运行的代码(不是直接引用的硬编码地址)
- 同时要注意Release/Debug代码所产生的优化是不同的(早已深熟于心
1 | // 这个结构体以线程参数的形式传递使用 |
InjectionCode
- 先向目标进程写入所需的参数param
- 再写入要执行的代码ThreadProc(注意这个大小是两个函数地址相见)
- 再使用CreateRemoteThread远程执行ThreadProc 参数是param
1 | BOOL InjectCode(DWORD dwPID) |
Debug InjectionCode
先拖入notepad,然后运行起来,再开启这个如果有新线程就停在线程函数开始的代码位置
再代码注入我们的notepad
一注入就会成功停在线程代码开始处(有时候只是调试器到这,EIP没到这,只要F9几次让EIP到这即可
P.Z!
今天录了*CTF的前两题,难得录的快了一次,要加油把后面的题也录了,今天这里的代码审起来舒服多了,也可能是今天的API都是见过的,比一开始一个API查一次做一下笔记的快多了,好耶!–4.19 PM 11:28
🍬
🍪
About this Post
This post is written by P.Z, licensed under CC BY-NC 4.0.