查壳无壳,放进IDA
看看401240,是一个假的判断的函数。
再看sub_401220();
创建了函数指针,WriteFile_0 = (BOOL (__stdcall *)(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED))GetProcAddress(LibraryA, ProcName);
获取目标函数(真正的writefile)的地址,并将其存储在 WriteFile_0
中。这个函数指针 WriteFile_0
才会是这个程序里用来写文件的函数。然后用40c9b4进行备份,然后把40c9bc写成跳转,后续跳转的地址是401080
再去看4010D0
完成hook的初始化。
所以逻辑已经清楚了。先获取writefile这个函数的位置,把这个函数备份下来。然后40C9BC处是个跳转,跳转到401080.之后把BC跳转写到writefile的位置,这样执行到writefile就进入了401080函数
401000进行真正的判断
401140把40C9B4重新写回来,而这正式我们备份的真正的writefile。然后写入文件
按照真正的判断函数,我们重写就可以了,注意要把循环倒过来写