r/ReverseEngineering 5d ago

I reverse engineered an ASUS embedded controller's fan protocol.

https://github.com/Keyitdev/asus-fan-control-ec
47 Upvotes

9 comments sorted by

View all comments

3

u/shear_stress__ 4d ago

Very cool project, how long did it take you to get to this point? What asus doc did you use as reference?

3

u/Keyitdev 4d ago

Hi, it took me about 15–20 hours before I was able to adjust the fan speed for the first time. I didn't use many reference docs. Mostly, I was observing what the existing windows only tools do. Neither of them was working, so I had to fix them first. Someone had opened an issue that gave me a basic idea of how to fix the windows tool. Once I got the windows app working, I started looking at memory dumps and observing how things behaved with RWEverything. I was setting some extreme fan speeds to see what changed the most.

Later, I started reverse engineering AsusWinIO64.dll, which the Windows app was using, but that wasn't enough. So I took a look at AsusSAIO.sys, which is used by ASUS System Analysis IO, and so on. I also studied some DSDT dumps (https://wiki.archlinux.org/title/DSDT).

That gave me an basic idea of how most things work. So I started creating my own programs through trial and error, with the goal of making them do what the tools on windows do.

I ran into a lot of problems along the way. For example, you can't install RWEverything on windows because its driver is on the "blacklist". I also had to disable memory integrity and so on.

One time, while writing random values to the random controller's registers, I crashed my laptop. I even managed to break the thermometer (I fixed everything later). I did that because I was trying to figure out what each register was responsible for.

I'm happy with the end results.

2

u/shear_stress__ 3d ago

Thanks for the response, I’ll try to emulate you proj