日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EASYHOOK逆向寒假生涯(20/100)

發布時間:2025/3/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EASYHOOK逆向寒假生涯(20/100) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 拖進ida
    • 動調`sub_401220`
    • 分析`sub_401000`

拖進ida


第一眼猜測一下重要函數sub_401220和sub_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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。