ichunqiu圣诞欢乐赛babyre

ichunqiu圣诞欢乐赛babyre

程序关键函数在此

此处是一些有关于多线程的函数,正好借此机会学习一下,顺便学习了一下多线程调试文章如下

https://bbs.pediy.com/thread-254194.htm

多线程

CreateThread函数为创建线程,创建线程成功即运行这个线程。

其中第三个参数为指向线程函数的指针

第四个参数为向线程函数传递的参数

WaitForSingleObject函数为挂起运行的该线程,使等待对象的对象变为有信号状态。

知道了这些就可以静态分析程序了

程序流程

程序首先创建了第一个线程,该线程进行了反调试,如果处于调试状态则会触发非法地址异常。

之后又创建了一个线程,并且将这个线程单独运行了0xffffff秒,该线程为打印和输入,但是如果调试该线程因为printf打印的地址为无效地址会触发异常导致程序无法正常运行。。该部分静态看即可。静态也可以分析出,输入的值被存放在了lparameter变量上

随后又创建并单独运行了一个线程,该线程的函数参数为之前输入的值,该线程即为加密线程了。进入该线程,但是该线程有一处retn会返回到非法内存地址,把retn给nop掉即可,加密流程全程不复杂,首先判断flag格式是否为flag:{}之后对输入进行了加密和比较

关键加密函数如下

写出解密代码即可

#include<stdio.h>
#include<windows.h>
int main()
{
	 BYTE arr[16] = { 0x17,0x83,0xe7,0x45,0x85,0x66,0xe6,0xf5,0x97,0x56,0x23,7,5,0xe2,2,2 };
	for (int i = 0; i < 0x10; i++)
	{
		arr[i] ^= 0x10;
	}
	for (int i = 0; i < 0x10; i=i+2)
	{
		printf("%c",((arr[i] & 0XF) << 4) + ((arr[i + 1] & 0xf0) >> 4));
		printf("%c",((arr[i + 1] & 0xf) << 4) + ((arr[i] & 0xf0) >> 4));
	}
	system("pause");
}
发布了49 篇原创文章 · 获赞 14 · 访问量 6901

猜你喜欢

转载自blog.csdn.net/qq_39268483/article/details/103858023