i春秋2023冬季赛 RE file_encryptor WP

32位无壳

代码逆向分析领域中,TLS(Thread Local Storage,线程局部存储)回调函数(Callback Function)常用反调试。TLS回调函数的调用运行要先于EP代码的执行,该特征使它可以作为一种反调试技术的使用。

动调不起来,main函数直接爆红

i春秋2023冬季赛 RE file_encryptor WP_第1张图片

肯定有反调试、异常处理

main里面没找到,尝试TLS里面找

i春秋2023冬季赛 RE file_encryptor WP_第2张图片

这里看到了IsDebuggerPresentexcept异常处理里

改一下控制流,不要去exit

i春秋2023冬季赛 RE file_encryptor WP_第3张图片

i春秋2023冬季赛 RE file_encryptor WP_第4张图片

回到main函数还有一堆异常处理

i春秋2023冬季赛 RE file_encryptor WP_第5张图片

全部滚吧,NOP所有except

i春秋2023冬季赛 RE file_encryptor WP_第6张图片

爆红的花指令修一下

红的那一行按U

i春秋2023冬季赛 RE file_encryptor WP_第7张图片

这里C一下

E8多余的数据NOP掉

i春秋2023冬季赛 RE file_encryptor WP_第8张图片

i春秋2023冬季赛 RE file_encryptor WP_第9张图片

i春秋2023冬季赛 RE file_encryptor WP_第10张图片

这有个花指令,也修一下,和上面的原理一样

i春秋2023冬季赛 RE file_encryptor WP_第11张图片

P一下

i春秋2023冬季赛 RE file_encryptor WP_第12张图片

tab

i春秋2023冬季赛 RE file_encryptor WP_第13张图片

都修复完了记得apply patch to保存到exe文件里,不然动调的时候还是会有反调试

完整的main函数

i春秋2023冬季赛 RE file_encryptor WP_第14张图片

加载的资源数据最终储存在27行dword_C8541C里,dll资源在sub_C81CE0里加载,我们要把它取出来查看输出函数相关参数

sub_C81CE0在结尾下个断点,我们需要IpMem里的资源

i春秋2023冬季赛 RE file_encryptor WP_第15张图片

动调点进去

i春秋2023冬季赛 RE file_encryptor WP_第16张图片

按D直到出现这个地址

i春秋2023冬季赛 RE file_encryptor WP_第17张图片

跟过去

i春秋2023冬季赛 RE file_encryptor WP_第18张图片

这里Shift+*直接OK

i春秋2023冬季赛 RE file_encryptor WP_第19张图片

Shift+E提取数据

i春秋2023冬季赛 RE file_encryptor WP_第20张图片

选择raw bytes格式,导出后缀无所谓

放进CFF查看

i春秋2023冬季赛 RE file_encryptor WP_第21张图片

这里看到了调用了CryptEncrypt函数

CryptEncrypt 是 Windows 加密服务提供程序 (Cryptographic Service Provider, CSP) 中的一个函数,用于加密数据。它是基于 Windows 的加密API (Cryptography API: Next Generation, also known as CNG) 的一个组成部分。

在使用 CryptEncrypt 函数之前,通常需要先初始化一个 CryptoAPI_BLOB 结构体,然后使用 CryptCreateHashHandle 或其他相关函数来创建一个哈希句柄。之后,可以使用这个句柄和密钥来调用 CryptEncrypt 函数。

总之是Windows自带的加密函数

在main函数34行 加密部分往里面找,最后看到一个参数是0xB的,对应加密函数

i春秋2023冬季赛 RE file_encryptor WP_第22张图片

改成解密函数 对应0x5

i春秋2023冬季赛 RE file_encryptor WP_第23张图片

断在v6启动的位置

i春秋2023冬季赛 RE file_encryptor WP_第24张图片

发现动调到这里又自动退出了

i春秋2023冬季赛 RE file_encryptor WP_第25张图片

看一下汇编

i春秋2023冬季赛 RE file_encryptor WP_第26张图片

JNZ指令的含义是“Jump if Not Zero”,即当结果不为0时转移。如果执行操作的寄存器或操作数的结果不为0,则控制权转移到指定的标签位置。

JZ指令的含义是“Jump if Zero”,即当结果为0时转移。如果执行操作的寄存器或操作数的结果为0,则控制权转移到指定的标签位置。

所以这里把jz改成jnz就不会跳转到exit去了

(也可以动调的时候该标志位)

继续动调,跑到这里又跳出去了

i春秋2023冬季赛 RE file_encryptor WP_第27张图片

注意一下第10行有关于文件路径的函数SHGetKnownFolderPath和参数ppszPath

第四行定义的ppszPath是一个指向宽字符串的指针,用于存储已知文件夹的路径。直接点开看不见,我们动调。

i春秋2023冬季赛 RE file_encryptor WP_第28张图片

点进去看一下

i春秋2023冬季赛 RE file_encryptor WP_第29张图片

一直D到字符串出来

i春秋2023冬季赛 RE file_encryptor WP_第30张图片

可以看到要求的路径是在你的桌面

回到原来的函数

i春秋2023冬季赛 RE file_encryptor WP_第31张图片

看第12行 if ( PathCombineW(pszDest, ppszPath, L"document") ):使用PathCombineW函数将已知文件夹的路径和"document"字符串合并,存储在pszDest中。

那路径就是 C:\\Users\37785\\Desktop\\document(Desktop前的部分因人而异)

第13行if ( PathCombineW(FileName, pszDest, L"*.*") ):使用PathCombineW函数将pszDest"."字符串合并,存储在FileName中。这将生成一个用于搜索所有文件的通配符模式。

也不知道是怎么搜的,反正把1.txt扔进去应该没问题

动调F8到这里

i春秋2023冬季赛 RE file_encryptor WP_第32张图片

看一下1.txt

i春秋2023冬季赛 RE file_encryptor WP_第33张图片

OHHHHHHHHHHHHHHHH!!!!!!!!!!!!!!!!

你可能感兴趣的:(c语言,汇编)