1 Win32应用程序入口识别 思路:根据WinMain的四个参数,由调用顺序,知道最后压栈的是hInstance句柄(也就是WinMain函数的第一个参数,其值等于ImageBase),根据反汇编,则判断压栈参数是GetModuleHandle函数的返回值,即可找到Win32应用入口. 004011AC |> \50 push eax 004011AD |. FF75 9C push [local.25] 004011B0 |. 56 push esi 004011B1 |. 56 push…
向代码节添加代码实现 作者经过一周不断的失败,再思考以及无数次调试终于实现. 思路:八个步骤 1. 文件拷到文件缓冲区(FileBuffer) //图示见(零基础逆向工程18之PE加载过程) 2. 文件缓冲区扩展到内存映像缓冲区(ImageBuffer) 3. 判断代码空闲区是否有足够空间存储ShellCode代码 4. 将代码复制到空闲区 5. 修正E8 6. 修正E9 7. 修改OEP 8. 内存映像缓冲区到新文件缓冲区(NewBuffer) 9. 新文件缓冲区到文件 向其他节(如数据段)空…
1 资源文件,创建对话框 详细步骤: 1.创建一个空的Win32应用程序 2.在VC6中新增资源 File -> New -> Resource Script 创建成功后会新增2个文件:xxx.rc 和 resource.h 3.打开新创建的xxx.rc文件,在资源窗口新增一个对话框,并在对话框上新增2个按钮. 4.打开resource.h文件,观察变化: #define IDD_DIALOG_MAIN 101 #define IDC_BUTTON_OK 1000 #define IDC_BU…
1 第一个图形界面程序 步骤1:创建Windows应用程序 选择空项目 步骤2:在新建项窗口中选C++代码文件 创建一个新的cpp文件 步骤3:在新的cpp文件中添加:#include <Windows.h> 并添加入口函数: int CALLBACK WinMain( CALLBACK 是一个宏 _In_ HINSTANCE hInstance, #define CALLBACK __stdcall _In_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmd…
重定位表 待补充 IAT表 待补充…
数据目录 1.我们所了解的PE分为头和节,在每个节中,都包含了我们写的一些代码和数据,但还有一些非常重要 的信息是编译器替我们加到PE文件中的,这些信息可能存在在任何可以利用的地方. 2.这些信息之所以重要,是因为这些信息包含了诸如: PE程序的图标在哪里? 用到了哪些系统提供的函数? 为其他的程序提供哪些函数? 3.编译器添加了这么多信息,那程序是如何找到这些信息的呢? 答案就是:数据目录 4.数据目录定位: 可选PE头最后一个成员,就是数据目录.一共有16个: typedef struct…
1 查找窗口 1.1 代码案例 //查找指定窗口 TCHAR szTitle[MAX_PATH] = {0}; HWND hwnd = ::FindWindow(TEXT("#32770"),TEXT("飞鸽传书 IP Messenger")); if(hwnd != NULL) { //修改窗口标题 ::SetWindowText(hwnd,"新的窗口标题"); } else { ::MessageBox(NULL,TEXT("窗口没…
1 进程的创建过程 打开系统 --> 双击要运行的程序 --> EXE开始执行 步骤一: 当系统启动后,创建一个进程:Explorer.exe(也就是桌面进程) 步骤二: 当用户双击某一个EXE时,Explorer 进程使用CreateProcess函数创建被双击的EXE,也就是说,我们在桌面上双 击创建的进程都是Explorer进程的子进程. CreateProcess BOOL CreateProcess( LPCTSTR lpApplicationName, // name of exe…
1 信号量 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用.[百度百科] 1.1 创建信号量 HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName ); 函数说明: 第一个参数表示安全控制,一般直接传入NULL. 第二个参数表…
1 内核对象 前面已经学过线程和互斥体两个内核对象.此节讲了事件这个内核对象.前面提出了内核对象这个概念,可能不太清晰,简单来说内核对象就是系统层的东西. 1.1 小结内核对象: 进程.线程.事件.互斥体.文件.文件映射等. 1.2 事件内核对象的创建 HANDLE g_hEvent = CreateEvent(NULL, TRUE, FALSE, "XYZ"); HANDLE g_hMutex = CreateMutex(NULL,FALSE, "XYZ"); 1…