文章目录

  • 拖进ida
  • 动调`sub_401220`
  • 分析`sub_401000`

拖进ida


第一眼猜测一下重要函数sub_401220sub_401240,看了一下sub_401240

很明显,不是,也就用来起浪费时间的作用。
再来看看sub_401220

这里搞的动作挺像那么回事的,动调一下看看

动调sub_401220


简单分析一下,

 v2 = GetCurrentProcessId();hProcess = OpenProcess(0x1F0FFFu, 0, v2);v0 = LoadLibraryA(LibFileName);*(_DWORD *)WriteFile_0 = GetProcAddress(v0, ProcName);

这四行代码就是为了获取dll文件中WriteFile的实际导入地址。计算机核心编程里会有详细讲解

 lpAddress = *(LPVOID *)WriteFile_0;

把地址值放在另外一个变量里面,后面会有用。

if ( !*(_DWORD *)WriteFile_0 )return sub_401370((int)&unk_40A044);

这是当失败的时候,这种地址的获取一般不会失败的,所以这里不用分析。

unk_40C9B4 = *(_DWORD *)lpAddress;

这里IpAddress的值是0x77361282,即WriteFile的实际地址值。然后把地址里的内容放在unk_40C9B4

 *((_BYTE *)&unk_40C9B4 + 4) = *((_BYTE *)lpAddress + 4);

&unk_40C9B4这里取出unk_40C9B4的地址,然后(_BYTE *)再把指针范围转变为一个字节,紧接着就是用0x77361282地址处的后4个字节的值 覆盖入(WriteFile起始地址+4)地址处,
(说白了也就是把WriteFile前五个字节的值暂存其它地方,下面等HOOK目的成功时,再来进行写回)
即从0x77361286地址处取处四个字节放在0x40C9B8(API的内容)中

之后再放一个E9指令,即Jmp

dword_40C9BD = (char *)sub_401080 - (char *)lpAddress - 5;

这行指令很熟悉吧?
跳转的目的地址- 跳转的起始地址- 指令长度

然后间接跳转就构成了。。紧接着把缓冲区里面的东西写入WriteFile

然后当调用WriteFile时,就来调用sub_401080这个函数喽,所以一切关键都在sub_401080函数身上,接下来我们就来看看:


这里也就是 HOOK成功之后,进行函数原值写回,然后再调用WriteFile

涉及加密的也就是sub_401000,紧接着来看看它

分析sub_401000

int __cdecl sub_401000(int a1, int a2)
{char i; // alchar v3; // blchar v4; // clint v5; // eaxfor ( i = 0; i < a2; ++i ){if ( i == 18 ){*(_BYTE *)(a1 + 18) ^= 0x13u;}else{if ( i % 2 )v3 = *(_BYTE *)(i + a1) - i;elsev3 = *(_BYTE *)(i + a1 + 2);*(_BYTE *)(i + a1) = i ^ v3;}}v4 = 0;if ( a2 <= 0 )return 1;v5 = 0;while ( byte_40A030[v5] == *(_BYTE *)(v5 + a1) ){v5 = ++v4;if ( v4 >= a2 )return 1;}return 0;
}

代码不长,最主要要能看出Hook,如果没有仔细看,那么直接会陷入sub_401240无法自拔。。。

找出byte_40A030[v5]数组:

61 6A 79 67 6B 46 6D 2E  7F 5F 7E 2D 53 56 7B 38
6D 4C 6E 00

逆推上去

for ( i = 0; i < a2; ++i ){if ( i == 18 ){*(_BYTE *)(a1 + 18) ^= 0x13u;}else{if ( i % 2 )v3 = *(_BYTE *)(i + a1) - i;elsev3 = *(_BYTE *)(i + a1 + 2);*(_BYTE *)(i + a1) = i ^ v3;}}

好了,接下来上 代码

#include <iostream>
using namespace std;
int main()
{unsigned char   a[] = {0x61, 0x6A, 0x79, 0x67 ,0x6B ,0x46 ,0x6D ,0x2E  ,0x7F ,0x5F ,0x7E ,0x2D ,0x53 ,0x56 ,0x7B ,0x38
,0x6D ,0x4C ,0x6E };unsigned char b[19];unsigned char c;b[0] = a[0];for (int i = 0; i < 19; ++i) {if (i == 18) {b[i] = a[i] ^ 0x13;}else {c = a[i] ^ i;if (i % 2)b[i] = c + i;else{b[i + 2] = c;}}}for (int i = 0; i < 19; i++) {cout << b[i];}}


b[0]这个位置有点问题,估计加密过程中哪里忘记考虑了,一猜就知道b[0]是f

flag{Ho0k_w1th_Fun}

EASYHOOK逆向寒假生涯(20/100)相关推荐

  1. 逆向寒假生涯(27/100)

    文章目录 安卓题 声明 拖进jeb 脚本 PC逆向 全局浏览 计算 安卓题 声明 这是一道简单有手就行的安卓题 拖进jeb 接下来查看DeEnCode类 简单一个异或而已 Toast.makeText ...

  2. ReverseMe-120(base64解码表) 逆向寒假生涯(21/100)

    文章目录 拖进ida 经过一次base解码(`sub_E61000`) base64解码表 注意 : 总结函数: 异或0x25 题目总结 base64代码(含有解码表) 拖进ida 用字符串" ...

  3. Windows_Reverse2逆向寒假生涯(25/100)

    脱壳 首先查一下,aspack,手脱一下,我这壳是在高地址的,需要改改地址,我是这样改的 拖进ida 第一层: 判断作用,判断输入字符是否在0~ 9和A ~ F之间,外加判断一下长度吧 第二层: 把输 ...

  4. 2ex1逆向寒假生涯(24/100)

    打开附带文本文件: │_r-+_Cl5;vgq_pdme7#7eC0= 推测可能是base64 拖进ida 查到一个64字符串的base顺序表 @,.1fgvw#`/2ehux$~"3dit ...

  5. reverse-for-the-holy-grail-350逆向寒假生涯(23/100)

    拖进ida 大概看了一下,一眼看上去,有嫌疑的就是两个函数 v4 = (unsigned int)validChars((__int64)&v9); 和 v5 = stringMod((__i ...

  6. crackme 逆向寒假生涯(22/100)

    脱壳 这篇博客里有详细讲解: 手撕Nspack3.7(北斗)壳 拖进ida 很简单,就一次异或,分别找出两组数组 代码 #include <iostream>int main() {cha ...

  7. BabyXor flower逆向寒假生涯(19/100)

    BabyXor 拖进ida后查看 判断长度是否等于0x17,不等于直接退出.长度等于0x17后再近一步判断. 首先经过一个MD5加密, 然后在经过一个enc函数变换, 进入enc看看 简单变化,找出数 ...

  8. 人生成功生涯规划100口诀

    人生成功生涯规划100口诀 生涯规划是新时代的潮流,现代人的课题,生涯规划愈早做愈好,胜算也愈大,而且愈到老愈受用,自己不但要早做生涯规划,让自己活出快乐人生,而且要做子女.学生.员工的生涯贵人,为他 ...

  9. failed to connect to /172.20.100.117 (port 18899): isConnected failed: ECONNREFUSED (Connection refu

    failed to connect to /172.20.100.117 (port 18899): isConnected failed: ECONNREFUSED (Connection refu ...

最新文章

  1. 一款jQuery实现重力弹动模拟效果特效,弹弹弹,弹走IE6
  2. Git学习笔记------整理自廖雪峰官网教程
  3. 画风清奇!看看大佬怎么玩Python
  4. [导入]ASP.NET MVC框架开发系列课程(1):MVC模式与ASP.NET MVC框架概述.zip(8.80 MB)
  5. bzoj 2752 9.20考试第三题 高速公路(road)题解
  6. mysql skip-grant-tables my.cnf_skip-grant-tables:修改mysql密码
  7. Linux忘记密码了怎么修改密码(保姆级教程)
  8. 多普达P800 GPS设置终极教程
  9. 自燃、断轴、失控,新能源车还能买吗?
  10. linux 系统级性能分析工具 perf 的介绍与使用
  11. Java多线程系列--【JUC线程池 02】- 线程池原理(一)
  12. Fabled Rooks UVA - 11134 
  13. Unknown integral data type for ids : java.lang.String; nested exception is org.hibernate.id.Identifi
  14. JVM-内存与垃圾回收篇!女朋友看了都想当架构师的超详细保姆级笔记!呕心沥血之作!看完还不会你砍我!
  15. 使用vs2019创建win32动态链接库
  16. opencv摄像头 vmware虚拟机无法打开摄像头的解决方法
  17. vnc连接不上,vnc连接不上是为什么?原因详解
  18. NLP牛客网面经总结
  19. STM32WB55 在BLE_HeartRateFreeRTOS例程基础上修改成带rtos的p2ps透传服务
  20. 蓝桥杯真题:作物杂交

热门文章

  1. java内存模型 原子性_Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)...
  2. CV之CNN:基于tensorflow框架采用CNN(改进的AlexNet,训练/评估/推理)卷积神经网络算法实现猫狗图像分类识别
  3. DayDayUp之Job:牛客网—算法工程师—剑指offer之66道在线编程(解决思路及其代码)——41~66
  4. Interview:算法岗位面试—10.15上午—上海某公司算法岗位(偏图像算法,制造行业)技术面试考点之AI算法与实际场景结合产生商业价值的头脑风暴
  5. Keras之DNN::基于Keras(sigmoid+binary_crossentropy+predict_classes)利用DNN实现二分类——DIY二分类数据集预测新数据点
  6. Python自定义:粒子群优化算法
  7. OS_CORE.C(11)
  8. BootstrapTable-加载数据
  9. 服务器虚拟化管理,几招让你快速成就你的服务器
  10. iOS Storyboard unwind segues使用小结