n1in 发表于 2021-8-19 09:55

crackme杂记

创建一个线程
使用 threadproc函数,可以在指定的函数地址创建一个线程,函数内写内容

```cpp
DWORD WINAPI ThreadProc(_IN_LPVOID lpparameter)
{
        byte byteread=0;
        while(true)
        {
                ReadProcessMemory((HANDLE)-1(进程句柄,-1表示是自己的进程句柄),(LPVOID)004010A9(需要读取的起始地址,od里面查找函数的地址),&byteRead (存放数据的缓存区地址),1(要读取的字节数),NULL(实际读取数存放地址,这里没必要存放,所以直接填NUll));       
                if(byteread==0x55)
                {
                        byte wriyeBytes[]={0x90,0x90,0x90,0x90,0x90,0x90};
                        WriteProcessMemory((HANDLE)-1,(LPVOID)0x004010FD(开始写入的起始地址),writeBytes(写入的东西指向的指针//这里使用指针的话,可以防止别人在逆向调试的时候,直接获取我们写入的数据),6(要写入的字符数),NULL(返回值));
                        break;
                }
        }
        MessageBoxA(NULL,"破解成功","来自lin的提醒",NULL);
        return TRUE;
}
```
这样我们就实现了不修改代码实现破解补丁。

实现取得线程的上下文:

```cpp
#include<iostream>
#include<windows.h>

int main()
{
        CONTEXT ctx;
        GetThreadContext(GetCurrentThread()/*线程句柄,该函数可以获得当前线程的句柄)*/, & ctx/*接收返回值的结构体*/);
        system("pause");
}
```
如下图,就是我们获得的线程上下文
![在这里插入图片描述](https://img-blog.csdnimg.cn/ea08548410ea44da9d3fb3cbc07a3180.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dvYXRfMjAwMw==,size_16,color_FFFFFF,t_70)
cpu如何同时运行多个进程,其实算不上同时进行,只是在不同的进程中快速切换实现的"同时",那么cpu为什么在切换道另一个进程时还能继续运行这个进程呢?如上图所示,cpu可以获取线程的上下文并保存,从而知道自己在该进程中运行到了哪里。从而实现可以在不同的进程中来回切换。




![在这里插入图片描述](https://img-blog.csdnimg.cn/3005ef75f318471da0afe3ed7dff4a89.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dvYXRfMjAwMw==,size_16,color_FFFFFF,t_70)

如果我们再写一个很大的项目时产生了报错,我们可以用上图的方法进行异常处理,先使用AddVectoredExceptionHandler注册一个异常处理。此时如果有异常的话就会跳转到上面的函数VecyoredHandler中打印我们的eip的位置,也就是异常处理的位置。

我们可以知道是int 3的问题,那么我们如何解决这个问题呢?我们可以将int 3改回来,或者直接修改eip的值,修改之后再改回eip。

![在这里插入图片描述](https://img-blog.csdnimg.cn/6c59c65b1e874eb690545828559ac75a.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dvYXRfMjAwMw==,size_16,color_FFFFFF,t_70)

![在这里插入图片描述](https://img-blog.csdnimg.cn/b07403b1606242f4aabb39f6db164b97.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dvYXRfMjAwMw==,size_16,color_FFFFFF,t_70)



这个程序的作用是当我们下断点的话就退出程序,原理是读取我们的进程的字节值做对比,如果不一致就退出程序。

0xK4ws 发表于 2021-8-19 17:20

怎么感觉有点眼熟 你这图是NCK老师初级班视频里截的吧

n1in 发表于 2021-8-19 22:47

0xK4ws 发表于 2021-8-19 17:20
怎么感觉有点眼熟 你这图是NCK老师初级班视频里截的吧

对的,懒得手打了,感觉52逆向区里有一半都学过nck的课哈哈哈

掌櫃 发表于 2021-8-21 10:52

学习一下,谢谢楼主!

hua111 发表于 2021-9-4 12:09

页: [1]
查看完整版本: crackme杂记