EASYHOOK逆向寒假生涯(20/100)
文章目錄
- 拖進ida
- 動調`sub_401220`
- 分析`sub_401000`
拖進ida
第一眼猜測一下重要函數sub_401220和sub_401240,看了一下sub_401240后
很明顯,不是,也就用來起浪費時間的作用。
再來看看sub_401220
這里搞的動作挺像那么回事的,動調一下看看
動調sub_401220
簡單分析一下,
這四行代碼就是為了獲取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
總結
以上是生活随笔為你收集整理的EASYHOOK逆向寒假生涯(20/100)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编译器扩展SEH(2)
- 下一篇: ReverseMe-120(base64